RTX830とさくらVPSをIPv4 over IPv6 IPsecでつなぐ

コロナ対策でリモートワークの機会が増えて、それまで使っていたWiMAXの回線の遅延にイライラがつのりにつのり、IIJmioひかりのFTTH回線にしました。(フレッツ・光ネクスト ファミリー・スーパーハイスピードタイプ 隼相当)

そしていつかはFTTHにしようと思って買っていたYAMAHAのRTX830が日の目を見る日がやってきました。

今回のネットワーク構成はこんな感じです。絵心は全くありません。

IIJmioの回線はIPoEオプションを申し込んでいます。自宅からのインタネットアクセスは次のようになります。

  • IPv4:DS-Lite(IPv4 over IPv6)でインターネットマルチフィールドのtransixサービスを経由してインターネットに
  • IPv6:NGNのゲートウェイルーター経由してインターネットに

図で示すとこうなります。

IPv4でもフレッツの網終端装置の混雑を避けて通信できる今時の構成です。

PPPoEの接続は外出先からのリモートアクセスアクセス用(L2TP/IPsec)に使用しています。

RTX830でフィルタ型のルーティングを利用して、リモートアクセスのL2TP/IPsecだけをPPPoEでのIPv4を経由するようにしています。configの抜粋は以下のとおり。

# フィルタ型ルーティングの定義
# tunnel 1はDS-LiteのIPIPトンネル pp 1がPPPoE接続
ip route default gateway tunnel 1 gateway pp 1 filter 400000 400001 400002 400003

# PPPoE側に向けたいL2TP/IPsecで使用するプロトコルのフィルタを定義
ip filter 400000 pass * * udp 500 *
ip filter 400001 pass * * esp
ip filter 400002 pass * * udp 4500 *
ip filter 400003 pass * * udp 1701 *

(L2TP/IPsecのリモートアクセスの設定はRTX830のWeb画面からでもできるので割愛)

ここまではよくある構成でググったらよく出てくると思います。今回、設定を試みたのは、自宅のネットワークとさくらVPSで借りてる、このサーバ(CentOS 6.10)をVPNを利用してセキュアにつなぐことです。
幸い(?)、IIJmioひかりでIPoEを申し込んでおり、RTX830にはIPv6のアドレスが半固定で割り当てられています(図中ではXXXX:XXXX::1と表記)。また、さくらVPSは元よりIPv6のアドレスを持っています(同じくZZZZ:ZZZZ::1と表記)。
そこで思いついたのが、CentOSにlibreswanを入れてIPsecでの通信を可能にして、RTX830とIPv4 over IPv6 IPsecができないだろうか?と。

こんな感じに。

わざわざ、IPv4 over IPv6 IPsecにしたのは・・・

「他でやってなさそうなので試してみたかった」

RTX830のIPsecの機能を確認すると、

IPv6対応

IPv6とIPsecの両方の機能を持つファームウェアでは、 IPv6のIPsecを使用することができます。すなわち、IPv6で動作するIKEと、 IPv6の2つの拡張ヘッダ(AH、ESP)に対応します。 コマンドや動作は、基本的にIPv4のIPsecに準じ、 大きな違いはありません。
IPsec機能の仕様

とありできそうな感じです。

あと、rtproの「IPsec 相互接続の手引き」も参考にしました。
で、以下は試行錯誤の結果のまとめです。

CentOSへのlibreswanのインストール・設定手順は次の通りです。

  1. VPSを一旦停止して、プライベートアドレスを割り当てるNIC(eth1)をHUBにつなぐ。を、物理的に行ったかのように操作(日本語がオカシイ)
  2. 具体的には、まずVPSのコントロールパネルでスイッチ作成

    作成したスイッチにVPSのNICをつなぐ。
  3. VPSをブートして、IPアドレスとルーティングを設定
    /etc/sysconfig/network-scripts/ifcfg-eth1

    DEVICE="eth1"
    IPADDR="192.168.zzz.1"
    NETMASK="255.255.255.0"
    ONBOOT="yes"
    TYPE="Ethernet"

    /etc/sysconfig/network-scripts/route-eth1

    192.168.xxx.0/23 via 192.168.zzz.1 dev eth1

    なお、ルーティング先を、192.168.xxx.0/24とせずに/23としたのは、RTX830のWAN(LAN2)側にも通信できるようにするためです。構成図にあるようRTX830のWAN(LAN2)側のネットワークを192.168.yyy.0/24としており、xxxが偶数かつyyy=xxx+1としています。
    RTX830側のネットワークが1セグメントだけで、クラスCなら192.168.xxx.0/24にしてください。

  4. # service network restart でネットワークを再起動
  5. # yum install libreswan でインストール
  6. # service ipsec start でIPsecのサービスを起動
  7. # ipsec verify でエラーチェック
    今回は表示されたエラーをもとに /etc/sysctl.conf の内容を以下の通り書き換え

    net.ipv4.ip_forward = 0 → 1 に変更

    以下の記述を追加

    #ソースルーティングの無効化
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.conf.eth0.accept_redirects = 0
    net.ipv4.conf.eth1.accept_redirects = 0
    net.ipv4.conf.eth2.accept_redirects = 0
    net.ipv4.conf.lo.accept_redirects = 0
    
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.eth0.send_redirects = 0
    net.ipv4.conf.eth1.send_redirects = 0
    net.ipv4.conf.eth2.send_redirects = 0
    net.ipv4.conf.lo.send_redirects = 0
    
    #逆方向パス転送
    net.ipv4.conf.default.rp_filter =0
    net.ipv4.conf.eth0.rp_filter =0
    net.ipv4.conf.eth1.rp_filter =0
    net.ipv4.conf.eth2.rp_filter =0
    net.ipv4.conf.lo.rp_filter =0

    なお、IPv6関係は特に変更していません。(その後、iptables,ip6tablesの設定は見直しました)

  8. IPsecの設定ファイルを作成
    /etc/ipsec.d/vps-rtx830.conf

    conn vps-rtx830
    # ↑
    # 設定名の定義は字下げしない 
    # 設定内容のセクションは、行頭スペースで字下げすること(重要)
    # ↓
     auto=start
     type=tunnel
     aggrmode=no
     authby=secret
     keyexchange=ike
     ike=aes128-sha1;modp1024
     phase2=esp
     phase2alg=aes128-sha1;modp1024
     pfs=no
     ikelifetime=28800s
     keylife=28800s
     compress=no
    
    # keepaliveはDPDを使用
     dpddelay=5
     dpdtimeout=20
     dpdaction=restart
    
    # vps
     left=ZZZZ:ZZZZ::1
     leftsubnet=192.168.zzz.0/24
    
    # rtx830
     right=XXXX:XXXX::1
     rightsubnet=192.168.xxx.0/23 #/23としたのは(略)

    /etc/ipsec.d/vps-rtx830.secrets

    ZZZZ:ZZZZ::1 XXXX:XXXX::1 : PSK "<事前共有鍵>"
  9. # chkconfig ipsec on で次回VPS起動時からIPsecサービスが自動起動するようにする。

HGWのPR-500KIにVPSからの通信を許可する設定を入れます。

その他、HGWは192.168.yyy.2にアドレス変更、DHCPサーバ停止、192.168.xxx.0/24と192.168.zzz.0/24のルーティングを設定しています。

RTX830側の設定は以下の通り(config抜粋)

# HGW PR-500KIの管理画面へのアクセスと、HGWのSIPサーバに
# 接続するためにWAN(LAN2)にIPv4アドレスを設定。
# yyy=xxx+1 かつ、xxxは偶数
ip lan1 address 192.168.xxx.1/24
ip lan2 address 192.168.yyy.1/24
# VPS側からはLAN1・LAN2の2つまとめて 192.168.xxx.0/23 に見える

# VPS側のネットワークへのルーティング設定
# tunnel 1はDS-Liteで使用済みのためtunnel 2とする
ip route 192.168.zzz.0/24 gateway tunnel 2

# VPSのIPv6アドレスからの通信を許可(赤字部分)
ipv6 lan2 secure filter in 101000 101001 101002 102000
ipv6 lan2 secure filter out 101099 dynamic 101080 101081 101082 101083 101084 101085 101098 101099
ipv6 filter 102000 pass ZZZZ:ZZZZ::1 * * * *

# トンネル設定
tunnel select 2
 description tunnel VPS-RTX830
 ipsec tunnel 1
  ipsec sa policy 1 1 esp aes-cbc sha-hmac
  ipsec ike encryption 1 aes-cbc
  ipsec ike group 1 modp1024
  ipsec ike hash 1 sha
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on dpd # keepaliveはDPDを使用
  ipsec ike local address 1 XXXX:XXXX::1
  ipsec ike pre-shared-key 1 text <事前共有鍵>
  ipsec ike remote address 1 ZZZZ:ZZZZ::1
 ip tunnel tcp mss limit auto
 tunnel enable 2

ipsec auto refresh on

でVPNがつながった状態がこれです。

接続先は上から

  • iijmio IPv6 IPoE
  • iijmio IPv4 PPPoE
  • さくらVPS⇔RTX830 IPv4 over IPv6 IPsec
  • iijmio DS-Lite
  • リモートアクセス L2TP/IPsec(IPv4) 2端末

です。

一連のツイートはYAMAHA公式さん(@yamaha_sn)にまとめてもらいました。光栄です。

ちなみに、IPv4 over IPv6 IPsecがどれくらいのスペックでつながったですが、自宅(大阪府内)⇔さくらVPS(大阪)が、

  • Ping値 4~5ms
  • 上り下りとも~90Mbps(さくらVPSの帯域上限は100Mbps)

となりました。Ping値はIPv6で直接でもVPNでも差はありません。