네트워크 게이트웨이로서의 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

클라이언트에서 웹 서버에 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

관련 정보