Ubiquitiは一部で話題のネットワーク機器ベンダーです。個人的には10年程前にER-Xという低価格ルーターで注目していた会社で低価格高機能、そしてLinux系ルーターOSを採用していることで非常に自由度が高い製品でした。先日、某有名ベンダー機器からのコストダウンを目的にUbiquiti製品で一施設分のネットワークを構築しましたが非常に簡単で使いやすい製品群でした。
ルーター兼コントローラーとしてDreamm Machine Special Edition(UDM-SE)を中心に構築しましたが、WiFi-APや防犯カメラも繋げば認識して配下に入ります。UDM-SEでSSIDとパスフレーズを設定しておけば接続したWiFi-APはそのSSIDで接続可能になります。WiFiカメラはどうやって設定するのかと思えば電源を繋ぐだけでした。WiFi-APの接続情報をbluetoothでやり取りして自動設定されます。管理もGUIで非常にわかりやすい。
そんなスバラシイ製品のわずかにある問題点をツツクのが本稿の趣旨です。
おそらく将来のバージョンでは修正されているでしょうから、この時点のバージョンを示しておきます。
UnifiOS 3.0.13
Network 7.3.83
IPv6使えないの?
UDM-SEにもIPv6の設定はあります。仮組環境での設定ですが、上流はフレッツ光ネクストのHGWです。つまり、DHCPv6-PDで /60 prefixの委譲を受けられる環境です。
設定してみました。DHCPv6でprefixはHGWが配布する/60です。
、、、、委譲されません。
なるほど、WAN側だけでなく、LAN側にも設定が必要のようです。
設定しました。Prefix Delegationを指定し、後はデフォルトです。
、、、、、、委譲されません。
SSHでアクセスして調査
UDM-SEはDebianベースになっていてSSHでログインすることも可能です。スバラシイ
ファイヤーウオールはnftablesですが、iptables-legacyを使っているようなので、iptablesで覗いてみます。いくつかのルールが定義されているので拒否されているかもしれません。
ひとまず、全許可してみます。
$ ip6tables -I INPUT -j ACCEPT
IPv6アドレスがbr0, br2インタフェースに設定できました。つまりフィルタルールに問題がありそうです。
DHCPv6用に547/udp -> 546/udpが許可されています。しかし、tcpdumpでDHCPv6トラフィックを覗いてみるとエフェメラルポートが送信元となっているため、このルールでは通過できないようです。
ファイヤーウオールルールを定義
そこで、設定を追加します。
IPアドレスやポートは Port/IP Groupで設定するようです。
送信元はlink localに限定します。
DHCPv6用にポート546を定義します。
これで、先ほどの全許可ルールを外してもインタフェースにIPv6アドレスが振られ、下流のクライアントもIPv6通信できるようになりました。
ゲストネットワークでIPv6が使えない
しかし、まだ問題がありました。ゲストネットワークのクライアントにはIPv6アドレスが設定されません。これもファイヤーウオールだと思い、先ほど同様に一旦INPUT chainを全許可にしてみましたが、UDM-SEゲストネットワーク側のlink localにもアクセスできません。
どうもiptables以外にもフィルタがあるようです。ebtables で確認しても特にフィルタは無さそうです。念のためfilter以外のテーブルを確認すると、natテーブルにルールがありました。
その中に-p IPv6 -j DROP
こんなルールが、、、、全拒否。。。
一旦これを削除してみましたがまだ足りないようです。再度ip6tablesを確認すると、ゲストネットワークでは53/udpとicmp以外は全拒否でした。icmpv6の間違いでは??
そこで、Guest v6 local に icmpv6 の RS,NS,NA を許可します。
これでゲストネットワークも解決です。
GUIで解決できない設定の追加
ebtablesのルール変更がGUIでどう設定すれば良いのかわかりません。IPv6全拒否だったので逆にIPv6を許可するルールを書いてみましたが、これはip6tablesに設定されebtablesには反映されませんでした。
そこで、systemdを使って設定します。
[Unit]
After=sockets.target network-online.target
[Service]
User=root
ExecStart=/bin/sh -ec '\
/usr/sbin/ebtables -tnat -I PREROUTING -p IPv6 -j ACCEPT; \
/usr/sbin/ebtables -tnat -I POSTROUTING -p IPv6 -j ACCEPT; \
'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
実際に拒否ルールが定義されているのはGUESTIN, GUESTOUT chainですが、UnifiOSの管理下なのでこのルールには手を付けず、その前に許可してしまうようにしました。IPv6を全許可にしましたが、ゲストからdefaultネットワークへのアクセスはiptablesで止められているので問題はなさそうです。
このサービスを有効にしておけば起動時に実行されます。
$ systemctl enable setebtables