目次
前回のつづき。
ネットワーク設計
自宅のネットワークは自宅サーバー用のパブリックなネットワーク(DMZ)と、プライベートなネットワーク(LAN)の2つがある。現行のルーター (apu2d4) は LAN ポートが3個あったため、eth0 を WAN、eth1 を DMZ、eth2 を LAN にしていたが、HUNSN RJ12 はポートが2個だけなので、eth0 を WAN、eth1 を DMZ+LAN にして、DMZ と LAN は タグ VLAN (IEEE 802.1Q) で論理的にセグメントを分割することにした。eth0 は ONU と接続し、IPoE + PPPoE でインターネットに接続する。IPoE は LAN 用で、DS-lite で IPv4 over IPv6 トンネル接続する。PPPoE は DMZ 用で、プロバイダーから固定IP (IP unnumbered) が割り当てられている。
VLAN ID は DMZ を VID 100、LAN を VID 200 にした。スイッチングハブは NETGEAR GS308E を使用しており、各ポートに以下のような VLAN 設定をする。
+--------+
| ONU |
+---+----+
| IPoE + PPPoE
eth0 +----------+ +---------+
+--------+ | | | | +---------+ +-------+
| | | usada | | inugami | | | | |
| router | | (Web,AP) | | (NAS) | | WLAN AP | | Hub +--- PC, Mac, etc...
| | | | | | | | | |
+--------+ +---+------+ +----+----+ +----+----+ +---+---+
eth1 | | | |
| | | | |
| +---+ +-----------+ | |
| | | | |
+------------+ | | +----------------------+ |
| | | | |
| | | | +--------------------------------+
| | | | |
1 2 3 4 5 6 7 8
+----------------+
| |
| NETGEAR GS308E |
| |
+----------------+
+---------------+----------------+
| |1 2 3 4 5 6 7 8 |
+---------------+----------------+
| VID 100 (DMZ) |o o o |
| 192.168.100.x |T U U |
+---------------+----------------+
| VID 200 (LAN) |o o o o o |
| 192.168.200.x |T U U U U U |
+---------------+----------------+
o = Port VLAN ID Membership
T = Tagged Port
U = Untagged Port
スイッチングハブの VLAN 設定
GS308E の管理画面にログインして「拡張802.1Q VLAN」を有効にする。なおポートベースVLANなど、他にVLAN設定をしている場合、ここで有効にチェックを入れた段階で設定が消去されるので注意してほしい。
VLANメンバーシップと Port VLAN ID を設計に従ってスイッチに VLAN を設定する。ポート1がいわゆるトランクポートであり、すべてのメンバーシップを Tagged ポートとして設定しておく。ルーター側も同様に タグVLAN 設定が出来れば、DMZ と LAN の論理的なセグメント分割ができるはずである。
ルーター (Alpine Linux) の VLAN 設定
依存パッケージのインストール
Alpine Linux に VLAN を設定する前に、依存するパッケージをインストールしておく。VLAN の設定には ifupdown-ng が必要となる。他にも IPoE+DS-lite で必要になる iproute2, tunnel と、PPPoE に必要な ppp, rp-pppoe、ファイアウォールの iptablles, nftables、ルーターの機能として必要な dhcp, unbound もインストールする。
# apk add ifupdown-ng iproute2 tunnel iptables nftables ppp rp-pppoe dhcp unbound
ついでにこのタイミングでタイムゾーンと NTP の設定をしておく。
# setup-timezone
# setup-ntp
DS-lite や PPPoE 接続は対応するカーネルモジュールが必要になるので、/etc/modules に以下を追記する。
ip6_tunnel
pppoe
Linux をルーターとして動作させるには sysctl の設定値 net.ipv4.conf.all.forwarding
を 1 にしておく必要がある。今回は iptables をインストールしたので、/etc/conf.d/iptables の以下の行を yes にすれば自動的に 1 に設定される。
# Enable/disable IPv4 forwarding with the rules
IPFORWARD="yes"
iptables の自動起動も設定しておく。なお iptables の設定内容については割愛する。(nftables への移行はまた今度…)
# rc-update add iptables default
設定を変更したら再起動する前に忘れずに lbu ci
すること。
VLAN インタフェースの作成
Alpine Linux ではネットワーク設定は /etc/network/interfaces で設定する。ifupdown-ng をインストールしていれば、以下の記述で VLAN インタフェースが作成されるはず。なおブート時に warning 出るので間違いがあるかもしれないが、通信に目立った問題は見られなかった。
# ブート時に warning 出るので間違いがあるかも…
# loopback
auto lo
iface lo inet loopback
# eth0
auto eth0
iface eth0 inet manual
# eth1
auto eth1
iface eth1 inet manual
# vlan100@eth1
auto vlan100
iface vlan100 inet static
address 192.168.100.1
netmask 255.255.255.0
gateway 192.168.100.1
vlan-raw-device eth1
# vlan200@eth2
auto vlan200
iface vlan200 inet static
address 192.168.200.1
netmask 255.255.255.0
gateway 192.168.200.1
vlan-raw-device eth1
保存して rc-service networking restart
すると vlan100, vlan200 が作成される。
PPPoE の設定
/etc/ppp/peers/dsl-provider を以下のように作成する。
noipdefault
defaultroute
replacedefaultroute
hide-password
noauth
persist
mtu 1454
mru 1454
plugin /etc/ppp/plugins/rp-pppoe.so eth0
user "[email protected]"
user の行はプロバイダーから指定されたユーザー名を記入する。パスワードは /etc/ppp/chap-secrets に以下のように記入する。
# Secrets for authentication using CHAP
# client server secret IP addresses
"[email protected]" * "secret_password"
/etc/ppp の設定が出来たら、/etc/network/interfaces に以下のような PPPoE 接続用のエントリを追加する。
# ブート時に warning 出るので間違いがあるかも…
# ppp0
auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ip link set eth0 up
provider dsl-provider
lbu ci
して再起動後、ppp0 が以下のようにIPアドレスを取得していれば成功。
router1:~# ip addr show ppp0
8: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UNKNOWN group default qlen 3
link/ppp
inet xxx.xxx.xxx.xxx peer xxx.xxx.xxx.xxx/32 scope global ppp0
valid_lft forever preferred_lft forever
DS-lite 接続の設定
DS-lite 接続は ip -6 tunnel
コマンドで開始することができる。Alpine デフォルトの BusyBox の ip コマンドでは設定できず、iproute2 パッケージの ip コマンドが必要なことに注意。remote 側の 2404:8e00::feed:100 は gw.transix.jp の IPv6 アドレス。local 側は ip addr show eth0
で表示される mngtmpaddr のアドレスを指定する。
# ip -6 tunnel add ip6tnl1 mode ip4ip6 remote 2404:8e00::feed:100 local xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx encaplimit none dev eth0
# ip link set dev ip6tnl1 up
シェルからコマンドで接続した場合、再起動すると切断されてしまうので、/etc/network/if-post-up.d/activate_ip6tnl1
というファイル名で以下のスクリプトを作成し、インタフェースが立ち上がった後に自動的に DS-lite 接続が開始されるようにしておく。スクリプトには chmod +x
で実行権限をつけておく。
#!/bin/sh
echo Activate IPv4 over IPv6 link...
ip -6 tunnel add ip6tnl1 mode ip4ip6 remote 2404:8e00::feed:100 local xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx encaplimit none dev eth0
ip link set dev ip6tnl1 up
lbu ci
して再起動後、以下のように ip6tnl1 という名前でトンネルが作成されていれば成功。
router1:~# ip addr show ip6tnl1
5: ip6tnl1@eth0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1460 qdisc noqueue state UNKNOWN group default qlen 1000
link/tunnel6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx peer 2404:8e00::feed:100 permaddr xxxx:xxxx:xxxx::
inet6 xxxx:xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever
DS-lite + PPPoE 併用時のルーティング設定
自宅ネットワークでは DS-lite 接続の回線を LAN 用、PPPoE 接続の回線を DMZ 用にしているが、インタフェースによってデフォルトルートを変えるには以下のようなテクニックが必要になる。
- ルーターのデフォルトルートを ppp0 (PPPoE) に設定する
- iptables (or nftables) で vlan200 (LAN) から来たパケットに set mark する
- set mark したパケット用のルーティングテーブルを作成し、デフォルトルートを ip6tnl1 (DS-lite) にする
まず set mark によるルーティングテーブル切り替えが機能するように /etc/sysctl.conf に以下を追加する。
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.ip6tnl1.rp_filter = 0
次に、iptables で vlan200 (LAN) から来たパケットに 0x1 のマークをつけるように設定する。
# iptables -t mangle -A PREROUTING ! -d 192.168.0.0/16 -i vlan200 -j MARK --set-mark 0x1
DS-lite 接続の設定で作成した /etc/network/if-post-up.d/activate_ip6tnl1
に、LAN用のルーティングテーブルを作成するコマンドを以下のように追記する。最後に sysctl -w
しているのは、rp_filter の設定が元に戻っていたときがあったので念のため入れた。
# 以下は PPPoE + DS-lite 併用時の設定
echo Setup routing table...
ip route add default dev ip6tnl1 table 100
ip route add 192.168.100.0/24 dev vlan10 table 100
ip rule add from all fwmark 1 table 100 prio 100
sysctl -w net.ipv4.conf.ip6tnl1.rp_filter=0
これで vlan200 から Web にアクセスしたとき、リモートホストが xxx.xxx.xxx.xxx.shared.user.transix.jp になっていれば設定成功。
次回
本当は iptables -> nftables への移行もチャレンジしたかったのだけど、iptables-translate
しただけではうまく行かなかったので宿題になってしまった。unbound, dhcp の設定もまだまとめられていないので、次回はこの辺をブログにしたいと思う。
One Reply to “Alpine Linux でルーター構築 2023 ネットワーク編”