HGW配下のVyOSルータを介してIPv6通信できるようにする

↓ の続き。
naga-sawa.hatenadiary.org


フレッツ光ネクスト 光でんわ契約の HGW の配下に VyOS ルータを置いて、 IPv6 で通信できるようにする設定。

Internet <--> (WAN)[HGW](LAN) <--> (eth1)[VyOS](eth0.2) <--> [宅内LAN]

この構成で、宅内LAN側にも IPv6 を割り当てるようにして、 Internet と IPv6 で通信できるようにします。
宅内 LAN への IPv6 アドレス配布は SLAAC / RDNSS で実施します。

バージョンなど : VyOS 2026.05.30-0046-rolling


まずは例によって Firewall の設定です。
宅内LAN → Internet の通信にかけるフィルタ。ブラックリスト方式で出て行くと困る通信を止めます。必要に応じて drop ルールを追加してください。

set firewall ipv6 name INSIDE_to_OUTSIDE_v6 default-action 'accept'
set firewall ipv6 name INSIDE_to_OUTSIDE_v6 rule 1 action 'drop'
set firewall ipv6 name INSIDE_to_OUTSIDE_v6 rule 1 description 'DropWinFileShare'
set firewall ipv6 name INSIDE_to_OUTSIDE_v6 rule 1 destination port '135-139,445'
set firewall ipv6 name INSIDE_to_OUTSIDE_v6 rule 1 protocol 'tcp_udp'

続いて Internet → 宅内LAN の通信に欠けるフィルタ。ホワイトリスト方式で確立済みのセッションのみ通してます。(HGW の Firewall がありますが念のため)

set firewall ipv6 name OUTSIDE_to_INSIDE_v6 default-action 'drop'
set firewall ipv6 name OUTSIDE_to_INSIDE_v6 rule 99 action 'accept'
set firewall ipv6 name OUTSIDE_to_INSIDE_v6 rule 99 state 'established'
set firewall ipv6 name OUTSIDE_to_INSIDE_v6 rule 99 state 'related'

宅内LAN用の HOME ゾーン をインタフェース eth0.2 に割り当てて、各ゾーン間のフィルタルールを設定します。

set firewall zone HOME member interface 'eth0.2'

set firewall zone HGW from HOME firewall ipv6-name 'INSIDE_to_OUTSIDE_v6'
set firewall zone VYOS from HOME firewall ipv6-name 'pass-all_v6'
set firewall zone HOME from HGW firewall ipv6-name 'OUTSIDE_to_INSIDE_v6'
set firewall zone HOME from VYOS firewall ipv6-name 'pass-all_v6'


以上で Firewall の設定が終わったので、 eth0.2 にリンクローカルアドレスを割り当てます。(VyOS の DNS フォワードを使用せず、外部 DNS を使用する場合はこの設定はとばしても大丈夫です)

set interfaces ethernet eth0 vif 2 ipv6 address no-default-link-local
set interfaces ethernet eth0 vif 2 address fe80::1/64


続いて DNS 周りの設定。 フォワード先は例として google DNS にしていますので、必要に応じて変更してください。

set service dns forwarding listen-address fe80::1%eth0.2
set service dns forwarding allow-from fe80::/64
set service dns forwarding name-server 2001:4860:4860::8844
set service dns forwarding name-server 2001:4860:4860::8888

DNS の listen-address の設定ですが、リンクローカルアドレスを指定する場合はスコープID (%eth0.2 の部分) を指定しないと DNS フォワーダー(PowerDNS)がエラーを出して起動しませんのでご注意ください。 set 時も commit 時もエラーが出ず、裏でひっそりと PowerDNS が落ちます。 ( pdns_recursor cannot bind IPv6 link local address · Issue #8335 · PowerDNS/pdns · GitHub )


HGW からの DHCPv6-PD の受け取り周りの設定。 HGW はフレッツ側から DHCPv6-PD /56 (or /48)のアドレスレンジを受けているので、そこから VyOS に /60 を割り振らせます。 /60 なので /64 との差、 16 サブネットを VyOS 配下に作成可能です。
SLA-ID は VLAN ID と合わせておくと管理しよいです。 eth0.2 には prefix::1 を割り当ててます。

set interfaces ethernet eth1 dhcpv6-options pd 0 length 60
set interfaces ethernet eth1 dhcpv6-options pd 0 interface eth0.2 sla-id 2
set interfaces ethernet eth1 dhcpv6-options pd 0 interface eth0.2 address 1


最後に eth0.2 での RA: Router Advertisement を有効にします。
RDNSS は上で設定したように VyOS の DNS フォワーダー を fe80::1 で指定しています。外部 DNS などを使う場合は必要に応じて変更してください。
アドレスの有効期間は短めにしています。

set service router-advert interface eth0.2 name-server fe80::1
set service router-advert interface eth0.2 name-server-lifetime 600
set service router-advert interface eth0.2 prefix ::/64 preferred-lifetime 3600
set service router-advert interface eth0.2 prefix ::/64 valid-lifetime 3600
set service router-advert interface eth0.2 default-lifetime 600

これで宅内LAN 側にも IPv6 が割り振られ、 Internet と IPv6 で疎通するようになります。
IIJmioのサイトなどを開くと IPv6 で通信しているインジケータが出るので確認できます。


IPv6 アドレスの配布を止めたい場合は以下のコマンドを入れて RA を止めます。(commit してください)

set service router-advert interface eth0.2 no-send-advert

余談

set interfaces ethernet eth1 dhcpv6-options pd 0

の pd 0 の必要性と意味がよく分からないのです。

a unique identifier for the DHCPv6-PD request.

だそうですが。。。

HGW配下のVyOSルータでPPPoEが切れたらIPoEに切り替える設定

HGW 配下の VyOS ルータで、PPPoE が切れたら IPoE での通信に切り替わるようにする設定。
HGW に IPoE の設定が投入済みなことが前提 (v6プラス MAP-E 想定)。

Internet <--> (WAN)[HGW](192.168.1.1) <--> (192.168.1.2)[VyOS](192.168.xx.1) <--> [宅内LAN]

という一般的?な構成を想定。

以下の設定を追加してください。

set protocols static route 0.0.0.0/0 next-hop 192.168.1.1 distance 20

distance 20 を付けて優先度を下げてるだけ。
PPPoE が生きている場合はそちらに流れて、切れると next-hop 192.168.1.1 が効いて IPoE 側に流れるようになります。

PPPoE + NAT で外->中を通している場合、IPoE が効いている間は外->中への接続は通りません。
PPPoE が落ちた場合の非常通信用と思ってください。

HGW配下のVyOSルータでIPv6アドレスを取得する

フレッツ光ネクスト 光でんわ契約の HGW の配下に VyOS ルータを置いて、その VyOS ルータに IPv6 をしゃべらせる設定。

Internet <--> (WAN)[HGW](LAN) <--> (eth1)[VyOS](eth0.x) <--> [宅内LAN]

この構成で、 VyOS の eth1 側に IPv6 アドレスが振られるよう設定します。

バージョンなど : VyOS 2026.05.30-0046-rolling


まず最初に Firewall の準備をし、 Internet 側から VyOS に ssh など不必要な接続が生じないようにしておきます(HGW の Firewall がありますが念のため)。
Firewall はゾーンベースFirewallを採用しています。

set firewall ipv6 name HGW_to_VYOS_v6 rule 30 action 'accept'
set firewall ipv6 name HGW_to_VYOS_v6 rule 30 protocol 'ipv6-icmp'
set firewall ipv6 name HGW_to_VYOS_v6 rule 31 action 'accept'
set firewall ipv6 name HGW_to_VYOS_v6 rule 31 description 'DHCPv6'
set firewall ipv6 name HGW_to_VYOS_v6 rule 31 destination port '546'
set firewall ipv6 name HGW_to_VYOS_v6 rule 31 protocol 'udp'
set firewall ipv6 name HGW_to_VYOS_v6 rule 31 source port '547'
set firewall ipv6 name HGW_to_VYOS_v6 rule 99 action 'accept'
set firewall ipv6 name HGW_to_VYOS_v6 rule 99 state 'established'
set firewall ipv6 name HGW_to_VYOS_v6 rule 99 state 'related'
set firewall ipv6 name pass-all_v6 default-action 'accept'

以上の設定で HGW 側からの通信は ICMPv6 と DHCPv6、確立済みの通信のみ疎通するルールを定義します。
VyOS から HGW 側に対してはとりあえず全通しです(本来は必要な遮断設定を入れてください)。

Netfilter ベース Firewall を採用している場合は、 set firewall ipv6 input filter ... を使い同じように ICMPv6 等を通す設定を入れてください。


これらのルールを HGW ゾーン → VYOS ゾーンの通信とその逆方向の通信にそれぞれ適用します。

set firewall zone VYOS from HGW firewall ipv6-name 'HGW_to_VYOS_v6'
set firewall zone HGW from VYOS firewall ipv6-name 'pass-all_v6'

ゾーンとインタフェースの対応は以下の通り。

set firewall zone VYOS local-zone
set firewall zone HGW member interface 'eth1'


Firewall の設定が終われば、 eth1 に IPv6 アドレスを取得する設定を入れます。

set interfaces ethernet eth1 address 'dhcpv6'
set interfaces ethernet eth1 ipv6 address autoconf
set interfaces ethernet eth1 ipv6 adjust-mss 'clamp-mss-to-pmtu'

以上の設定を commit すると、 eth1 に IPv6 アドレスが割り振られ、ping6 等が通るようになります。

$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address                                 MAC                VRF        MTU  S/L    Description
-----------  -----------------------------------------  -----------------  -------  -----  -----  ---------------
eth0         -                                          xx:xx:xx:xx:xx:xx  default   1500  u/u
eth1         192.168.1.2/24                             xx:xx:xx:xx:xx:xx  default   1500  u/u    WAN IPoE
             240b:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64
lo           127.0.0.1/8                                00:00:00:00:00:00  default  65536  u/u
             ::1/128
pppoe0       124.0.0.180/32                             n/a                default   1454  u/u    WAN PPPoE

google の DNS に ping6 を打ってみます。

$ ping6 2001:4860:4860::8888
PING 2001:4860:4860::8888(2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=115 time=15.7 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=115 time=10.2 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=115 time=8.48 ms
^C

続き ↓
naga-sawa.hatenadiary.org

参考にしたサイト

SoftEther on Ubuntu 24 on ProxmoxVE 8.2 の VPN 通信が不安定な場合の一対策

まとめ

SoftEther を動かしている Ubuntu の NIC の segmentation offload が悪さをしている可能性があるので segmentation offload を無効化してみよう。

環境
  • SoftEther 4.43beta
  • Ubuntu 24.04 LTS VM の NIC 2本はそれぞれ Intel E1000 を指定。 ens19 がローカルブリッジ用 NIC。
  • ProxmoxVE 8.2.2
不具合

L2TP/IPSec で VPN 接続した端末で、VPN 側から端末側に大きなデータ(ファイル)をコピーしようとすると速度が出ない(数KB/s) & 失敗する。(SoftEther ネイティブ接続は未検証なので、ネイティブ接続だと影響がない可能性あり)
MTU 周りを疑い、仮想 HUB の拡張オプション AdjustTcpMssValue を下げたりしてみたが効果なし。
Proxmox ホスト側の NIC offload の無効化も効果なし。

対策

VM のローカルブリッジ用 NIC の offloading 具合を確認すると以下の通りで TSO, GSO, GRO が有効になっているのが分かる。

$ sudo ethtool -k ens19 | grep -v fixed
(snip)
tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-mangleid-segmentation: on
generic-segmentation-offload: on
generic-receive-offload: on

これらの offloading が悪さをしている場合があるとのことなので、NIC offloading を無効化する。

$ sudo ethtool -K ens19 tso off gso off gro off
$ sudo ethtool -k ens19 | grep -v fixed
(snip)
tcp-segmentation-offload: off
        tx-tcp-segmentation: off
        tx-tcp-mangleid-segmentation: off
generic-segmentation-offload: off
generic-receive-offload: off

この状態でテストしたところ、ファイルのコピーの不安定さがなくなったので永続化設定をする。
netplan 環境なので永続化設定は次トピの通り。
Ubuntu netplan で NIC offloading を無効にする設定の書き方 - ..たれろぐ..


参考
  • NIC offload の無効化の示唆

forum.softether.org

  • ProxmoxVE 上で SoftEther サーバを立てるときの注意点(仮想NICの種別)

zenn.dev

ac-as.net

  • 仮想 NIC での offload の挙動について

zenn.dev

Ubuntu netplan で NIC offloading を無効にする設定の書き方

色々悪さをする場合のある NIC offloading をUbuntu netplan 環境で無効にする設定の書き方。


例えば TSO (TCP Segmentation Offload), GSO (Generic Segmentation Offload), GRO (Generic Receive Offload) を無効にする場合、テンポラリには ethtool で以下のようにやるかと思います。

$ sudo ethtool -K ens19 tso off gso off gro off


これを恒常的に(再起動時に効かせる)するには /etc/netplan/ 以下にある Netplan の設定ファイル、例えば /etc/netplan/50-cloud-init.yaml の ethernets 以下に次のように項目を追加し、それぞれ false にしてやります。

network:
    ethernets:
        ens19:
            tcp-segmentation-offload: false
            tcp6-segmentation-offload: false
            generic-segmentation-offload: false
            generic-receive-offload: false

設定の反映は以下コマンドを使うか再起動にて。

$ sudo netplan apply


その他の offloading 項目については以下の Netplan ドキュメントを参照してください。 (offload でページ内検索すると設定可能な項目が見つかります)
netplan.readthedocs.io


ubuntu netplan nic offload off でググっても適当なページが見つけられなかったのでメモ。

参考

NIC offloading の解説
ac-as.net

VyOS 1.4 で DNS blocking をやってみる

VyOS 1.1.7 から 1.4 に移行して、DNS 周りが dnsmasq -> PowerDNS に切り替わった影響で、こちらにあるように追加 hosts ファイルにブロックしたいホストを並べてブロックする手が使えなくなりました。

別の手を探したところ、公式フォーラムの以下のポストがありました。
forum.vyos.io

DNS 解決時に lua スクリプトで hook することで同じような DNS blocking ができるとのことです。


公式フォーラムにある方法の通り3つのスクリプトファイル、pdns-adblock-script.lua, pdns-adblock-blocklist.lua, adblock を置いてやればほぼいけるのですが、VyOS 1.4-epa2 では PowerDNS 設定ファイル recursor.conf のディレクトリが異なっていますので /config/scripts/commit/post-hooks.d/adblock スクリプトに修正が必要です。

adblock スクリプトで、

echo "lua-dns-script=/config/scripts/pdns-adblock-script.lua" | sudo tee -a /run/powerdns/recursor.conf

となっている後半の sudo 部のパスを以下のように修正してやっててください。

echo "lua-dns-script=/config/scripts/pdns-adblock-script.lua" | sudo tee -a /run/pdns-recursor/recursor.conf


また、block したいホストは pdns-adblock-blocklist.lua に配列の形で書き並べるので、お好みで変更しましょう。
自分はこちらの 広告除去用ホストファイル を元に置換したり手修正いれたりして作成しました。

最後に設定モードで commit すると adblock スクリプトが実行され、 block 動作が有効になります(commit する変更がない場合は adblock スクリプトを直接実行しても OK です)。

これで block 対象のドメインの DNS 参照が走った際にはドメイン不在扱いになり、無事 block できるようになります。


一点運用上の注意点があって、adblock スクリプトの記述を見れば分かるように、設定を commit するたびに /run/pdns-recursor/recursor.conf の末尾に lua-dns-script=/config/scripts/pdns-adblock-script.lua が追記されていきます。
ファイル容量が増えていくだけで動作上の問題は無いのですが、時々掃除した方がいいかもしれません。


それではよい VyOS ライフを。

2025/4/6 追記

pdns-adblock-blocklist.lua を修正した場合、以下の通り DNS の再起動が必要です。

$ restart dns forwarding

ProxmoxVE VLAN 1 を tagged で VM まで流すには

ProxmoxVE 8.1 にて VLAN1(VID1) を tagged で VM に渡すには、Linux bridge ではなく OVS bridge を使う必要があります。

ProxmoxVE デフォルトの Linux bridge では、 VLAN1 はデフォルト VLAN 扱いになり、自動的に untag されてしまうので、 VM 側に tagged で渡すことができません。

使ってる機材