Wireguard Dockerコンテナをネットワークゲートウェイとして設定したいと思います。
私の設定は次のとおりです。
Client (user-Virtual-Machine) | IP: 172.22.100.157
Host (user-Virtual-Machine) | IP: 172.22.105.35
Docker container (from linuxserver/wireguard) | IP: 172.16.238.10
これまで私がしたこと:
顧客:
# Replace the default route with the hosts's IP
$ ip route replace default via 172.22.105.35
マスター:
$ sysctl net.ipv4.conf.all.forwarding true
# Define default route in a new routing table
$ ip route add default via 172.16.238.10 table 200
# Requests for the docker network via the docker interface IP
$ ip route add 172.16.238.0/24 via 172.16.238.1 table 200
# Lookup new routing table for all request coming into the interface eth0 (from Client Network)
$ ip rule add iif eth0 lookup 200
$ iptables -t nat -I POSTROUTING -o br-06b8cf6f4319 -j MASQUERADE
$ iptables -I FORWARD -i eth0 -o br-06b8cf6f4319 -j ACCEPT
コンテナ:
- このDockerイメージでは、IP転送はデフォルトで有効になっています。
[Wireguard設定ファイルから]
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
クライアントがWebサーバーにpingしようとすると、次のことが起こります。
顧客:
root@user-Virtual-Machine:~# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
^C
--- 1.1.1.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
マスター:
root@user-Virtual-Machine:/home/user/docker# tcpdump -i br-b1b1ac41a7f9 -n -v
tcpdump: listening on br-b1b1ac41a7f9, link-type EN10MB (Ethernet), capture size 262144 bytes
15:48:06.413006 IP (tos 0x0, ttl 63, id 35526, offset 0, flags [DF], proto ICMP (1), length 84)
172.22.100.157 > 1.1.1.1: ICMP echo request, id 35, seq 1, length 64
15:48:06.413170 IP (tos 0x0, ttl 64, id 52489, offset 0, flags [none], proto UDP (17), length 156)
172.16.238.10.46677 > 195.181.170.67.443: UDP, length 128
15:48:06.435470 IP (tos 0x0, ttl 53, id 20187, offset 0, flags [DF], proto UDP (17), length 144)
195.181.170.67.443 > 172.16.238.10.46677: UDP, length 116
15:48:06.435656 IP (tos 0x0, ttl 64, id 52492, offset 0, flags [none], proto UDP (17), length 156)
172.16.238.10.46677 > 195.181.170.67.443: UDP, length 128
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
コンテナ:
root@5f21c444a297:/# tcpdump -n -v
tcpdump: listening on wg0, link-type RAW (Raw IP), capture size 262144 bytes
13:06:38.860868 IP (tos 0x0, ttl 62, id 35630, offset 0, flags [DF], proto ICMP (1), length 84)
100.64.67.64 > 1.1.1.1: ICMP echo request, id 19, seq 1, length 64
13:06:38.885219 IP (tos 0x0, ttl 59, id 10501, offset 0, flags [none], proto ICMP (1), length 84)
1.1.1.1 > 100.64.67.64: ICMP echo reply, id 19, seq 1, length 64
13:06:38.885256 IP (tos 0x0, ttl 58, id 10501, offset 0, flags [none], proto ICMP (1), length 84)
1.1.1.1 > 172.22.100.157: ICMP echo reply, id 19, seq 1, length 64
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
答え1
私はそれについて考えた。 @user1794469さん、コメントありがとうございます。
問題は、Dockerコンテナのインターフェイスeth0がクライアントと同じサブネットにないため、デフォルトルールwg-quick
Wireguardインターフェイスの起動時に作成されたルーティングテーブル「51820」を検索します。
したがって、要求は正常に転送され、Wireguardインターフェイスを介して送信されますが、クライアントのIPがコンテナに認識されているサブネットにないため、応答はWAN(インターネット)に属する別のパケットとして処理され、Wireguardインターフェイスを介しても送信されます。 Wireguardインターフェイス。
リクエスト:顧客[eth0]->[eth0]所有者[br-b1b1ac41a7f9]->コンテナ[eth0][ネットワークアドレス変換][ワーキンググループ0] -> ... -> WAN
応答:WAN -> ... ->[ワーキンググループ0]コンテナ[ワーキンググループ0]-> ... -> WAN
dockerコンテナのゲートウェイ(ホスト上のブリッジインターフェイスのIP)を介してクライアントが存在するサブネットにルートを追加するだけです。
$ ip route
default via <gateway> dev eth0
$ ip route add <client_subnet> via <gateway>
PostUp
ただし、Wireguard設定ファイルセクションに追加する方が便利です。次のように見えます。
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE && ip route add 172.22.100.0/24 via 172.16.238.1
PostDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE && ip route delete 172.22.100.0/24 via 172.16.238.1
別の方法は、ホストでNAT迷彩を設定することです。
$ iptables -t nat -I POSTROUTING -o <container_bridge_interface> -j MASQUERADE
この例では、次のようになります。
$ iptables -t nat -I POSTROUTING -o br-b1b1ac41a7f9 -j MASQUERADE