特定の(Docker)コンテナからのアウトバウンドトラフィックは、(WireGuard)VPN(My VPSで実行)を介してトンネリングされ、VPS外部IPを使用してインターネットに出る必要がありますが、成功しません。
私の環境は次のとおりです。
- 仮想プライベートサーバー:
- WireGuardゲートウェイインターフェイスが開きます
wg0
10.0.80.1/24
- インターネット接続インターフェース
eth0
、最もアクティブ - IP転送が有効になっています。
- WireGuardゲートウェイインターフェイスが開きます
- ホームサーバー:
- VPSのWireGuardトンネルを開く
wg0
10.0.80.200/24
- LAN指向インターフェース
enp45s0
10.0.1.200
、以下を介してアクセス可能10.0.1.1
docker82
10.0.82.1/24
: Dockerコンテナのブリッジ10.0.82.14
トンネリングが必要なコンテナ- Docker iptablesは無効になっており、偽装と転送はnftablesを使用して手動で設定され、以下に説明する操作を実行する前に正しく機能していることが確認されます。
- IP転送が有効になっています。
- VPSのWireGuardトンネルを開く
VPSをデフォルトゲートウェイとして使用する別のデバイスでWireGuardを使用してテストしたので、AllowedIPs = 0.0.0.0/0, ::/0
VPSで偽装と転送が機能することを知っています。
ホームサーバーで、次のようにソースベースのルーティングを設定しようとしています。
echo "100 wireguard" >>/etc/iproute2/rt_tables
ip rule add from 10.0.82.14 table wireguard
ip route add default via 10.0.80.1 dev wg0 table wireguard
ip route add 10.0.1.1 dev enp45s0 table wireguard # needed for Docker DNS resolver
コンテナ(10.0.82.14
)内にアクセス権がありますが、10.0.80.1
パブリックIPをpingするとターゲットホストに接続できないという応答が表示されます。
a468bb1b5494:~# ip route
default via 10.0.82.1 dev eth0
10.0.82.0/24 dev eth0 proto kernel scope link src 10.0.82.14
a468bb1b5494:~# ping 10.0.80.1
PING 10.0.80.1 (10.0.80.1) 56(84) bytes of data.
64 bytes from 10.0.80.1: icmp_seq=1 ttl=63 time=9.06 ms
64 bytes from 10.0.80.1: icmp_seq=2 ttl=63 time=9.28 ms
^C
--- 10.0.80.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 9.057/9.170/9.284/0.113 ms
a468bb1b5494:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 10.0.82.1 icmp_seq=1 Destination Host Unreachable
From 10.0.82.1 icmp_seq=2 Destination Host Unreachable
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1016ms
tcpdump
docker82
コンテナホスト(マスターサーバー)から起動します。
laxis@nuc:~$ sudo tcpdump -n -i docker82 icmp
listening on docker82, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:21:41.229730 IP 10.0.82.14 > 10.0.80.1: ICMP echo request, id 28, seq 1, length 64
14:21:41.351761 IP 10.0.80.1 > 10.0.82.14: ICMP echo reply, id 28, seq 1, length 64
14:21:42.231232 IP 10.0.82.14 > 10.0.80.1: ICMP echo request, id 28, seq 2, length 64
14:21:42.241748 IP 10.0.80.1 > 10.0.82.14: ICMP echo reply, id 28, seq 2, length 64
14:21:43.488539 IP 10.0.82.14 > 8.8.8.8: ICMP echo request, id 29, seq 1, length 64
14:21:43.488686 IP 10.0.82.1 > 10.0.82.14: ICMP host 8.8.8.8 unreachable, length 92
14:21:44.515474 IP 10.0.82.14 > 8.8.8.8: ICMP echo request, id 29, seq 2, length 64
14:21:44.515576 IP 10.0.82.1 > 10.0.82.14: ICMP host 8.8.8.8 unreachable, length 92
tcpdump
wg0
ホームサーバーから:
laxis@nuc:~$ sudo tcpdump -n -i wg0 icmp
listening on wg0, link-type RAW (Raw IP), snapshot length 262144 bytes
14:23:40.848287 IP 10.0.82.14 > 10.0.80.1: ICMP echo request, id 30, seq 1, length 64
14:23:40.857968 IP 10.0.80.1 > 10.0.82.14: ICMP echo reply, id 30, seq 1, length 64
14:23:41.849639 IP 10.0.82.14 > 10.0.80.1: ICMP echo request, id 30, seq 2, length 64
14:23:41.859707 IP 10.0.80.1 > 10.0.82.14: ICMP echo reply, id 30, seq 2, length 64
14:23:43.230307 IP 10.0.82.14 > 8.8.8.8: ICMP echo request, id 31, seq 1, length 64
14:23:44.259534 IP 10.0.82.14 > 8.8.8.8: ICMP echo request, id 31, seq 2, length 64
wg0
VPS側のインターフェイスにはエコー要求パケットは表示されません8.8.8.8
。
現時点では、カスタムルートテーブルがどのような操作を実行しているのか理解できません。ネットワークスタックが何らかの方法でパケット転送を通過しているように見えますが、wg0
まだ内部的にホストに接続できないように応答します。
これが何に関連しているかを知っている人はいますか?
ありがとう
答え1
解決策は予想よりはっきりしていました...私は以下からインスピレーションを受けました。この回答最後に、AllowedIPs
WireGuardピア構成設定について説明しました0.0.0.0/0
。
最終構成ははるかに簡単であり、例示としても含まれる。wg-quick
手動:別々のルーティングテーブルを使用するようにWireGuardを設定し(この場合は不要なシステムのデフォルトゲートウェイパスの交換を防ぐため)、そのテーブルをソースベースのルーティングに使用するだけです。
/etc/wireguard/wg0.conf
:
[Interface]
PrivateKey = ...
Address = 10.0.80.200/32, fd80::200/128
Table = 100 # 100 = wireguard table
PostUp = ip route add 10.0.1.1 dev enp45s0 table wireguard
PostUp = ip rule add from 10.0.82.14 table wireguard
PreDown = ip rule del from 10.0.82.14 table wireguard
PreDown = ip route del 10.0.1.1 dev enp45s0 table wireguard
[Peer]
PublicKey = ...
Endpoint = ...
AllowedIPs = 0.0.0.0/0, ::/0