S○Xについて熱く語る

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

それでは[アイスタイル Advent Calender 2017](https://qiita.com/advent-calendar/2017/istyle) 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設定で悩んでる人の力になるといいなあ～