특정(Docker) 컨테이너의 아웃바운드 트래픽이 내(WireGuard) VPN(내 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를 핑하면 대상 호스트에 연결할 수 없다는 응답이 표시됩니다.
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