DTIのserversman VPSをx86_64化してIPv6がいくらか動くようになったのでOpenVPNサーバーにしてみた。
前提
- OpenVZのVPSゲスト、CentOS6.x + OpenVPN 2.3.x
- dev venet0:0 にNative IPv6が1つ(/128)だけ割り当て済み。可能ならこのルートを使う。
- He.netのIPv6トンネルから/64の割り当てを受けてOpenVPNのクライアントへ割り当てる。
- dev tun0 をOpenVPN tun-ipv6 で作成
- dev tb をユーザースペーストンネル tb_tun で作成。
トンネルとルートの作成
まずOpenVZ上ではカーネルもジュールを導入できないので、sitトンネルを使えない。 トンネルパケットをユーザースペースで処理するtb_tunがあるのでサービスとして起動する。 http://code.google.com/p/tb-tun/
setsid tb_userspace tb {{tunnel_server}} any sit > /var/log/tunnel.log 2>&1 &
tbにIPv6アドレスを割り当て。
ifconfig tb up ifconfig tb inet6 add {{tunnel_client_ipv6}}
venetをデフォルトにするためmetricを増やして追加しておく。
ip -f inet6 route add default metric 10 dev tb
他のOpenVZマネージャ(SolusVM)ではIPv6割り当てが無いのにデフォルトルートが設定されている。その場合削除しておく。
ip -f inet6 route del default metric 1 dev venet0
iptablesで-p 41のINPUT/OUTPUTを通しておく事を忘れずに。
iptables -A INPUT -p 41 -s {{tunnel_server}} -j ACCEPT
ここまででトンネルIPv6は到達可能になった。
トンネル-VPN間のルーティング
IPv6ルーティングを有効化
net.ipv6.conf.all.forwarding = 1
He.netを経由させるRoutedなソース範囲に対してルール付きのテーブルを作成、デフォルトルートに指定
ip -f inet6 rule add src {{tunnel_routed}} table 10 ip -f inet6 route add default metric 1 dev tb table 10
ip6tablesのFORWARDを許可
ip6tables -A FORWARD -i tun0 -s {{tunnel_routed}} -j ACCEPT ip6tables -A FORWARD -i tb -d {{tunnel_routed}} -j ACCEPT
ServersMan@VPSはopenvzカーネルが古すぎてip6tablesのconntrackが機能していない。 常用するならもっとまともなフィルタルールが必要。
OpenVPN側
routedなIPv6を割り当てる。クライアントにはデフォルトルートとしてpushする。
server-ipv6 {{tunnel_routed}} push "route-ipv6 ::/0"
残念ながら、openvpn 2.3.6ではまだIPv6 DNSサーバーアドレスをpushすることができない。 そのためAAAA filteringされていないHe.net提供のIPv4 DNSサーバーを指定するか、クライアント側で上書きしてもらう必要がある。
ひとまずこれでnativeのIPv6を生かしたままIPv6 over OpenVPNが出来た。