アイスタイル
アドベントカレンダー2017

クリスマスまで後1週間!…ん?
でも一番盛り上がるのって24日夜だよね?恋人たちの聖夜って24日だよね??
…とまあなにはともあれ、聖(性)夜も近い今日この頃、
今日は愛を届ける会社アイスタイルよりインフラの女神私は昭和生まれ!貴方だけに危険な橋は渡らせない系インフラエンジニアがSRXについて語ります。
タイトルから卑猥ななにかを想像したあなた、心が汚れてますよ!

それではアイスタイル Advent Calender 2017 18日目はっじまっるよお~!

0.はじめに

本記事はSSG140からSRX340へマイグレーションするに辺り、詰んだ難しかった部分をまとめた記事でございます。
何故上記作業を実施することになったか、そのきっかけはFWリプレイス作業です。
弊社の社内FWはSSGを使用しておったのですが、リプレイスに伴い、紆余曲折を経てJuniper SRX 340になりました。

本記事でお話する内容は下記の通りです。

1.about S○X
■機器概要
2.How to S○X
■前提条件
■基本的なマイグレーション
■VR設定
■FBF設定
■運用に便利だったコマンド集
3.Summary of S○X

1.about S○X

■機器概要

ざっくりと機器について説明します。
Juniper社製のFirewall機器の名称です。製品名は”SRX数字”です。数字が大きくなるほど大規模向けって感じです。
もっと詳細を知りたいかた方はぐぐって下さい。

ちなみに、今回我々が導入した機器スペック詳細は以下の通りです

機器名:SRX340 × 2台(HA構成)
Junos ver:15.1X49-D50.3

2.How to S○X

■前提条件

本記事で使用するzoneは以下3つです。
・ Untrust
・ Trust
・ Pikachu

インターフェイスへの設定は下記の通りとします。
※chassis clusterでの冗長構成環境化での設定です。
・ ge-0/0/2(ge-5/0/2)
redundancy-group:1
reth:1
zone:Untrust
・ ge-0/0/3(ge-5/0/3)
redundancy-group:2
reth:2
zone:Trust
・ ge-0/0/4(ge-5/0/4)
redundancy-group:3
reth:3
zone:Pikachu

set chassis cluster reth-count 3
set chassis cluster redundancy-group 1 node 0 priority 129
set chassis cluster redundancy-group 1 node 1 priority 128
set chassis cluster redundancy-group 1 interface-monitor ge-0/0/2 weight 255
set chassis cluster redundancy-group 1 interface-monitor ge-5/0/2 weight 255
set chassis cluster redundancy-group 2 node 0 priority 129
set chassis cluster redundancy-group 2 node 1 priority 128
set chassis cluster redundancy-group 2 interface-monitor ge-0/0/3 weight 255
set chassis cluster redundancy-group 2 interface-monitor ge-5/0/3 weight 255
set chassis cluster redundancy-group 3 node 0 priority 129
set chassis cluster redundancy-group 3 node 1 priority 128
set chassis cluster redundancy-group 3 interface-monitor ge-0/0/4 weight 255
set chassis cluster redundancy-group 3 interface-monitor ge-5/0/4 weight 255

set interfaces ge-0/0/2 gigether-options redundant-parent reth1
set interfaces ge-0/0/3 gigether-options redundant-parent reth2
set interfaces ge-0/0/4 gigether-options redundant-parent reth3
set interfaces ge-5/0/2 gigether-options redundant-parent reth1
set interfaces ge-5/0/3 gigether-options redundant-parent reth2
set interfaces ge-5/0/4 gigether-options redundant-parent reth3

set security zones security-zone Untrust host-inbound-traffic system-services all
set security zones security-zone Untrust host-inbound-traffic protocols all
set security zones security-zone Untrust interfaces reth1.0
set security zones security-zone Trust host-inbound-traffic system-services all
set security zones security-zone Trust host-inbound-traffic protocols all
set security zones security-zone Trust interfaces reth2.0
set security zones security-zone Pikachu host-inbound-traffic system-services all
set security zones security-zone Pikachu host-inbound-traffic protocols all
set security zones security-zone Pikachu interfaces reth3.0

デフォルトのnatルールは以下の通り設定します。
※デフォルトで入ってた気もする…

set security nat source rule-set source-nat-1 from zone Trust
set security nat source rule-set source-nat-1 to zone Untrust
set security nat source rule-set source-nat-1 rule rule-1 match source-address 0.0.0.0/0
set security nat source rule-set source-nat-1 rule rule-1 match destination-address 0.0.0.0/0
set security nat source rule-set source-nat-1 rule rule-1 then source-nat interface

■基本的なマイグレーション

基本的とは言っても、VR設定とFBF設定を除いたその他設定です。主にポリシー設定、serviceプロトコル、アドレスブック等にあたります。
それらのマイグレーションは下記サイトを使用して変換しました。公式です。

https://iam-fed.juniper.net/
アカウント必須なので、使用したい場合は登録してください。

ただ、一気にコンフィグ全部流しても変換してくれないです。ちょっとずつ垂れ流してやる必要があります。
慣れれば楽です。
「既存のSSG設定がかなり複雑」「公式ツールとは言ってもイマイチ信用できない」「アカウント無いし作成するのめんどい」
って方々は、いっこずつ手作業で変換しましょう。

■VR設定

VR(Virtual Route)とは

その名の通りVirtualRoute機能で、ルーティングテーブルを仮想的に分割可能。それぞれ独立したルーティングテーブルを持たせることができます。
「もっと詳細を教えて!」って?Google大先生に教えてもらって下さい。

今回はインターネット回線をいくつかに分けたかった為導入。

設定方法

1.必要なVRの定義
命名規則は zone名-VR とする。

set routing-instances Untrust-VR instance-type virtual-router
set routing-instances Untrust-VR interface reth1.0
set routing-instances Trust-VR instance-type virtual-router
set routing-instances Trust-VR interface reth2.0
set routing-instances Pikachu-VR instance-type virtual-router
set routing-instances Pikachu-VR interface reth3.0

2.rib-group(routing table group)の定義
import-phyを定義し、import-ribに作成したvrを追加する。
※inet.0はデフォルトで定義されているvr

set routing-options rib-groups import-phy import-rib Untrust-VR.inet.0
set routing-options rib-groups import-phy import-rib Trust-VR.inet.0
set routing-options rib-groups import-phy import-rib Pikachu-VR.inet.0

vr側にも設定をする。

set routing-instances Untrust-VR routing-options interface-routes rib-group inet import-phy
set routing-instances Trust-VR routing-options interface-routes rib-group inet import-phy
set routing-instances Pikachu-VR routing-options interface-routes rib-group inet import-phy

3.VR内の設定
static routeを追加する。

set routing-instances Trust-VR routing-options static route 10.10.10.0/24 next-hop 172.17.10.13
set routing-instances Pikachu-VR routing-options static route 0.0.0.0/0 next-hop 192.168.20.10
set routing-instances Pikachu-VR routing-options static route 10.10.20.0/24 next-hop 172.17.20.13

おまけ 苦労話

当初、Trust→Pikachu-VRの通信は一般的なstatic route設定を入れ、next-hopにPikachu-VRを指定して実現しようと試みました。
set routing-options static route 10.10.10.0/24 next-table Pikachu-VR
若しくは
set routing-options static route 10.10.10.0/24 next-hop [Pikachu-VRのIP]
みたいな感じで。
上記の様にset routing-optionsで静的ルートを設定すると、デフォルトのルーティングテーブル inet.0 に登録されるようなので「そのテーブルをTrustとして使おう!」と。

でも疎通出来ない。何度やっても、少しばかりの設定変更を加えて何回トライしても疎通できない。
ということで、TrustもVRとして区切ることにしました。Trust-VR→Pikachu-VRで実現しようと。
でもでも、疎通できない。「もう、なんで!?なんでなの!?」って。

色々なワードでぐぐり辿り着いた答えが、2.の設定です。
これを設定することで、疎通ができた!!やったね!!!
どうして本記事1~3がまとめて書いてあるサイトが見つからなかったのか。なぞ。

■FBF設定

FBFとは

Cisco で言うところののPolicy Based Routingです。
こちらも詳細はGoogle大先生に教えてもらって下さい。

今回の要件で特定のTrust-IP(172.17.0.0/24と192.168.1.0/24)はPikachuから、それ以外のIPはUntrustから出すようにする必要があった為、SRXではFBFを行うように設定をしました。

設定内容

1.FBFの定義
特定のアドレスから通信を受けた時、特定のVRに流す設定をする。
term名はご自由にどうぞ。
※後日、何も知らない人が見た時にわかりやすい名前にするといいです。自分がいつ辞めるか分からないしね。

set firewall family inet filter Inbound term via-Trust-to-Pikachu from source-address 172.17.0.0/24
set firewall family inet filter Inbound term via-Trust-to-Pikachu from source-address 192.168.1.0/24
set firewall family inet filter Inbound term via-Trust-to-Pikachu then routing-instance Pikachu
set firewall family inet filter Inbound term via-Trust-to-Pikachu from source-address 0.0.0.0/0
set firewall family inet filter Inbound term via-Trust-to-Pikachu then routing-instance Untrust

2.ルーティングポリシーの定義
VR間ルーティングの設定をする。
下記設定はTrust-VR → Untrust-VRとTrust-VR → Pikachu-VR

set policy-options prefix-list any 0.0.0.0/0
set policy-options policy-statement from_Trust_to_Untrust term term1 from instance Trust-VR
set policy-options policy-statement from_Trust_to_Untrust term term1 then accept
set policy-options policy-statement from_Trust_to_Pikachu term term1 from instance Trust-VR
set policy-options policy-statement from_Trust_to_Pikachu term term1 then accept

VR側にも適応させる。

set routing-instances Untrus-VR routing-options instance-import from_Trust_to_Untrust
set routing-instances Pikachu-VR routing-options instance-import from_Trust_to_Pikachu

おまけ 苦労話

一番最初にぐぐって出てきたページには、1.の設定しか書いて無かったんです。だから、それだけでいけると思いました。でもその設定だけで疎通はできなかった…
そもそもぐぐって出てきたページを全部鵜呑みにするなよ自分。

その後2.の設定はみつけたけども「VR側にも設定いれなきゃいけない」なんて発想にも至らず…
だって見つけたページに書いてなかったんだもん。

たったこの数行の設定を入れるだけなのに、2週間くらい費やしたような気がします。いや、もっとかも。。
気づいてくれたS本さん、マジリスペクト。

■運用に便利だったコマンド集

  • # commit confirmed [数字]

[数字]の単位は分で、1~入力可能です。指定した分数の間commitしてくれます。[数字]未指定の場合は10分です。
# commit confirmed 3「3分間待ってやる」
その分数が経過すると、commit前の状態に戻ります。また、適応時間内に # commit するとその設定になります。

  • # load [set|merge] terminal

メモ帳とかに事前作成した大量のconfigを一括で流す時に使います。
setとmergeの違いは以下の通りです。
set:setコマンドで作成したconfigを流せます。

例.
set chassis cluster redundancy-group 1 node 0 priority 129
set chassis cluster redundancy-group 1 node 1 priority 128
set chassis cluster redundancy-group 1 interface-monitor ge-0/0/2 weight 255
set chassis cluster redundancy-group 1 interface-monitor ge-5/0/2 weight 255

merge:階層表示の場合はこっちです。

例.
chassis {
    cluster {
        redundancy-group 1 {
            node 0 priority 129;
            node 1 priority 128;
            interface-monitor {
                ge-0/0/0 weight 255;
                ge-5/0/0 weight 255;
            }
        }
    }
}
  • # show | compare

set/deleteコマンドで編集後、直前のcommit設定との比較を表示してくれます。

  • > show configuration | display set

setコマンドで入力した状態でconfigが表示されます。
これ、本当によく使いました。
指定の設定をちょこっと変えたい時、そのラインをコピーしてset部分をdeleteにして一回削除、みたいな。

  • > show configuration | [find|match] [文字列]

指定した[文字列]でconfig内を検索してくれます。
findとmatchの違いは以下の通りです。
find:いわゆる前頭一致
match:[文字列]が含まれる全てを対象

3.Summary of S○X

ぶっちゃけ、SRXに対してはなんの思い入れもありません。
が、このリプレイス作業に関しては思うことが色々ありすぎます。
なので、Summary of S○Xとしましたが自分の思いを書きます。

こうやって1つの記事に設定をまとめてみると、なんてことなかったような気もしちゃうのですが…
この作業、本当に本当に大変でした。辛いことのが多かった気がします。
「これでいける!」とcommitして、「いざ接続確認!」とping疎通してみると繋がらない。
ぐぐっても答えが見つからない、何が悪いのか分からない。
何回も何回もこれの繰り返しで、心がズタボロにやられました。
怒り狂って怒鳴り散らしたりもしたなあ。。
でも、色んなメンバーが協力して頑張ったおかげで、なんとかリプレイス完了しました。
今一度この場をお借りして、お礼を言わせて下さい。
本当にありがとうございました。

また、本記事を書くにあたり、協力してくれたS本さん。
ありがとうございます!感謝!

明日のAdvent Calendarは@syossan27さんです!よろしくお願いします。
わくわく。

この記事が、SRXのVR設定やFBF設定で悩んでる人の力になるといいなあ~