前置き#
ubuntu serverをルーター化するの続き。
今日は日本酒盛ってません。
前回からの変更点
VPNクライアントをExpressVPNからNordVPNに。
Wireguardサーバーを構築してLAN(192.168.1.0/24)にアクセス可能にした。
(ついでにRustdesk Serverも入れた)
Palworldのゲームサーバーをホスティングしているのでそれ関連の変更。TODO
DDNS
変更点の詳細#
NordVPN関連#
ログインのやり方は家のネットワークを丸ごと VPN にする方法 (Raspberry Pi × NordVPN)が非常に参考になる。
nordvpn set firewall disable # これがないと後で設定するwireguardが遮断される。
nordvpn c
前回追記した/etc/ufw/before.rules
の部分を色々変えてこうなった
-# Allow traffic from LAN to WAN (NAT)
--A ufw-before-forward -i br0 -o enp1s0 -j ACCEPT
--A ufw-before-forward -i enp1s0 -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
+# Allow traffic from LAN to Nordlynx (NAT)
+-A ufw-before-forward -i br0 -o nordlynx -j ACCEPT
+-A ufw-before-forward -i nordlynx -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
*nat
:POSTROUTING ACCEPT [0:0]
--A POSTROUTING -o enp1s0 -j MASQUERADE
+-A POSTROUTING -o nordlynx -j MASQUERADE
COMMIT
Wireguard Server#
sudo ufw allow 51821/udp
/etc/wireguard/home.conf
にコンフィグを書き込む。
[Interface]
PrivateKey = *******************************************
Address = 10.0.21.1/32
ListenPort = 51821
DNS=127.0.0.1
PostUp = iptables -A ufw-before-forward -i %i -o nordlynx -j ACCEPT;iptables -A ufw-before-forward -i nordlynx -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT;iptables -A INPUT -i home -d 192.168.1.0/24 -j ACCEPT
PostDown = iptables -D ufw-before-forward -i %i -o nordlynx -j ACCEPT;iptables -D ufw-before-forward -i nordlynx -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT;iptables -D INPUT -i home -d 192.168.1.0/24 -j ACCEPT
[Peer]
PublicKey = *******************************************
AllowedIPs = 10.0.21.2/32
nordlynxの部分は外向きの通信に使いたいインターフェースにすべし。
expressvpnならtun0とか。
VPN使わないならwanインターフェースの名前にするとか。sudo wg-quick up home
でサーバーが立ち上がる。sudo systemctl enable wg-quick@home
で自動で立ち上がるようにしとこう。
ゲームのサーバーの公開(生ip)#
最近身内でパルワールドをやっているのだがlan外のクライアントに対するレスポンスにnordlynxが使用されてしまって通信が成立しなくて困ってた。
クライアント→ルーター→サーバー→NordVPN→クライアント
という流れができてしまった。
nordvpnのクライアントが接続を開始する際にデフォルトルートがnordlynxになるので全ての外向き通信が吸われてしまっていた。(そりゃそうだ)
nordvpnのcliクライアントにスプリットトンネリングなんてものはないのでルーティングテーブルをいじって解決した。
- テーブルを追加
# /etc/iproute2/rt_tables
+810 gameserver
- netplanでルーティングテーブルをいじる(永続的変更にするため)
# /etc/netplan/00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
enp1s0:
dhcp4: true
nameservers:
addresses:
- 127.0.0.1
+ routes:
+ - to: 0.0.0.0/0
+ via: 192.168.0.1
+ table: 810
bridges:
br0:
interfaces: [enp3s0,enp4s0]
addresses: [192.168.1.1/24]
nameservers:
addresses: [192.168.1.1]
optional: true
+ routing-policy:
+ - from: 192.168.1.10
+ table: 810
+ mark: 810
+ priority: 810 # NordVPNのルーティングルールの優先度は32765なのでこれより小さい数字に
- ufw(iptables)でポート転送とPalworldサーバープロセスからの通信をマーキングする
# /etc/ufw/before.rules
*filter
+# br0の192.168.1.10:8211/udpとenp1s0の通信を許可する
+-A ufw-before-forward -i br0 -o enp1s0 -s 192.168.1.10 -p udp --sport 8211 -j ACCEPT
+-A ufw-before-forward -i enp1s0 -o br0 -d 192.168.1.10 -p udp --dport 8211 -j ACCEPT
+*mangle
+# Palworldのサーバーのパケットにマーキングする
+-A PREROUTING -i br0 -s 192.168.1.10 -p udp --sport 8211 -j MARK --set-mark 0x32a
COMMIT
*nat
+# enp1s0から降ってきたポート8211に対する通信をPalworldサーバーに転送する
+# mark 0x32aがついたパケットをenp1s0でマスカレードする。
+-A PREROUTING -i enp1s0 -p udp --dport 8211 -j DNAT --to-destination 192.168.1.10:8211
+-A POSTROUTING -o enp1s0 -m mark --mark 0x32a -j MASQUERADE
Palworldサーバーが使用するポートがわかっていたのでルーティング前の通信の送信元を参照してマーキング、
netplanで192.168.1.10から発信されたmark 810がついている通信を識別してenp1s0がデフォルトルートのテーブルを強制。
nordlynxを通らずに新鮮なパケットをお届け。
他のホスティングにも流用できるかも。
あとがき#
ChatGPTくんが意味わからないことしか書き散らさなかったので自分で調べて解釈して考えて手順を踏んだ(それがあるべき姿なんだけども)
palworldの鯖公開の際にルーティングテーブルの存在を失念していて三日くらい無駄にした。
Openwrtを触ってた時の記憶があったのもあってなんとかなった部分もあったりしてOpenwrtは手軽に色々できてすごいなと思った。