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/secret
sudo 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 drop
set firewall name VTUN0_IN description ''
# established/related な通信を許可
set firewall name VTUN0_IN rule 10 action accept
set firewall name VTUN0_IN rule 10 description 'Allow established/related'
set firewall name VTUN0_IN rule 10 log disable
set firewall name VTUN0_IN rule 10 protocol all
set firewall name VTUN0_IN rule 10 state established enable
set firewall name VTUN0_IN rule 10 state invalid disable
set firewall name VTUN0_IN rule 10 state new disable
set firewall name VTUN0_IN rule 10 state related enable
# 信頼するPCからの通信を許可
set firewall name VTUN0_IN rule 20 action accept
set firewall name VTUN0_IN rule 20 description 'Allow from TRUSTED_PC'
set firewall name VTUN0_IN rule 20 log disable
set firewall name VTUN0_IN rule 20 protocol all
set firewall name VTUN0_IN rule 20 source group address-group TRUSTED_PC
# invalid state なパケットを Drop
set firewall name VTUN0_IN rule 30 action drop
set firewall name VTUN0_IN rule 30 description 'Drop invalid state'
set firewall name VTUN0_IN rule 30 log disable
set firewall name VTUN0_IN rule 30 protocol all
set firewall name VTUN0_IN rule 30 state established disable
set firewall name VTUN0_IN rule 30 state invalid enable
set firewall name VTUN0_IN rule 30 state new disable
set firewall name VTUN0_IN rule 30 state related disable
### vtun0 インターフェースの設定(TCP発呼側)
set interfaces openvpn vtun0 firewall in name VTUN0_IN
set interfaces openvpn vtun0 local-address 192.168.111.1
set interfaces openvpn vtun0 remote-address 192.168.111.2
set interfaces openvpn vtun0 mode site-to-site
set interfaces openvpn vtun0 openvpn-option --comp-lzo
set interfaces openvpn vtun0 openvpn-option --float
set interfaces openvpn vtun0 openvpn-option '--ping 10'
set interfaces openvpn vtun0 openvpn-option '--ping-restart 20'
set interfaces openvpn vtun0 openvpn-option --ping-timer-rem
set interfaces openvpn vtun0 openvpn-option --persist-tun
set interfaces openvpn vtun0 openvpn-option --persist-key
set interfaces openvpn vtun0 openvpn-option '--user nobody'
set interfaces openvpn vtun0 openvpn-option '--group nogroup'
set interfaces openvpn vtun0 protocol tcp-active
set interfaces openvpn vtun0 remote-host site02.example.jp
set interfaces openvpn vtun0 remote-port 1194
set 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 accept
set firewall name WAN_LOCAL rule 15 description 'Allow OpenVPN'
set firewall name WAN_LOCAL rule 15 destination port 1194
set firewall name WAN_LOCAL rule 15 log disable
set firewall name WAN_LOCAL rule 15 protocol tcp_udp
### vtun0 インターフェースの設定(TCP受信側)
set interfaces openvpn vtun0 local-address 192.168.111.2
set interfaces openvpn vtun0 remote-address 192.168.111.1
set interfaces openvpn vtun0 local-port 1194
set interfaces openvpn vtun0 mode site-to-site
set interfaces openvpn vtun0 openvpn-option --comp-lzo
set interfaces openvpn vtun0 openvpn-option --float
set interfaces openvpn vtun0 openvpn-option '--ping 10'
set interfaces openvpn vtun0 openvpn-option '--ping-restart 20'
set interfaces openvpn vtun0 openvpn-option --ping-timer-rem
set interfaces openvpn vtun0 openvpn-option --persist-tun
set interfaces openvpn vtun0 openvpn-option --persist-key
set interfaces openvpn vtun0 openvpn-option '--user nobody'
set interfaces openvpn vtun0 openvpn-option '--group nogroup'
set interfaces openvpn vtun0 protocol tcp-passive
set interfaces openvpn vtun0 remote-host site01.example.jp
set interfaces openvpn vtun0 remote-port 1194
set 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 openvpn
show interfaces openvpn detail
show openvpn status site-to-site
ちょっと手こずりましたが、ネットワーキングの基本を理解していればそれほど難しくはないと思います。
自分の環境に応じて、発呼→着信を入れ替えたり、フィルタの方向を逆にしたりなどいろいろと応用が利くと思います。