RTX1200とstrongSwanをIPsecトンネルモードでVPN接続する

f:id:tydk27:20210102184032p:plain

概要

昨年11月、CentOS 6がサポート終了となりました。
良い機会なので、長年使ってきたVPSの踏み台サーバをUbuntu 20.04に入れ替えることに。正月で暇だし。
さらについでにVPN周りも一新させて、鍵交換プロトコルをIKEv2に変更したりしました。

AWSとオンプレのVPN接続とかを業務でやっているし余裕だろう、と思っていたらこれで丸一日潰れました。

全体像については、↑の画像をご参照ください。

自宅側

  • WAN側: AAA.com
  • LAN側のIP: 192.168.1.1
  • CIDR: 192.168.1.0/24

VPS

  • WAN側: BBB.com
  • LAN側のIP: 192.168.2.1
  • CIDR: 192.168.2.0/24

RTX1200

Web GUIからIKEv2の設定はできない*1ようです。

tunnel select 1
 ipsec tunnel 1
  ipsec sa policy 1 1 esp aes256-cbc sha256-hmac
  ipsec ike version 1 2
  ipsec ike always-on 1 on
  ipsec ike encryption 1 aes256-cbc
  ipsec ike group 1 modp2048
  ipsec ike hash 1 sha256
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on rfc4306
  ipsec ike local name 1 192.168.1.1 ipv4-addr
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 text PRE_SHARED_KEY
  ipsec ike remote address 1 BBB.com
  ipsec ike remote name 1 192.168.2.1 ipv4-addr
  ipsec auto refresh 1 on

IKEv2ではipsec ike (local|remote) nameの設定が必須。
それ以外に関しては、基本はヤマハさんが良い感じにやってくれます。
例えば、キープアライブに関しても勝手に対応してくれるっぽい。

IKEv2 で対応していない方式 ( 書式 ) が設定されている場合は、代替方式として RFC4306 で動作する

http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/ipsec_ike_keepalive_use.html

strongSwan

LinuxにてIPsecを実装するとなればOpenswanが有名ですが、2021年現在、strongSwanのほうが元気あるようです。

github.com

github.com

基本的な操作は、swanctlを使うことになります。
strongSwanのIKEデーモンcharonを制御するVICIと呼ばれる独自インターフェースの実装です。

$ sudo swanctl --version
strongSwan swanctl 5.8.2

swanctlで操作する以上、これまで使っていたipsec.confは使えないもよう。
なので/etc/swanctl/conf.d/rtx1200.confというようなファイルを作成することにしました。
swanctl.confへの移行はわかりにくい公式ドキュメントを参考に頑張る。

wiki.strongswan.org

とりあえず必要最小限の設定を。

connections {
    gw-gw {
        version = 2
        local_addrs = BBB.com
        remote_addrs = AAA.com
        proposals = aes256-sha256-modp2048,default
        local {
            auth = psk
            id = 192.168.2.1
        }
        remote {
            id = 192.168.1.1
            auth = psk
        }
        children {
            net-net {
                esp_proposals = aes256-sha256-modp2048,default
                local_ts = 192.168.2.0/24
                remote_ts = 192.168.1.0/24
                mode = tunnel
                start_action = start
                close_action = start
            }
        }
    }
}
secrets {
    ike-1 {
        secret = "PRE_SHARED_KEY"
    }
}

接続の開始

# strongswanを起動
$ sudo systemctl start strongswan-starter.service
# サービス自動起動
$ sudo systemctl enable strongswan-starter.service

# IKE_SA・CHILD_SAを表示
$ sudo swanctl -l

start_action = startにしているので、strongswan起動と同時にSAが作成されます。

その他

正直なところ、奥が深すぎて理解に苦しみました。特にIKE、つらい。
自分でVPN構築するのは本当に大変だなあと。いや、AWSのSite-to-Site VPNが楽すぎるだけか。

IKEv2についてはRFC 5996に全て書いてあるので、本気で困ったらいつか読もうと思う。

tools.ietf.org

素晴らしすぎるスライドも。すごく勉強になりました、神に感謝。

www.slideshare.net

*1:最新ファームウェア(Rev.10.01.78)でも未対応