🌐

【IPv4 over IPv6】VyOS でのDS-Lite (transix)の設定方法【IPIP6】

2023/03/01に公開

この記事で実現できること

VyOSでDS-Lite(IPv4 over IPv6)方式によるIPv4網への接続。
※各クライアントに直接IPv6アドレスをアサインしてのIPv6網への接続は今回対象としない。

環境

  • vyos 1.3.2 LTS
    • 2023年3月現在 Rolling Releaseで提供されている1.4系でも同手順で可能のはず。
    • 1.2以前だと一部コマンドが異なる。
  • eth0
    • LAN側
  • eth1
    • WAN側

IPv6設定

NTTのNGN網からDHCPv6でIPv6アドレスを取得する。
(IPv6アドレスの取得は10分くらいかかったりするので気長に待つ。)

  • VyOS 1.2, 1.3, 1.4共通
configure
set interfaces ethernet eth1 address 'dhcpv6'
set interfaces ethernet eth1 dhcpv6-options parameters-only
set interfaces ethernet eth1 ipv6 address autoconf
set interfaces ethernet eth1 ipv6 disable-forwarding
commit
save

IPv6アドレスが取得できると下記のようになる。
DHCPv6で取得できたIPv6アドレスは後述のIPIP6トンネル設定時に使用するのでメモしておく。

  • VyOS 1.2, 1.3, 1.4共通
# run sh int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.xx.xx/24                  u/u
eth1             2409:xx:xx:xx:xx:xx:xx:842b/64    u/u
lo               127.0.0.1/8                       u/u
                 ::1/128

IPv4 over IPv6(IPIP6)設定

DHCPv6でIPv6アドレスが取得できたら、トンネルインターフェイスを作成する。
remoteはプロバイダ指定の接続先情報を調べて指定する。
もしtransixの場合、下記コマンド結果のIPv6アドレスから1つ選べばOK(2023年3月時点)。
dig @2404:1a8:7f01:b::3 gw.transix.jp aaaa +short
source-addressは上記で取得したDHCPアドレスを指定する。

  • VyOS 1.3以降
set interfaces tunnel tun0 encapsulation 'ipip6'
set interfaces tunnel tun0 multicast 'disable'
set interfaces tunnel tun0 remote '2404:8e00::feed:100'
set interfaces tunnel tun0 source-address '2409:xx:xx:xx:xx:xx:xx:842b'
commit
save
  • VyOS 1.2以前
set interfaces tunnel tun0 encapsulation 'ipip6'
set interfaces tunnel tun0 multicast 'disable'
set interfaces tunnel tun0 remote-ip '2404:8e00::feed:100'
set interfaces tunnel tun0 local-ip '2409:xx:xx:xx:xx:xx:xx:842b'
commit
save

デフォルトゲートウェイ設定

トンネルインターフェースが作成できたらデフォルトゲートウェイに指定して完了。
設定が上手くいっていたらこの時点でIPv4インターネット接続が可能になっているはず。

  • VyOS 1.2, 1.3, 1.4共通
set protocols static interface-route 0.0.0.0/0 next-hop-interface tun0
commit
save

(番外編)トンネルインターフェースのIP設定スクリプトの配置

DHCPv6で取得したIPv6アドレスをコンフィグに埋め込んだがDHCPなので固定IPではない。
OS起動したままであれば途中で変更されることはないがOS再起動などで変更されることもある。
IPが変更された場合はsource-addressを書き換えないとトンネルが正常に張れなくなる。
かといってIP変更が入った時に手動でコンフィグを修正するのは面倒。

postconfig bootup機能でOS起動時にスクリプト実行して自動で書き換えてしまえばいい。

下記コマンドはVyOS上のOperational Modeターミナルにコピペするだけで動作するようにしてあるのでよくわからなければ、そのままコピペでも可。

スクリプト配置

/config/scripts/配下がVyOSのスクリプト置き場なので、そこに配置する。
スクリプト内容は長くないので読めばすぐ分かると思う。
ただ、ネットワークエンジニアだとスクリプトに疎いかもしれないので一応概要を説明すると、

  • DHCPv6で入手した現在のIPv6アドレスの値を取得
  • コンフィグ内のIPv6アドレスと比較
  • 異なっていたら書き換えてconfig保存

というような仕組み。
なお、DHCPv6のアドレス取得に時間のかかる場合があるので、IP取得に失敗した時は10秒ほど待機して再実行するを60回(10*60の約10分間)繰り返すようにしてある。

  • VyOS 1.3以降
sudo cat <<'EOL' >/config/scripts/watch_tun_source-address.script
#!/bin/vbash
if [ "$(id -g -n)" != 'vyattacfg' ] ; then
    exec sg vyattacfg -c "/bin/vbash $(readlink -f $0) $*"
fi

ETH=$1
TUN=$2

source /opt/vyatta/etc/functions/script-template

for i in {60..1}
do
    CURR_IP=$(ip -o -f inet6 addr show dev ${ETH} scope global | awk -F'[ /]*' '{print $4}')
    if [ "${CURR_IP}" != "" ]; then
        CONF_IP=$(run show configuration commands | grep "${TUN} source-address" | awk '{print $6}' | tr -d "'")
        if [ "${CURR_IP}" != "${CONF_IP}" ]; then
            set interfaces tunnel ${TUN} source-address ${CURR_IP}
            commit
            save
        fi
        break
    else
        sleep 10
    fi
done
EOL
sudo chmod +x /config/scripts/watch_tun_source-address.script
  • VyOS 1.2以前
sudo cat <<'EOL' >/config/scripts/watch_tun_source-address.script
#!/bin/vbash
if [ "$(id -g -n)" != 'vyattacfg' ] ; then
    exec sg vyattacfg -c "/bin/vbash $(readlink -f $0) $*"
fi

ETH=$1
TUN=$2

source /opt/vyatta/etc/functions/script-template

for i in {60..1}
do
    CURR_IP=$(ip -o -f inet6 addr show dev ${ETH} scope global | awk -F'[ /]*' '{print $4}')
    if [ "${CURR_IP}" != "" ]; then
        CONF_IP=$(run show configuration commands | grep "${TUN} local-ip" | awk '{print $6}' | tr -d "'")
        if [ "${CURR_IP}" != "${CONF_IP}" ]; then
            set interfaces tunnel ${TUN} local-ip ${CURR_IP}
            commit
            save
        fi
        break
    else
        sleep 10
    fi
done
EOL
sudo chmod +x /config/scripts/watch_tun_source-address.script

OS起動時スクリプトに登録

VyOSは/config/scripts/vyos-postconfig-bootup.scriptファイルに指定されたスクリプトをOS起動時に実行してくれる仕様になっている。
※インターフェイス名eth1 tun0を指定する必要があるので環境に合わせて適宜変更すること。

  • VyOS 1.2, 1.3, 1.4共通
sudo bash -c 'echo "/config/scripts/watch_tun_source-address.script eth1 tun0" >> /config/scripts/vyos-postconfig-bootup.script'

完了

テストしたい場合、Configure Modeに入ってsource-addressを適当なアドレスに書き換えてsaveした後、OS再起動してみてコンフィグが正しいIPに書き換えられていたら成功。

余談

VyOS 1.3以降では、Tunnel設定にsource-address以外にsource-interfaceという設定が増えており、DHCPでIP変動する場合もsource-interfaceで指定しておけばよさそうに見える。
しかし、これは罠でsource-interface指定だとlocal側のIPが空になり正しく動作しなかった。
これがバグなのか意図した仕様なのかは不明だが、VyOS1.2以前から使用していた本スクリプトの実績があるので当面はこちらでよいかなという感想。

Discussion