さくらVPSのCentOS7でIPv6アドレスを取得してVyOSとOpenVPN over IPv6して拠点間通信する
linux 日記 VyOS
Published: 2020-01-28

やりたいこと

VPSから自宅にあるVyOSの配下にあるホストへOpenVPN越しの静的ルーティングを設定したい。

環境

  • さくらVPS(VPNサーバ)
    • 1Gプラン(東京リージョン)
    • IPアドレスはv4、v6ともに固定
    • CAなどは設定済み
  • VyOS 1.3-rolling(VPNクライアント)
    • J:COM NET 光 1Gコース on auひかり
    • IPアドレスはv4、v6ともに半固定

下準備

既にIPv4でOpenVPNサーバを立ち上げているものとする。

公式のドキュメントに従ってVPSにIPv6アドレスを取得させる。

VPNサーバと接続

VyOSは標準でOpenVPNクライアントが使えるのでconfigureモードから設定する。

証明書などは scp なりでVyOSの /config/auth/ 配下に置く。

configure

edit interface openvpn vtun0

set mode client
set protocol tcp-active
set remote-host <VPNのIPv6アドレス>
set remote-port 1194
set tls ca-cert-file /config/auth/ovpn/ca.crt
set tls cert-file /config/auth/ovpn/vyos-client.crt
set tls key-file /config/auth/ovpn/vyos-client.key
set use-lzo-compression

commit
exit

commit した段階でVPNサーバと繋がっているはず。

VPNインターフェースのIPアドレスにpingを打って返事があれば成功。

静的ルーティングの設定(CentOS)

ここまででゲートウェイ同士の接続はできたので、今度はVPSからVyOSの下に隠れているホストにアクセスしたい。

とりあえずOpenVPNサーバでルーティングの設定をする。

VyOS配下のネットワークアドレスは 192.168.20.0/24 とする。

/etc/openvpn/server.conf に以下を追記。

client-config-dir ccd
route 192.168.20.0 255.255.255.0

続けて /etc/openvpn/ccd/vyos-client に以下を追記。

iroute 192.168.20.0 255.255.255.0

そしてOpenVPNサーバを再起動。もしかしたらVyOS側が再接続してくれないかもしれないので、そうなったらVyOS側でインターフェースを再起動する。

sudo systemctl restart openvpn@server.service

ip route でルーティングが追加されている事を確認する。

$ ip route
<中略>
192.168.20.0/24 via 10.8.0.2 dev tun0

しかし、このまま自宅にあるホスト、例えば 192.168.20.1 なんかにpingを送っても返ってこない。なぜか。

答え:VyOSは ping を対象のホストに送っているが、肝心の pong にあたるパケットが迷子になっているから……のはず。

静的ルーティングの設定(VyOS)

ざっくりNAPTを設定してあげれば良い。

edit nat source rule 20

set destination address 192.168.20.0/24
set source address 10.8.0.0/24
set translation address masquerade
set outbound-interface eth0

commit
exit

逆からもアクセスできるようにする。NAPTの設定をひっくり返すだけ。

edit nat source rule 30

set destination address 10.8.0.0/24
set source address 192.168.20.0/24
set translation address masquerade
set outbound-interface vtun0

commit
exit

これでお互いにpingが通るようになっている。

$ ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1) 56(84) bytes of data.
64 bytes from 192.168.20.1: icmp_seq=1 ttl=63 time=4.28 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=63 time=4.38 ms
64 bytes from 192.168.20.1: icmp_seq=3 ttl=63 time=4.15 ms
64 bytes from 192.168.20.1: icmp_seq=4 ttl=63 time=4.39 ms
^C
--- 192.168.20.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 4.153/4.303/4.390/0.116 ms
$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=4.50 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=4.28 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=4.20 ms
64 bytes from 10.8.0.1: icmp_seq=4 ttl=64 time=3.78 ms
^C
--- 10.8.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 3.787/4.197/4.504/0.264 ms

できた。

まとめ

これを応用すれば、IPv4(PPPoE)は遅いけどIPv6(IPoE)は速い、しかしv6プラスのようなサービスがないプロバイダでも、なんちゃってDS-Liteのようなものを構築する事ができる。

auひかりのPPPoE網は割と速いので今回はそこまではしなかった。

あとネットワークに関する知識は割とガバガバなのでもっと効率的なやり方があったり、これだとセキュリティ的にまずい的なのがあればTwitterでご指摘頂けると幸いです。