포트 전달의 두 계층에 대해 iptables를 올바르게 구성: VPN을 통해 로컬 서버에 연결된 외부 서버

포트 전달의 두 계층에 대해 iptables를 올바르게 구성: VPN을 통해 로컬 서버에 연결된 외부 서버

VPS(Debian 10)에서 실행되는 마인크래프트 서버가 있었지만 VPS는 처리하기에는 너무 약해서 더 강력한 로컬 서버를 사용하여 실행하고 싶었습니다(Ubuntu 22.04). VPS는 OpenVPN 서버를 호스팅하고 있으며 로컬 서버가 유일한 클라이언트로 연결됩니다. VPS는 10.8.0.1에 있고 로컬 서버는 10.8.0.6(로컬 네트워크의 192.168.1.185)에 있습니다.

나는 iptables 규칙을 사용하여 10.8.0.6:25565의 tun0 VPN 패킷을 로컬 서버의 IP로 전달했습니다. 이것은 잘 작동합니다. VPS에서 Minecraft 서버를 쿼리할 수 있습니다. 그런 다음 VPS에서 동일한 규칙 세트(물론 관련 IP가 교체됨)를 설정하여 vps_external_ip:25565에서 10.8.0.6:25565로 연결을 전달합니다. 이 규칙은 패킷을 로컬 서버까지 전달하지만 연결 시간은 항상 초과됩니다. 이상한 점은 VPS -> 로컬 서버 또는 외부 -> VPS -> 로컬 서버에서 작동하는 연결이 POSTROUTING MASQUERADE 규칙의 패킷 카운터를 늘리지 않지만 PREROUTING 규칙에 대해서는 수행된다는 것입니다. eth0:25565에서 VPS에 도달하면 TCP/UDP 연결이 시간 초과되며 연결 거부 오류가 없습니다.

IPV4 전달은 두 컴퓨터 모두에서 활성화되어 있으며 UFW를 비활성화한 상태에서 시도했지만 운이 없습니다.

두 서버의 NAT POSTROUTE에 로그 규칙을 설정했지만 문제를 찾을 수 없어 어떻게 해결해야 할지 잘 모르겠습니다.

POSTROUTE 로그 출력(iptables -t nat -I POSTROUTING -j LOG --log-prefix "NAT:" --log-level 7)

##### VPS
Apr 23 20:52:02 vpskernel: [1552376.122382] NAT1:IN= OUT=tun0 SRC=<my ip> DST=10.8.0.6 LEN=48 TOS=0x08 PREC=0x20 TTL=114 ID=21284 DF PROTO=TCP SPT=1806 DPT=25565 WINDOW=64240 RES=0x00 SYN URGP=0

#### Local server
<could not find any relevant logs grepping /var/log/kern.log for NAT1 and there were no logs at all for tun0>

iptables 규칙을 설정하기 위해 각 서버마다 /etc/ufw/before.rules를 사용했습니다.
VPS /etc/ufw/before.rules:

# START OPENVPN RULES
# NAT table rules
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# END OPENVPN RULES

-A PREROUTING -i eth0 -d <vps external IP> -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A PREROUTING -i eth0 -d <vps external IP> -p udp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A POSTROUTING -s 10.0.0.0/8 ! -d 10.0.0.0/8 -j MASQUERADE
COMMIT

로컬 서버 /etc/ufw/before.rules:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -d 10.8.0.6 -p tcp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
-A PREROUTING -i tun0 -d 10.8.0.6 -p udp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
# setup routing
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
COMMIT

PREROUTING 규칙은 작동하지만 POSTROUTING 규칙 카운터는 증가하지 않습니다.

디버깅을 위해 25565에서 tcpdump를 실행했습니다. 패킷이 들어오는 것을 볼 수 있지만 외부에서 연결할 때 어떤 인터페이스에서도 반환이 표시되지 않습니다. VPS에서 직접 쿼리하면 로컬 서버가 tun0에서 응답하는 것을 볼 수 있습니다. 문제는 로컬 서버가 tun0의 VPS 대신 en01의 내 IP에 직접 응답하려고 시도하는 것 같지만 어떻게 해결해야 할지 모르겠습니다.

VPS TCP 덤프:

# eth 0
21:43:39.972647 IP my_ip.2729 > vps_ip.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0
# tun0
21:43:39.972739 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0

로컬 서버 tcpdump:

#tun0
21:43:39.972566 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1356,nop,nop,sackOK], length 0

#en01
21:43:39.972618 IP 10.8.0.6.25565 > my_ip.2729: Flags [S.], seq 2141764446, ack 1483515508, win 64240, options [mss 1460,nop,nop,sackOK], length 0

답변1

마침내 알아 냈습니다. 대부분의 온라인 포트 포워딩 가이드에는 OpenVPN(또는 내 상황)에 작동하지 않는 POSTROUTING 규칙이 있습니다. 로컬 IP가 아닌 대상의 소스로 로컬 IP를 허용하는 대신 로컬 IP가 아닌 모든 항목에 대해 사후 라우팅 규칙을 만들어 tun0 VPS IP로 다시 작성해야 했습니다.

VPS /etc/ufw/before.rules(s와 d를 교체함):
-A POSTROUTING -d 10.0.0.0/8 ! -s 10.0.0.0/8 -j MASQUERADE -t nat

또한 POSTROUTING 규칙은 VPS에만 필요했습니다.

관련 정보