メインコンテンツへスキップ
  1. Posts/

ubuntu serverをルーター化する2

·4 分·
Network Linux Network
なね
著者
なね
目次
Ubuntu Router - This article is part of a series.
Part 2: This Article

前置き
#

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は手軽に色々できてすごいなと思った。

参考文献
#

Ubuntu Router - This article is part of a series.
Part 2: This Article

Related

ubuntu serverをルーター化する
·3 分
Network Linux Network
HyperVにGPUを割り当てて優勝したかった
·3 分
Linux Linux
新しいルートソリューション、APatchのススメ
·4 分
Android Android
Intel ARCなWindows環境でStable Diffusion WebUI
·2 分
Intel ARC Stable Diffusion AI
PC用アバターをQuest GoodにしてFallback Avatarにする
·4 分
Unity Blender Unity VRChat Blender
drm-xe-nextで遊ぶ
·5 分
Linux Intel GPU Mesa