BLOGTIMES
2017/06/10

EdgeRouter X で OpenVPN を使った Site-to-Site VPN を構築してみた

  edgeos  openvpn  networking 
このエントリーをはてなブックマークに追加

Ubiquiti Networks Edgerouter ER-X(日本国内)

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

ちょっと手こずりましたが、ネットワーキングの基本を理解していればそれほど難しくはないと思います。
自分の環境に応じて、発呼→着信を入れ替えたり、フィルタの方向を逆にしたりなどいろいろと応用が利くと思います。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9397
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン