iptables: Wireguard VPN 연결 뒤의 서버로 UDP 및 TCP 포트를 전달하는 방법

iptables: Wireguard VPN 연결 뒤의 서버로 UDP 및 TCP 포트를 전달하는 방법

그래서 저는 공용 IP로 Debian Bullseye를 실행하는 VPS(KVM) 서버를 가지고 있습니다. 해당 서버는 Wireguard 서버도 실행하고 있습니다. 집에는 내 VPS에 연결된 와이어가드 클라이언트가 있는 또 다른 서버(NAT 뒤에)가 있습니다. 터널이 작동 중이므로 Wireguard VPN을 통해 제대로 통신할 수 있습니다.

+----------------------------------+             +-------------------------------
| Homeserver (behind NAT)          |             | VPS (KVM) with public IP     |
| 192.168.1.10                     |             | 1.2.3.4                      |
|         +------------------------|             |--------------------+         |
|         | wg-homeserver          | - - - - - - | wg-vps             |         |
|         | 192.168.200.2          |             | 192.168.200.1      |         |
|         +------------------------|             |--------------------+         |
|                                  |             |                              |
+----------------------------------+             +------------------------------+

내 홈서버는 포트(모든 IP 주소)를 수신하는 여러 도커 컨테이너를 실행합니다. 즉, 이 포트는 192.168.1.0/24에서 액세스할 수 있습니다. 이제 VPS의 공용 IP 주소에서 하나의 TCP와 하나의 UDP 포트를 전달하고 와이어가드 링크를 통해 트래픽을 홈 서버의 동일한 포트로 전달해야 합니다.

1.2.3.4:10000/tcp -> 192.168.200.2:10000/tcp
1.2.3.4:10001/udp -> 192.168.200.2:10001/udp

두 시스템 모두에서 IP 전달이 활성화되어 있습니다 . 이는 cat /proc/sys/net/ipv4/ip_forward다음을 의미합니다.1

TCP 포트를 전달하기 위해 다음 규칙이 있습니다.

iptables -A FORWARD -d 192.168.200.2/32 -i wg-vps -p tcp --dport 10000 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10000 -j DNAT --to-destination 192.168.200.2:10000

시도할 때 에 의해 ssh -p 10000 1.2.3.4기록되는 패킷이 표시되지 않습니다 wireguard -i wg-vps. 나는 수많은 다른 것들을 시도했지만 내가 뭘 잘못하고 있거나 놓쳤는지를 알아낼 수 없었습니다.

어쨌든 UDP 포트에 대해서는 이 규칙을 만들었고 약간 더 성공적이었습니다.

iptables -t nat -A PREROUTING -d 1.2.3.4/32 -i eth0 -p udp --dport 10001 -j DNAT --to-destination 192.168.200.2:10001

UDP 테스트 패킷을 보내는 방법은 다음과 같습니다.

echo -n test | nc -4 -u 1.2.3.4 10001

이렇게 하면 tcpdump -i wg-vps내 VPS 로그에서 다음을 볼 수 있습니다( 4.5.6.7내 공개 IP 주소임).

11:35:47.497622 IP 4.5.6.7.43357 > 192.168.200.2.10001: UDP, length 4

192.168.200.2올바른 일을 하고 패킷을 가져와 대상을 으로 업데이트 한 다음 이를 wireguard 인터페이스에 넣으려고 하는 것 같습니다 wg-vps. 하지만 tcpdump -i wg-homeserver내 홈서버에는 이 패킷이 도착하는 것으로 표시되지 않습니다.

실제로 watch ip -s link show wg-homeserver홈서버에서 해당 포트로 UDP 패킷을 보낼 때마다 RX 오류가 1씩 증가한다는 사실을 발견했습니다. 그래서무엇거기까지 도달했지만 그것이 무엇이든 나타나지 않고 tcpdump아래 어딘가에 떨어진 것처럼 보입니다. 이상한 점은 Wireguard 링크를 통한 UDP와 TCP가 두 방향 모두에서 잘 작동하기 때문입니다.

내가 아는 한 tcpdumpiptables 이전에 패킷이 표시되므로 내 생각에는 패킷이 wireguard 인터페이스에 기록된 것처럼 보이지만 어딘가에서 삭제되는 것 같습니다.

업데이트: 좋습니다. Wireguard 로깅을 활성화하는 방법을 찾았습니다.

echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

그리고 로그를 추적하면 dmesg --followwireguard가 다음과 같은 이유로 패킷을 삭제하는 것처럼 보입니다.

wireguard: wg-homeserver: Packet has unallowed src IP (4.5.6.7) from peer 20 (xxxxxx)

따라서 이는 소스 주소가 요청이 어디에서 왔는지 원본 주소라는 사실을 좋아하지 않는다는 의미라고 생각합니다. 나는 SNAT를 하고 싶지 않기 때문에 소스 주소를 허용해야 한다는 점을 어떻게든 가르쳐야 할 것 같습니다.

이는 내 Wireguard 구성 섹션 AllowedIPs의 설정 으로 밝혀졌습니다 . [Peer]이렇게 하면 문제가 해결됩니다.

AllowedIPs = 0.0.0.0/0, ::0/0

이전에는 섹션에 있는 것과 유사한 인터페이스 마스크를 배치했지만 [Interface]이것이 패킷의 소스 주소를 제한한다는 사실을 깨닫지 못했습니다.

그러나 이는 모든 트래픽을 하이재킹하고 Wireguard 링크를 통해 라우팅하려고 시도하며 wg-quick경로 AllowedIPs를 추가하고 VPN을 통해 모든 트래픽을 리디렉션해야 한다고 생각합니다. 이는 분명히 바람직하지 않지만 다행히도 해결책이 있습니다. 섹션 Table = off에 추가하면 [Interface]이를 방지할 수 있습니다.

답변1

나가는 패킷이 홈 서버에서 라우팅되는 방법을 이해하려면 규칙 표를 참조하십시오. wg-quick은 몇 가지 규칙을 추가합니다.

ip rule show

저는 wg-quick에서 생성된 일부 규칙(모든 패킷을 wg로 전달하도록 함)을 제거한 다음 필요한 포트를 전달하는 규칙을 추가해야 했습니다. 위 명령에서 wg table#을 볼 수 있습니다.

ip -4 rule add sport 80 table XXXXX
ip -4 rule add sport 443 table XXXXX

위의 내용은 한동안 작동했습니다. 그러나 systemd-networkd는 dhcp 임대가 만료되거나 LAN 케이블이 연결 해제되었다가 다시 연결되면 사용자 정의 규칙을 제거합니다. 그래서 wg-quick을 완전히 제거하고 systemd-networkd를 사용하여 wg 인터페이스와 라우팅 규칙을 구성했습니다.

관련 정보