EdgeRouter X でリモートメンテナンスを行うための Site-to-Site VPN を構築してみたのでメモ。
本当はハードウェアオフロードが効くIPSec を使いたかったのですが、ネットワーク構成がちょっと特殊で UDP がうまく通らない環境だったので、泣く泣くOpenVPN しかも TCP を使うというちょっと特殊な設定をする羽目になりました。UDP の場合だと OpenVPN の設定は対称にできるのですが、今回は TCP なので一方が発呼側(tcp-active)、もう一方は着信側(tcp-passive)に設定する必要があります。
通常、Site-to-Site VPN の場合には双方向に通信が可能になりますが、今回はメンテナンスのための構成なので、原則として site01 → site02 の方向(とその戻りパケット)にしか通信を許さないようにフィルタ( VTUN0_IN )を設定してあります。例えば自分の家から実家にはアクセスできますが、実家から自分の家には入ってこられないようなイメージになります。このフィルタはどちら側にも設定出来ますが、信頼できる側に設定するのが筋なので、今回は site01 側に設定してあります。
まとめるとこんな感じでしょうか。
- site01:
- OpenVPN 発信側(tcp-active)
- メンテナンスをする側(site02 側にアクセスできる)
- LANのアドレスは 192.168.100.0/24
- vtun0 のアドレス 192.168.111.1(このアドレスは他と重複しなければ何でも良い)
- site02:
- OpenVPN 着信側(tcp-passive)
- メンテナンスをされる側(site01側には原則としてアクセスできない)
- LANのアドレスは 192.168.200.0/24
- vtun0 のアドレス 192.168.111.2(このアドレスは他と重複しなければ何でも良い)
例のごとく、以下のサイトに大変お世話になりながら設定しました。
以下、具体的な設定になります。
† OpenVPN のキーを生成
まず、認証に使う RSA キーを生成しておきます。
この鍵は双方で同じ物を使う必要がある(shared-secret)ので、コピーしてパーミッションを調整しておきます。
generate vpn openvpn-key /config/auth/secretsudo cat /config/auth/secret # ここで表示されたキーを対向の EdgeRouterX に書き込みsudo chmod 600 /config/auth/secret
† site01(発呼側)の設定
site02.example.jp については、自分の環境に合わせて読み替えてください。
IP アドレスを直に書いてもいいですし、DDNS 等を使って FQDN を使うこともできます。
あとは configure コマンドで設定モードに入って以下のような設定を流し込みます。
### OpenVPN用アドレスグループ設定# 信頼するPCのアドレスグループ(TRUSTED_PC)を定義# ここで定義したIPのみがトンネルを越えられるset firewall group address-group TRUSTED_PC description 'Trusted PC Address'set firewall group address-group TRUSTED_PC address 192.16.100.0/24# このように対向側の IP を設定すれば 192.168.200.200 は site01 側にアクセスできますset firewall group address-group TRUSTED_PC address 192.168.200.200### OpenVPN用 F/W設定# vtun0用F/W設定set firewall name VTUN0_IN default-action dropset firewall name VTUN0_IN description ''# established/related な通信を許可set firewall name VTUN0_IN rule 10 action acceptset firewall name VTUN0_IN rule 10 description 'Allow established/related'set firewall name VTUN0_IN rule 10 log disableset firewall name VTUN0_IN rule 10 protocol allset firewall name VTUN0_IN rule 10 state established enableset firewall name VTUN0_IN rule 10 state invalid disableset firewall name VTUN0_IN rule 10 state new disableset firewall name VTUN0_IN rule 10 state related enable# 信頼するPCからの通信を許可set firewall name VTUN0_IN rule 20 action acceptset firewall name VTUN0_IN rule 20 description 'Allow from TRUSTED_PC'set firewall name VTUN0_IN rule 20 log disableset firewall name VTUN0_IN rule 20 protocol allset firewall name VTUN0_IN rule 20 source group address-group TRUSTED_PC# invalid state なパケットを Dropset firewall name VTUN0_IN rule 30 action dropset firewall name VTUN0_IN rule 30 description 'Drop invalid state'set firewall name VTUN0_IN rule 30 log disableset firewall name VTUN0_IN rule 30 protocol allset firewall name VTUN0_IN rule 30 state established disableset firewall name VTUN0_IN rule 30 state invalid enableset firewall name VTUN0_IN rule 30 state new disableset firewall name VTUN0_IN rule 30 state related disable### vtun0 インターフェースの設定(TCP発呼側)set interfaces openvpn vtun0 firewall in name VTUN0_INset interfaces openvpn vtun0 local-address 192.168.111.1set interfaces openvpn vtun0 remote-address 192.168.111.2set interfaces openvpn vtun0 mode site-to-siteset interfaces openvpn vtun0 openvpn-option --comp-lzoset interfaces openvpn vtun0 openvpn-option --floatset interfaces openvpn vtun0 openvpn-option '--ping 10'set interfaces openvpn vtun0 openvpn-option '--ping-restart 20'set interfaces openvpn vtun0 openvpn-option --ping-timer-remset interfaces openvpn vtun0 openvpn-option --persist-tunset interfaces openvpn vtun0 openvpn-option --persist-keyset interfaces openvpn vtun0 openvpn-option '--user nobody'set interfaces openvpn vtun0 openvpn-option '--group nogroup'set interfaces openvpn vtun0 protocol tcp-activeset interfaces openvpn vtun0 remote-host site02.example.jpset interfaces openvpn vtun0 remote-port 1194set interfaces openvpn vtun0 shared-secret-key-file /config/auth/secret### ルーティングテーブルに対向のアドレスを追加set protocols static interface-route 192.16.200.0/24 next-hop-interface vtun0
† site02(着信側)の設定
site01 と同様に site01.example.jp については、自分の環境に合わせて読み替えてください。
configure コマンドで設定モードに入って以下のような設定を流し込みます。
### WAN_LOCAL用F/W設定# LOCAL(ルータ)に対してOpenVPN の通信を許可# (ルール番号はデフォルトのAllow established/relatedとDrop invalid stateの間になるように注意)set firewall name WAN_LOCAL rule 15 action acceptset firewall name WAN_LOCAL rule 15 description 'Allow OpenVPN'set firewall name WAN_LOCAL rule 15 destination port 1194set firewall name WAN_LOCAL rule 15 log disableset firewall name WAN_LOCAL rule 15 protocol tcp_udp### vtun0 インターフェースの設定(TCP受信側)set interfaces openvpn vtun0 local-address 192.168.111.2set interfaces openvpn vtun0 remote-address 192.168.111.1set interfaces openvpn vtun0 local-port 1194set interfaces openvpn vtun0 mode site-to-siteset interfaces openvpn vtun0 openvpn-option --comp-lzoset interfaces openvpn vtun0 openvpn-option --floatset interfaces openvpn vtun0 openvpn-option '--ping 10'set interfaces openvpn vtun0 openvpn-option '--ping-restart 20'set interfaces openvpn vtun0 openvpn-option --ping-timer-remset interfaces openvpn vtun0 openvpn-option --persist-tunset interfaces openvpn vtun0 openvpn-option --persist-keyset interfaces openvpn vtun0 openvpn-option '--user nobody'set interfaces openvpn vtun0 openvpn-option '--group nogroup'set interfaces openvpn vtun0 protocol tcp-passiveset interfaces openvpn vtun0 remote-host site01.example.jpset interfaces openvpn vtun0 remote-port 1194set interfaces openvpn vtun0 shared-secret-key-file /config/auth/secret### ルーティングテーブルに対向のアドレスを追加set protocols static interface-route 192.168.100.0/24 next-hop-interface vtun0
† OpenVPN のステータス確認
ステータスの確認は以下のコマンドで実行できます。
show interfaces openvpnshow interfaces openvpn detailshow openvpn status site-to-site
ちょっと手こずりましたが、ネットワーキングの基本を理解していればそれほど難しくはないと思います。
自分の環境に応じて、発呼→着信を入れ替えたり、フィルタの方向を逆にしたりなどいろいろと応用が利くと思います。