🙌

RouterOS Xpass 固定IPアドレス(ひかりクロス)の設定方法

2023/05/06に公開

はじめに

セットアップしたあとにconfigを見ながら記載しているので作業の順番は違うかもしれないが、参考になればと
RouterOSは現状IPv6のfasttrackに対応していない(2023/05/06時点)ためか1Gbpsあたりで頭打ちするので、ひかりクロスでわざわざやる必要はあまりなさそう

環境

  • CCR2004-1G-12S+2XS
    • 7.9 (stable)
  • enひかりクロス with Xpass(DS-Lite) 固定IPオプション付き

Xpass固定IP情報の案内について

以下の情報が案内されるはず

  • IPv4アドレス
  • Tunnel destination アドレス
  • FQDN
  • DDNS ID
  • DDNSパスワード
  • Basic認証ID
  • Basic認証パスワード
  • DDNSアップデート先URL

手順

不要なサービスの停止、サービスへのACLの設定

脆弱性とかが出たときに不用意に悪用されないように、最低限のルールを追加しておく

/ip/service/
set telnet disabled=yes
set ftp disabled=yes
set www disabled=no address=192.168.0.0/16
set ssh disabled=no address=192.168.0.0/16
set www-ssl disabled=yes
set api disabled=yes
set winbox disabled=no address=192.168.0.0/16
set api disabled=yes
set api-ssl disabled=yes

bridgeの追加

sfp-sfpplus1をWANとしてbridge-wanに追加、それ以外のインターフェースをデフォルトで用意されているbridgeに追加する
わざわざbridge-wanを追加しているのは、これをしないとIPIPv6の速度ができないというバグへの対応

/interface bridge
add arp=proxy-arp name=bridge protocol-mode=none
add arp=proxy-arp name=bridge-wan protocol-mode=none
/interface bridge port
add bridge=bridge ingress-filtering=no interface=ether1
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus2
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus3
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus4
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus5
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus6
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus7
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus8
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus9
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus10
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus11
add bridge=bridge ingress-filtering=no interface=sfp-sfpplus12
add bridge=bridge-wan interface=sfp-sfpplus1
add bridge=bridge interface=sfp28-1
add bridge=bridge interface=sfp28-2

インターフェースリストの設定

/interface list
add name=WANv4
add name=WANv6
add include=WANv4,WANv6 name=WAN
add name=LAN
/interface list member
add interface=bridge-wan list=WANv6
add interface=xpass list=WANv4 # これはあとで追加する
add interface=bridge list=LAN

IPv6の設定

accept-router-advertisementsを有効にして、フレッツ網からの広告を受け取れるようにする
ひかりクロスの場合は/56でIPv6アドレスのprefixが広告されるので、pool-prefix-elngth=56としておく

dhcp-clientを設定したあとに受け取ったprefixを確認する

/ipv6 settings
set accept-router-advertisements=yes max-neighbor-entries=8192
/ipv6 dhcp-client
add add-default-route=yes interface=bridge-wan pool-name=flets pool-prefix-length=56 request=prefix use-interface-duid=yes
print

受け取ったIPv6プレフィックスから適当にsfp-sfpplus1にアドレスをアサインしておく

/ipv6 address
add address=<受け取ったIPv6プレフィックス>::1/128 advertise=no interface=sfp-sfpplus1
add address=<受け取ったIPv6プレフィックス>/64 eui-64=yes interface=bridge
/ipv6 dhcp-server
add address-pool=flets interface=bridge name=flet-pd
/ipv6 firewall mangle
add action=change-mss chain=forward new-mss=clamp-to-pmtu passthrough=yes protocol=tcp tcp-flags=syn

IPv6にあまり詳しくないので自信がないが、適当にfilter設定もいれておく
LAN内のサーバがグローバルからアクセスできない程度には設定できているはず

/ipv6 firewall filter
add action=accept chain=forward comment="accept established,related,untracked" connection-state=established,related,untracked
add action=accept chain=input comment="accept established,related,untracked" connection-state=established,related,untracked
add action=drop chain=input comment="drop invalid" connection-state=invalid
add action=accept chain=input comment="accept ICMPv6" protocol=icmpv6
add action=accept chain=input comment="accept UDP traceroute" port=33434-33534 protocol=udp
add action=accept chain=input comment="accept DHCPv6-Client prefix delegation." dst-port=546 protocol=udp src-address=fe80::/10
add action=drop chain=input comment="drop everything else not coming from LAN" in-interface-list=!LAN
add action=drop chain=forward comment="drop invalid" connection-state=invalid
add action=drop chain=forward comment="rfc4890 drop hop-limit=1" hop-limit=equal:1 protocol=icmpv6
add action=accept chain=forward comment="accept ICMPv6" protocol=icmpv6
add action=accept chain=forward comment="accept HIP" protocol=139
add action=accept chain=forward comment="accept WireGuard" dst-port=13231 protocol=udp
add action=drop chain=forward comment="drop everything else not coming from LAN" in-interface-list=WANv6

IPIPv6の設定

enひかりから通知されたTunnel destinationアドレスをremote-addressに設定するだけ

/interface ipipv6
add !keepalive local-address=:: name=xpass remote-address=<Tunnel destination アドレス>

Xpass DDNSアップデートの通知

サーバ証明書の検証に失敗するのでcheck-certificate=noを指定して、DDNSアップデートをリクエストをする

/tool/fetch http-method=get check-certificate=no user=<Basic認証ID> password=<Basic認証パスワード> url="<DDNSアップデート先URL>?d=<DDNS ID>&p=<DDNSパスワード>&a=<受け取ったIPv6プレフィックス>::1&u=<FQDN>" mode=https

IPv4アドレス周りの設定

払い出されたIPv4アドレスをIPIPv6インターフェースにアサインする
また一部のサイト(GitHubなど)にアクセスできないためにclamp-to-pmtuを指定しておく

加えてmasqueradeでxpassからでるときは払い出されたIPアドレスで出るようにする

/ip address
add address=<IPv4アドレス> interface=xpass network=<IPv4アドレス>
/ip firewall mangle
add action=change-mss chain=forward new-mss=clamp-to-pmtu out-interface-list=WAN passthrough=yes protocol=tcp tcp-flags=syn
/ip firewall nat
add action=masquerade chain=srcnat out-interface=xpass to-addresses=<IPv4アドレス>

IPv4の通信はすべてIPIPv6トンネルに向くようにしておく

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

IPv4でも適当にfilterルールを設定する

/ip firewall filter
add action=fasttrack-connection chain=forward comment=fasttrack connection-state=established,related,untracked hw-offload=yes
add action=accept chain=forward comment="accept established,related,untracked" connection-state=established,related,untracked
add action=accept chain=input comment="accept established,related,untracked" connection-state=established,related,untracked
add action=accept chain=input comment="accept from LAN" src-address=192.168.0.0/16
add action=drop chain=forward comment="drop all from WAN not DSTNATed" connection-nat-state=!dstnat connection-state=new in-interface-list=WANv4 log=yes log-prefix="[DROP] "
add action=drop chain=input comment="drop invalid" connection-state=invalid
add action=drop chain=input comment="drop all not coming from LAN" in-interface-list=!LAN log-prefix="[DROP] input not from LAN - "

References

Discussion