8月に引っ越しをした。

旧居では、「賃貸マンションで光ファイバー引き込み(成功) 」で書いたように苦労して光ファイバーを引いてフレッツ光(ネクスト)を開通させたが、新居は光コンセント付きの物件で何の苦労もなくFTTHの人権を手に入れることに成功した。また、フレッツ光クロスの提供エリア内であったため、これを機会にフレッツ光クロスを導入することにした。

プロバイダ

これまでIIJmioひかりを利用していたが、価格やVNE事業者の選択肢の多さ、固定IPアドレスオプションなどの利点からenひかりへ切り替えることにした。

VNEの選択には悩んだが、これまでRouterOS上でtransix (DS-Lite)で比較的安定して運用できていたことから、アルテリアのXpass (DS-Lite)を契約することにした。インターネットから自宅ネットワークにアクセスするときは、IPv6アドレスでアクセスするか、IPv4アドレスを持つVPSを踏み台にアクセスできるような構成にしているため、MAP-Eでポート開放する必要性もないからだ。

前述の通り、外部からアクセスする目的では固定IPv4アドレスは不要であるため、今のところ固定IPv4アドレスオプションは契約していない。どちらかというとNAPTのポートが枯渇する問題が起きた場合の解決策として導入を検討したい。Xpassはそのあたりの仕様が公開されていないようだが、2ヶ月ほど使っていて特に問題は起きていない。

RouterOS 設定

ルータはMikroTik CCR2004-16G-2S+PC (購入した時の記事)。

旧居では、フレッツ光ネクスト ひかり電話の契約なし。つまり、RAでprefix長/64が払い出されるため、WANとLANをブリッジしてIPv6をフレッツ網へ疎通させていた1。フレッツ光クロスでは、ひかり電話の契約有無にかかわらずDHCPv6-PDでprefix長/56が払い出されるため2、この点に関しては以前より素直に設定できるようになった。

要点を抜粋して説明しながら、最後に全文を掲載する。

なお、下記のconfigをかなり参考にさせていただいた。感謝。

GitHub Gist: pandax381/gist:65384ba89b87696f21d0c7e8330171da

インタフェース

sfp-sfpplus1をWANポートとし、それ以外のポートはLAN用のブリッジとして構成する。

/interface bridge add arp=proxy-arp name=bridge protocol-mode=none

/interface bridge port add bridge=bridge interface=sfp-sfpplus2
/interface bridge port add bridge=bridge interface=ether1
/interface bridge port add bridge=bridge interface=ether2
/interface bridge port add bridge=bridge interface=ether3
/interface bridge port add bridge=bridge interface=ether4
/interface bridge port add bridge=bridge interface=ether5
/interface bridge port add bridge=bridge interface=ether6
/interface bridge port add bridge=bridge interface=ether7
/interface bridge port add bridge=bridge interface=ether8
/interface bridge port add bridge=bridge interface=ether9
/interface bridge port add bridge=bridge interface=ether10
/interface bridge port add bridge=bridge interface=ether11
/interface bridge port add bridge=bridge interface=ether12
/interface bridge port add bridge=bridge interface=ether13
/interface bridge port add bridge=bridge interface=ether14
/interface bridge port add bridge=bridge interface=ether15
/interface bridge port add bridge=bridge interface=ether16

DHCPv6-PD Client

まず、クロス網からRAを受信できるようにしておく。

/ipv6 settings set accept-router-advertisements=yes

そして、DHCPv6 clientを構成する。このパラメータが若干わかりにくいのだが、prefix-hint= はクロス側から割り当てられるprefix長を指定、pool-prefix-length=は割り当てられたprefixから生成するIPプールのprefix長を指定する。とりあえずこの例では/60を設定、つまり4bit分のサブネットを提供できるIPプールのprefix長を設定している。委譲するルータが他にないなら気にしなくていいかも。

/ipv6 dhcp-client add add-default-route=yes comment="Flets Cross DHCP-PD" default-route-tables=main interface=sfp-sfpplus1 pool-name=flets-cross pool-prefix-length=60 prefix-hint=::/56 request=prefix use-interface-duid=yes use-peer-dns=no

無事にprefixが取得できたら、各インタフェースにIPv6アドレスを割り当てる。WANには一応固定で振っておく。

/ipv6 address add address={割り当てられたprefix}::1/128 advertise=no interface=sfp-sfpplus1

LAN用のbridgeには、プールから取得したprefixに基づいてIPv6アドレスがSLAACで割り当てられるようにする。

/ipv6 address add from-pool=flets-cross interface=bridge

デフォルト値が省略されて分かりにくいので print detail して確認してみる。

> /ipv6/address/print detail where from-pool=flets-cross
Flags: X - disabled, I - invalid; D - dynamic; G - global, L - link-local; S - slave; d - deprecated
 0   G   address={プールから割り当てられたprefix}::/64 from-pool=flets-cross interface=bridge actual-interface=bridge eui-64=no advertise=yes no-dad=no auto-link-local=yes

RouterOSのドキュメント(IP Addressing - RouterOS - MikroTik Documentation)にも書いてあるが、addressのprefix長が64bitの場合は、自動的に advertise=yes になる。

さらにIPプールの状態も確認してみると、IPプール flets-cross からアドレスが割り当てられていることがわかる。

> /ipv6/pool/used/print detail  
pool=flets-cross prefix={プールから割り当てられたprefix}::/60 owner="Address" info="bridge" 

IPIPv6 Tunnel

XpassのAFTR (Address Family Transition Router)に向けたIPIPv6 tunnelを構成する。

/interface ipipv6 add clamp-tcp-mss=no comment="Xpass (DS-Lite)" dscp=0 !keepalive local-address={割り当てられたprefix}::1 mtu=1460 name=ipipv6-xpass remote-address=dgw.xpass.jp

Firewallのmangleルールに、MSSの書き換えと、DFビット(Don’t Fragment bit)の強制クリアを追加しておく。DFビットクリアはなぜ必要かというと、IPIPv6 tunnelのスループットが劇遅になる問題の回避策としてみんなやっているらしい3。確かに大きく改善される。

/ip firewall mangle add action=change-mss chain=forward comment="change MSS" in-interface=ipipv6-xpass new-mss=clamp-to-pmtu protocol=tcp tcp-flags=syn
/ip firewall mangle add action=clear-df chain=prerouting comment="clear DF bit" in-interface=ipipv6-xpass

あとはIPv4のルートを ipipv6-xpass に向ければOK

/ip route add disabled=no dst-address=0.0.0.0/0 gateway=ipipv6-xpass routing-table=main suppress-hw-offload=no

RA RDNSS & DHCPv6 Server Option

以降はおまけ。キャッシュDNSサーバIPv6アドレスをクライアントに配布できるようにする。

キャッシュDNSサーバにはRouterOSに搭載されたものを用いる前提で、まず適当にユニークローカルアドレス fd00::1 を振っておく。

/ipv6 address add address=fd00::1/128 advertise=no interface=bridge

NDの設定で、RAのRDNSSオプションでDNSサーバアドレスを設定するとともに、RDNSSに非対応なクライアント向けにはDHCPv6を見てもらうようにするためOtherConfigFlagを立てる設定もしておく。

/ipv6 nd set [ find default=yes ] dns=fd00::1 interface=bridge other-configuration=yes

次に、DNSサーバアドレスを配布するDHCPv6オプションを作成し、DHCPv6サーバを構成する。これはいわゆる「RA+ステートレスDHCPv6」という構成。

/ipv6 dhcp-server option add code=23 name=dns-recursive-name-server value="'fd00::1'"
/ipv6 dhcp-server add dhcp-option=dns-recursive-name-server interface=bridge lease-time=1d name=dhcpv6-flets prefix-pool=flets-cross

config全文

執筆時点でstable最新のRouterOS 7.20.2で動作確認済み。

最低限のfirewallのルールなどもひと通り追加したつもり。RouterOS 7.18からサポートされたIPv6のFasttrackも設定してある。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 2025-10-29 00:14:06 by RouterOS 7.20.2
# software id = XXXXX-XXXXX
#
# model = CCR2004-16G-2S+
# serial number = XXXXXXXXXXX
/interface bridge add arp=proxy-arp name=bridge protocol-mode=none
/interface ipipv6 add clamp-tcp-mss=no comment="Xpass (DS-Lite)" dscp=0 !keepalive local-address={割り当てられたprefix}::1 mtu=1460 name=ipipv6-xpass remote-address=dgw.xpass.jp
/interface list add name=WANv4
/interface list add name=WANv6
/interface list add name=LAN
/interface list add include=WANv4,WANv6 name=WAN
/ip pool add name=pool-dhcp ranges=192.168.88.200-192.168.88.254
/ip dhcp-server add address-pool=pool-dhcp interface=bridge lease-time=1h name=dhcp-main
/ipv6 dhcp-server option add code=23 name=dns-recursive-name-server value="'fd00::1'"
/port set 0 name=serial0
/interface bridge port add bridge=bridge interface=sfp-sfpplus2
/interface bridge port add bridge=bridge interface=ether1
/interface bridge port add bridge=bridge interface=ether2
/interface bridge port add bridge=bridge interface=ether3
/interface bridge port add bridge=bridge interface=ether4
/interface bridge port add bridge=bridge interface=ether5
/interface bridge port add bridge=bridge interface=ether6
/interface bridge port add bridge=bridge interface=ether7
/interface bridge port add bridge=bridge interface=ether8
/interface bridge port add bridge=bridge interface=ether9
/interface bridge port add bridge=bridge interface=ether10
/interface bridge port add bridge=bridge interface=ether11
/interface bridge port add bridge=bridge interface=ether12
/interface bridge port add bridge=bridge interface=ether13
/interface bridge port add bridge=bridge interface=ether14
/interface bridge port add bridge=bridge interface=ether15
/interface bridge port add bridge=bridge interface=ether16
/ipv6 settings set accept-router-advertisements=yes
/interface list member add interface=bridge list=LAN
/interface list member add interface=ipipv6-xpass list=WANv4
/interface list member add interface=sfp-sfpplus1 list=WANv6
/ip address add address=192.168.88.1/24 comment=defconf interface=bridge network=192.168.88.0
/ip dhcp-server network add address=192.168.88.0/24 dns-server=192.168.88.1 gateway=192.168.88.1
/ip dns set allow-remote-requests=yes max-concurrent-queries=128 max-concurrent-tcp-sessions=32 servers=2606:4700:4700::1111,2606:4700:4700::1001,1.1.1.1,1.0.0.1
/ip firewall filter add action=fasttrack-connection chain=forward comment="fasttrack tcp hw-offload=yes" connection-state=established,related hw-offload=yes protocol=tcp
/ip firewall filter add action=fasttrack-connection chain=forward comment="fasttrack hw-offload=no" connection-state=established,related hw-offload=no
/ip firewall filter add action=accept chain=forward comment="accept from LAN" in-interface-list=LAN
/ip firewall filter add action=accept chain=forward comment="accept established,related,untracked" connection-state=established,related,untracked in-interface-list=WANv4
/ip firewall filter add action=drop chain=forward comment="drop invalid" connection-state=invalid
/ip firewall filter add action=drop chain=forward comment="drop all from WAN not DSTNATed" connection-nat-state=!dstnat connection-state=new in-interface-list=WANv4
/ip firewall filter add action=accept chain=input comment="accept established,related,untracked" connection-state=established,related,untracked in-interface-list=WANv4
/ip firewall filter add action=accept chain=input comment="accept ICMP" in-interface-list=WANv4 protocol=icmp
/ip firewall filter add action=accept chain=input comment="accept from lo" in-interface=lo
/ip firewall filter add action=drop chain=input comment="drop all not coming from LAN" in-interface-list=!LAN log=yes
/ip firewall mangle add action=change-mss chain=forward comment="change MSS" in-interface=ipipv6-xpass new-mss=clamp-to-pmtu protocol=tcp tcp-flags=syn
/ip firewall mangle add action=clear-df chain=prerouting comment="clear DF bit" in-interface=ipipv6-xpass
/ip route add disabled=no dst-address=0.0.0.0/0 gateway=ipipv6-xpass routing-table=main suppress-hw-offload=no
/ip service set ftp disabled=yes
/ip service set ssh address=192.168.88.0/24
/ip service set telnet disabled=yes
/ip service set www address=192.168.88.0/24
/ip service set winbox disabled=yes
/ip service set api disabled=yes
/ip service set api-ssl disabled=yes
/ipv6 address add from-pool=flets-cross interface=bridge
/ipv6 address add address={割り当てられたprefix}::1/128 advertise=no interface=sfp-sfpplus1
/ipv6 address add address=fd00::1/128 advertise=no interface=bridge
/ipv6 dhcp-client add add-default-route=yes comment="Flets Cross DHCP-PD" default-route-tables=main interface=sfp-sfpplus1 pool-name=flets-cross pool-prefix-length=60 prefix-hint=::/56 request=prefix use-interface-duid=yes use-peer-dns=no
/ipv6 dhcp-server add dhcp-option=dns-recursive-name-server interface=bridge lease-time=1d name=dhcpv6-flets prefix-pool=flets-cross
/ipv6 firewall filter add action=accept chain=input comment="accept ICMPv6" in-interface-list=WANv6 protocol=icmpv6
/ipv6 firewall filter add action=accept chain=input comment="accept DHCPv6-Client prefix delegation" dst-port=546 in-interface-list=WANv6 protocol=udp src-port=547
/ipv6 firewall filter add action=accept chain=input comment="accept established,related,untracked" connection-state=established,related,untracked in-interface-list=WANv6
/ipv6 firewall filter add action=drop chain=input comment="drop all not coming from LAN" in-interface-list=!LAN
/ipv6 firewall filter add action=accept chain=forward comment="accept dstnated from WAN" connection-nat-state=dstnat connection-state=new in-interface-list=WANv6 protocol=tcp
/ipv6 firewall filter add action=fasttrack-connection chain=forward comment=fasttrack connection-state=established,related
/ipv6 firewall filter add action=accept chain=forward comment="accept established,related,untracked" connection-state=established,related,untracked in-interface-list=WANv6
/ipv6 firewall filter add action=drop chain=forward comment="drop invalid" connection-state=invalid
/ipv6 firewall filter add action=drop chain=forward comment="rfc4890 drop hop-limit=1" hop-limit=equal:1 protocol=icmpv6
/ipv6 firewall filter add action=drop chain=forward comment="drop everything else not coming from LAN" in-interface-list=!LAN
/ipv6 nd set [ find default=yes ] dns=fd00::1 interface=bridge other-configuration=yes
/system clock set time-zone-autodetect=no time-zone-name=Asia/Tokyo
/system ntp client set enabled=yes
/system ntp client servers add address=ntp1.v6.mfeed.ad.jp
/system ntp client servers add address=ntp2.v6.mfeed.ad.jp
/system ntp client servers add address=ntp3.v6.mfeed.ad.jp
/system routerboard settings
# Firmware upgraded successfully, please reboot for changes to take effect!
set auto-upgrade=yes enter-setup-on=delete-key

ベンチマーク

iNonius Speed Testの計測結果。

iNonius Speed Test結果

IPv4のスループットは、まだIPIPv6 tunnelの処理がボトルネックな気がするけど、1Gbpsの大台は超えているので及第点としましょう。