ネットワークゲートウェイとしてのDockerコンテナ[応答なし]

ネットワークゲートウェイとしてのDockerコンテナ[応答なし]

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-quickWireguardインターフェイスの起動時に作成されたルーティングテーブル「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

おすすめ記事