フレッツ光クロス 複数IPv4固定アドレス 「ルーター構築編」

10Gbps対応のフレッツ光クロスにおいて、V6プラスで複数の固定IPv4アドレスを利用する環境を構築する方法を検討します。レンタルルーター、Linux機、家庭用ルーターを組み合わせて試行錯誤した結果を共有します。

ルーター選定

ルーター選定

10Gbps通信に対応するルーターが必要です。市販されている候補として以下が挙げられます:

  • YAMAHA RTX1300

  • FutureNet NXR-610X (LAN側は1Gbps対応)

  • NEC UNIVERGE IX2310

しかし、これらは高額で個人利用には適しません。

  • 家庭用ルーター: 10Gbps対応製品を検討(例: I-O DATA WN-DAX6000XR)。

家庭用ルーターでV6プラスの固定IPに対応した機器は少なく、 I-O DATA WN-DAX6000XR か エレコム WRC-BE94XS-B しかありませんでした。
そのどちらも、複数のIPv4固定には対応しておらず、採用できませんでした。

  • レンタルルーター: ISP提供の基本機能対応ルーター。

複数のIPv4固定には対応しておらず、採用できませんでした。

そこで、以下の柔軟な構築が可能なLinux PC ルーター構成となりました。


事前調査

接続の仕組みは以下の公開情報を参考にしました:

  1. JPIPv6関連資料

  2. YAMAHAルーターの設定例

  3. Ciscoルーター設定例

構成

以下のパターンの構成を試していこうと思います。

Linux ルーターをHGW配下に置く構成

メリット

  • 構成がシンプル。

  • 高性能なルーター機を採用可能。

デメリット

  • 上下通信が同時に10Gbpsに達しにくい。

  • 宅内配線に依存する。

HGWの代わりにLinuxルーターを置く構成

2. LinuxルーターをHGW代わりに使用

メリット

  • 上下通信が独立し、最大性能を発揮可能。

デメリット

  • 電話用設定が複雑。

  • ミニPCが必要でコストとがかさむことと性能が不安。

10Gボートが2つあるミニPCとしては以下のようなものがあります。追加でSFP+モジュールも必要です。


設定例:

接続情報

ISPから提供された情報は以下の通りとします:

  • V4 IPアドレス : 203.0.113.80/29

  • インターフェースID : aa:bb:cc:0000

  • BRアドレス : 2001:db8:2:1::6

  • 再設定ユーザーID : myname

  • 再設定パスワード : mypassword

  • 再設定URL : http://example.ne.jp/

  • CE機器用再設定URL : http://example.ne.jp/update

これを元に設定を進めます。

LinuxルーターをHGW配下に設置

IPv6アドレスが RA によって配布されるのでそれに対応した設定となります。

1. IPIP6トンネルの設定

以下は手動でIPIP6トンネルを作成する手順です。

REMOTE=2001:db8:2:1::6
IPv4ADDR=203.0.113.80
INTERFACE=enp4s0
IFID=aa:bb:cc:0000

MYV6ADDR=$(ip addr show dev $INTERFACE | grep  inet6 | grep -m 1 '/64' | awk '{print $2}')
PREFIX=$(ipcalc $MYV6ADDR | grep Prefix | awk -F' +|/' '{print $2}')
LOCAL=${PREFIX/%?/}$IFID

ip -6 addr add $LOCAL dev $INTERFACE
ip -6 tunnel add mytnl mode ip4ip6 remote $REMOTE local $LOCAL dev $INTERFACE
ip addr add $IPv4ADDR dev mytnl
ip link set dev mytnl up
ip route add default dev mytnl

設定の意味と必要性

  • REMOTE=2001:db8:2:1::6:
    トンネル終端として使用するリモートIPv6アドレス(ISP指定のBRアドレス)。

  • ip -6 addr add $LOCAL dev $INTERFACE:
    トンネル元のローカルIPv6アドレスをインターフェースに追加します。このアドレスは、ISPからRAで受け取るプレフィックスを基に生成されます。

  • ip -6 tunnel add:
    IPIP6トンネルを作成するコマンドです。このトンネルにより、IPv4通信をIPv6でカプセル化して伝送します。

  • ip addr add $IPv4ADDR dev mytnl:
    トンネルインターフェースにIPv4固定アドレスを追加します。これにより、このIPv4アドレスを使った通信が可能になります。今回使用しているV6プラス複数固定IPで配布されるIPv4アドレスは、Unnumbered として扱うことができるので、ネットワークアドレスにあたる先頭のIPv4アドレスも使用可能です。

  • ip route add default dev mytnl:
    トンネルインターフェースをデフォルトゲートウェイとして設定します。これで外部ネットワークへのルートが確立されます。

これで、グローバルIPアドレスがmytnlというインタフェースに付いて、IPv4でインターネットに接続できるようになります。

# ip -4 addr show dev mytnl
655: mytnl@enp4s0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 203.0.113.80/32 scope global mytnl
       valid_lft forever preferred_lft forever
# ping -c 5 8.8.4.4
PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
64 bytes from 8.8.4.4: icmp_seq=1 ttl=59 time=3.81 ms
64 bytes from 8.8.4.4: icmp_seq=2 ttl=59 time=4.09 ms
64 bytes from 8.8.4.4: icmp_seq=3 ttl=59 time=4.34 ms
64 bytes from 8.8.4.4: icmp_seq=4 ttl=59 time=4.24 ms
64 bytes from 8.8.4.4: icmp_seq=5 ttl=59 time=3.99 ms

--- 8.8.4.4 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 3.811/4.092/4.338/0.184 ms

たまに接続できないサイトがあるので、以下のコマンドをおまじない的に実行しておきましょう。

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o mytnl -j TCPMSS --clamp-mss-to-pmtu

配布されたIPv4のアドレス範囲の先頭のネットワークアドレスでも問題なく通信できます。


2. 複数IPv4アドレスの設定

公開サーバー用に複数の固定IPv4アドレスを使用する例です。

ルーター側設定

ip addr add 203.0.113.80/29 brd 203.0.113.87 dev enp4s0

意味と必要性

  • このコマンドでルーター機(Linux)がISPから提供されたIPv4アドレス範囲を認識します。これにより、IPv4アドレスの割り当てと通信が可能になります。(Unnumbered 対応の回線のため、先頭のIPv4アドレスも使用可能)

サーバー用設定

ip addr add 203.0.113.81/29 brd 203.0.113.87 dev enp5s0
ip route add default via 203.0.113.80 brd 203.0.113.87 dev enp5s0

Windowsホストの場合

意味と必要性

  • 203.0.113.81/29: サーバー用に割り当てた固定IPv4アドレス。複数のホストで異なるIPを利用できます。

  • default via 203.0.113.80: サーバーがインターネット通信を行うため、ルーターをデフォルトゲートウェイとして設定します。

3. トラブル防止の設定

一部のサイトに接続できない場合は以下の設定を適用します:

iptables -t mangle -A POSTROUTING -p tcp --tcp-fags SYN,RST SYN -o mytnl -j TCPMSS --clamp-mss-to-pmtu

意味と必要性

  • TCPMSSの調整:
    TCPパケットのMSS(最大セグメントサイズ)を自動的に調整します。これにより、トンネル経由の通信で断片化が発生する問題を防ぎます。

その他、接続できない場合はルーターのファイアウォールの設定などを見直してください。

4. 自動接続スクリプト

手動設定では再起動時にネットワークが切断されてしまいます。この問題を解決するために、自動接続スクリプトを作成しました。NetplanやNetworkdなど、OS標準のツールを試しましたが、IPv6の動的な挙動にうまく対応できなかったため、自作スクリプトで補っています。

なぜOS標準の設定では実現できなかったのか

NetplanにはIPIP6トンネルの設定機能があります。ただ、IPv6アドレスがRA(Router Advertisement)やDHCPv6-PDで動的に変わる環境では、期待した動作をしませんでした。特に以下の点で課題がありました:

  1. 動的IPv6アドレスへの対応不足:
    トンネルの接続元IPv6アドレスがRAを受けるたびに変わる可能性がある場合、Netplanはその変更を検知して設定を再適用する仕組みを持っていません。

  2. トンネル設定の柔軟性の限界:
    特定の条件下で設定をトリガーに動的な処理を実行するような柔軟性は、Netplan単体では難しい状況でした。

これらの理由から、自分で手動設定をベースにスクリプトを作成しました。

対応OS

このスクリプトはNetplanおよびnetworkdを活用しているため、以下のUbuntuバージョンで動作します:

  • Ubuntu 20.04 / 22.04 / 24.04

注意点:
CentOSやRocky LinuxなどのRed Hat系ディストリビューションではNetplanが利用できないため、このスクリプトは動作しません。

スクリプトのインストール手順

  1. スクリプトをダウンロードして展開します:

tar -xvf ipip6-tunnel-0.1.txz
cd ipip6-tunnel
make install

 2. 設定ファイルを編集します: /etc/ipip.conf:

IPV6TOKEN="aa:bb:cc:0000"
REMOTE_IP="2001:db8:2:1::6"
LOCAL_V4IP="203.0.113.80"
INTERFACE="enp4s0"
TUNNEL_NAME="ipip6-tunnel"
LOCAL_V6_FILE="/var/run/local_v6_ip"
ON_PREFIX_CHANGE_CMD=http://example.ne.jp/update?user=myname&pass=mypassword

3. 動作タイミング

IPIP6トンネルの接続は以下のタイミングとなります。

  • /usr/local/bin/setup-ipip6.sh 実行時

  • OS起動時

  • RA受信時

IPIP6トンネル以外のネットワーク設定は netplan を使用して設定してください。

スクリプトの動作概要

このスクリプトでは、RAを受信するたびにIPv6アドレスを動的に取得し、それを元にIPIP6トンネル設定を再構築します。また、手動設定の不便さを解消するために必要な機能だけをまとめたシンプルな設計です。


これで、フレッツ光クロス環境で複数の固定IPv4アドレスを柔軟に運用できます。それぞれの設定がどのように機能し、なぜ必要なのかを理解すれば、他の構成や応用にも応用可能です。

 HGWの代わりにLinuxルーターを設置

IPv6アドレスがDHCPv6-PDによって配布されます。

netplanでは設定しきれなかったので、networkdに設定します。
おそらくUbuntuでは24.04 以降のみで動作します。

自動設定スクリプト

自動設定スクリプトを作成したので、まずはそちらから紹介します。

 1. セットアップ方法

スクリプトをダウンロードして展開します

  1. 展開したディレクトリーに移動して make install を実行します。

  2. 回線の接続情報を /etc/ipip6/ipip6.conf に設定します。

  3. /usr/local/bin/setup-ipip6.sh を実行します。

  4. WANやLANなどのネットワークの設定を行います。

  5. 以下の設定を含むfirewall ruleを設定します。

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o "$TUNNEL_NAME" -j 

以上で設定が完了します。

2. 動作タイミング

OSのネットワーク設定になる、networkdに設定しているので、起動時から動作します。
ネットワークの設定変更をした場合は、
systemctl restart systemd-networkd
を実行します。
IPv6プレフィックスが変更になった際には、自動で設定を修正しnetworkdを再起動します。

設定内容について (手動設定の方法)

自動設定で設定している内容となります。プレフィックスが変更されない限り恒久設定になります。

/etc/systemd/network/60-wan.network

[Match]
Name=INTERFACE_NAME

[Network]
IPv6AcceptRA=yes
DHCP=ipv6
IPForward=ipv6
DHCPPrefixDelegation=yes
Tunnel=TUNNEL_NAME

[DHCPv6]
WithoutRA=solicit
DUIDType=link-layer
IAID=0

[DHCPPrefixDelegation]
UplinkInterface=:self
Token=::IPV6TOKEN
SubnetId=0
Announce=no

DHCPv6-PDにてIPv6アドレスを受け取り、Token=でしていたインタフェースIDでIPv6アドレスを固定しています。

/etc/systemd/network/30-ipip6-tunnel.netdev

[NetDev]
Name=TUNNEL_NAME
Kind=ip6tnl

[Tunnel]
Mode=ipip6
Local=LOCAL_IP
Remote=REMOTE_IP
DiscoverPathMTU=yes
EncapsulationLimit=none

自身のトンネル接続元IPv6アドレスと、接続先のIPv6アドレスにてipip6トンネルを張ったデバイスを作成します。

/etc/systemd/network/25-ipip6-tunnel.network

[Match]
Name=TUNNEL_NAME

[Network]
Address=LOCAL_V4IP/32
IPForward=ipv4

[Route]
Destination=0.0.0.0/0

作成したipip6トンネルデバイスにIPアドレスとデフォルトゲートウェイを設定します。

以上が、DHCPv6-PD環境でのネット接続の設定になります。

以下設定例としてグローバルIPを含むローカル側のネットワーク設定です。

/etc/systemd/network/20-lan.network

[Match]
Name=eth1

[Network]
IPForward=ipv6
IPv6SendRA=yes
DHCPPrefixDelegation=yes
DHCPServer=yes

[Address]
Address=192.168.1.30/24
Address=203.0.113.80/29

[DHCPServer]
ServerAddress=192.168.1.30/24
PoolOffset=100
PoolSize=64
EmitDNS=yes
DNS=1.1.1.1 1.0.0.1

[IPv6SendRA]
EmitDNS=yes
DNS=2606:4700:4700::1001 2606:4700:4700::1111

[DHCPPrefixDelegation]
UplinkInterface=eth0
SubnetId=0
Announce=yes
RouteMetric=255

上記の設定内容は、
・ WAN側のインタフェース : eth0
・ LAN側のインタフェース : eth1
・ LAN側 eth1のグローバルIPアドレス : 203.0.113.80/29 ※IP Unnumbered 可能なネットワークなので、ネットワークアドレスにあたるIPが使用可能  
・ LAN側 eth1のLAN側プライベートIPアドレス : 192.168.1.30/24
・ LAN側からDHCPにはプライベートIPを配布
・ DHCPにて配布するIPv4アドレスの範囲、192.168.1.100~192.168.1.164
・ DHCPにて配布するDNSサーバー:1.1.1.1 1.0.0.1
・ LAN側 eth1のIPv6アドレスは、eth0に設定されたDHCPv6-PDの範囲のアドレスを設定
・ LAN側 eth1 から RAにて IPv6アドレスを配布

ローカルとDMZのインタフェースを分けたい場合は、上記設定の [Address] を分けて2つのインタフェース設定を作成します。

ローカル側でグローバルIPを使用したい機器は、
203.0.113.80/29 の範囲で 自身のIPアドレスを設定し、
デフォルトゲートウェイを 203.0.113.80 とします。

ローカル側でプライベートIPを使用したい機器は、
DHCPにてIPv4アドレスを取得するか、
192.168.1.0/24 の範囲で 自身のIPアドレスを設定し、
デフォルトゲートウェイを 192.168.1.30 とします。

ファイアウォールの設定

ファイアウォールにUFWを使用する例になります。
ipトンネルのインタフェースは `ipip6-tunnel` とします。

PMTUの設定

/etc/ufw/after.rules ファイルの最後に以下の設定をします。
(/etc/ufw/before.rules でも問題なさそうです) 

*mangle
-F
-A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o ipip6-tunnel -j TCPMSS --clamp-mss-to-pmtu

COMMIT

NAPTの設定

LAN側に配布したプライベートIPアドレスからインターネット接続ができるように設定します。

/etc/ufw/before.rules ファイルの最後に以下の設定をします。

*nat
:POSTROUTING ACCEPT [0:0]
-F
-A POSTROUTING -s 192.168.1.0/24 -o ipip6-tunnel -j MASQUERADE

COMMIT

課題

LinuxルーターをHGW配下に配置した場合と比べて、通信速度が極端に遅くなってしまいました。
ダウンロード : 7000Mbps → 2500Mbps
アップロード: → 400Mbps
LinuxルーターのCPU負荷がどのCPUコアも高負荷になっていないので、ネットワーク設定に何か問題があるのかもしれません。(MTUとかでしょうか?) 

いいなと思ったら応援しよう!