VyOSでIPv6 透過型Firewallを設定する

経緯

NTTのひかり電話契約者で本格的にIPv6(IPoE)をしたいと思ったらルーターを入れたいところ。
(普通はIPv6対応ルーターを買ってきてぶら下げれば終了)
しかし自分の使い方では家庭用のルーターでは力不足。
速度が落ちないレベルの業務用を買うと10万クラスになります。
じゃあソフトルーターでどうよって事で以下の結果。
  1. VyOS → DHCP-PD非対応で動作せず
  2. SEIL/x86 → OSの古さでVyOSの半分くらいまでスループットが低下
  3. Linuxで構築 → 管理が面倒すぎて途中で投げる
という訳でIPv6ルーターは諦め。

標準のひかり電話ルーターの問題点

と言うことでひかり電話ルーターのみで運用してみた。
そしたらひかり電話ルーターのファイヤウォールが全然使えない。
アドレス範囲設定が出来るくせに通らないパターンがある(設定エラーは出ない)。

例えば特定のprefix(2001:db9::/64)だけ開放させたい場合。
アドレス範囲を 2001:db9:: ~ 2001:db9:ffff:ffff:ffff:ffff と設定しても何故かパケットが通らない。
調査してみたら 0~7fff:ffff(2147483647)を堺にフィルタルールが無効になる。

あ、なるほど。つまり符号付きintでアドレス範囲をプログラムされてるからダメなのか。せめてエラー出してくれよ

ということで苦情を陳情するも1年くらい音沙汰無し。もともとNGN専用でしか考えてなかったんだろう。そして直す気もなさそう。
逆に言えばこれを何とかすれば色々出来るのでは。

VyOSで透過ファイヤウォール

という訳で透過FWを入れます。
ついでにひかり電話のDHCPv6も止めたりすると内側にDHCPv6サーバーを立てられたりして意外と便利。
普通はあんまりメリットないんでしょうけど、内部にAD DNSなどを使用する場合には有効です。
あとこのFWはIPv6ブリッジ(IPv6パススルー)とは微妙に違ったりします。
(VyOSがiptablesでFWの実装をしてるため、ARPとか止められない)

ついでにDS-Liteも入れて半ルーター的に稼働させる

FWさせつつもDS-Liteとしてのトンネリングもセットでやらせてみました。
これでIPv4も通るわけで、外から見たらルーターっぽく見えます。
実際にはルーティングとかやってないので負荷はかなり軽く、速度も落ちないまま維持出来ています。
速度テストサイトOOKLA-つくば辺りで調査すると以下のような感じ。
  1. ひかり電話ルーターのみ → DL700/UL500
  2. 透過型FW → DL600/UL500
  3. SEIL/x86 → DL300/UL500

設定

以下の様な感じでやっています。ブリッジはin/outの区別がつかないようなのでアドレスで判断。
NGNから降ってくるprefixは'2001:db8::/64'としています。
※ひかり電話ルーター契約では/60で貰えるはずですが、それらはこのFWを通さない前提で考えています。
(DHCPv6-PDするって事は別ルーターぶら下げるのだろうからそっちでFWしようねってイメージ)

ブリッジ

set bridge br0 address '2001:db8::1/64'
set bridge br0 address '192.168.1.1/24'
set ethernet eth0 bridge-group brigde 'br0'
set ethernet eth1 bridge-group brigde 'br0'
set bridge br0 firewall in name 'IPv4FW'
set bridge br0 firewall in ipv6-name 'IPv6FW'
set bridge br0 dhcpv6-options 'parameters-only'
set bridge br0 ipv6 'disable-fowrding'

DS-Lite

set tunnel tun0 encapsulation 'ipip6'
set tunnel tun0 local-ip '2001:db8::1'
set tunnel tun0 remote-ip '2404:8301::feed:100'
set protocols static interface-route 0:0:0:0/0 next-hop-interface tun0 set ethernet tunnnel tun0 firewall in 'DSLite'

FireWall(IPv6)

set firewall ipv6-name IPv6FW default-action 'drop'
set firewall ipv6-name IPv6FW rule 1 action 'accept'
set firewall ipv6-name IPv6FW rule 1 description 'ICMPv6 Enabled'
set firewall ipv6-name IPv6FW rule 1 protocol 'icmpv6'
set firewall ipv6-name IPv6FW rule 10 action 'accept'
set firewall ipv6-name IPv6FW rule 10 description 'DS-Lite Enabled'
set firewall ipv6-name IPv6FW rule 10 protocol 4
set firewall ipv6-name IPv6FW rule 100 action 'accept'
set firewall ipv6-name IPv6FW rule 100 description 'OUT'
set firewall ipv6-name IPv6FW rule 100 source address '2001:db8::-2001:db8::ffff:ffff:ffff:ffff'
set firewall ipv6-name IPv6FW rule 110 action 'accept'
set firewall ipv6-name IPv6FW rule 110 description 'IN'
set firewall ipv6-name IPv6FW rule 110 destination address '2001:db8::-2001:db8:ffff:ffff:ffff:ffff'
set firewall ipv6-name IPv6FW rule 110 state established 'enable'
set firewall ipv6-name IPv6FW rule 110 state related 'enable'

FireWall(IPv4)

本来はIPv4のパケットは止めなくてもいいと思うのですが、ひかり電話ルーターからうるさいパケットが流れてくるので一緒に止めてます。DHCPv4はひかり電話ルーターの方で停止しているのでフィルタリングしていません。
set firewall name IPv4FW default-action 'accept'
set firewall name IPv4FW rule 1 action 'drop'
set firewall name IPv4FW rule 1 description 'UPNP Disabled'
set firewall name IPv4FW rule 1 destination port '1900'
set firewall name IPv4FW rule 1 protocol 'udp'
set firewall name IPv4FW rule 2 action 'drop'
set firewall name IPv4FW rule 2 description 'Broadcast Disabled'
set firewall name IPv4FW rule 2 destination address '192.168.1.255'

FireWall(DS-Lite)

DS-Liteは普通のSPIが働ければいいかなということで極めてテンプレ的に。

set firewall name DSLite default-action 'drop'
set firewall name DSLite rule 1 action 'accept'
set firewall name DSLite rule 1 state established 'enable'
set firewall name DSLite rule 1 state related 'enable'
set firewall name DSLite rule 2 action 'drop'
set firewall name DSLite rule 2 state invalid 'enable'

あとはお好みでDNSやらDHCPやらを載せてあげたら十分かと。

コメント

このブログの人気の投稿

カスタムメイド3D2用プラグインを作りました

VyOS 1.1.1とSoftEther VPN Serverで自宅VPN最速設定

プロバイダをオープンサーキットからIIJへ変更