
주소가 있는 일반적인 LAN이 있습니다 192.168.2.x
. 일부 서비스를 노출하고 싶습니다.다른Wireguard VPN을 통해 호스팅합니다.
Wireguard 서버는 공개적으로 액세스 가능한 라우터가 아니라 공개 호스트로 구성된 더 강력한 컴퓨터에서 실행되고 있습니다. Wireguard는 현재 10.0.0.x
서버가 사용하는 주소를 사용하도록 구성되어 있습니다 10.0.0.1
.
클라이언트는 IP를 사용하여 내 VPN 서버에 성공적으로 연결하고 10.0.0.2
해당 서버의 서비스에 액세스하려고 시도합니다 10.0.0.1
. 포트를 기반으로 (서버 측) DNAT를 사용하여 패킷을 (예를 들어) 192.168.2.1
. 이것은 기본적으로 작동합니다. tcpdump를 사용하면 패킷이 10.0.0.2
src 및 dst를 통해 전송되고 있으므로 192.168.2.1
분명히 올바른 호스트에 도착하는 것을 볼 수 있습니다 .
그러나 10.0.0.x
내 Wireguard 서버를 제외한 모든 곳에서 네트워크를 알 수 없으므로(변경하고 싶지 않음) 192.168.2.1
응답 패킷을 어디로 보낼지 모릅니다. 제 생각에는 두 출처를 모두 변경하는 서버 측 NAT 변형이 필요한 것 같습니다.그리고대상 IP.
가능합니까?
혼란을 줄이기 위해 간단한 개요를 작성해 보았습니다.
VPN Host LAN Service
IPs: 192.168.2.2, 10.0.0.1 192.168.2.1
Incoming Packet
src: 10.0.0.2 dst: 10.0.0.1:666
masqueraded to:
src: 192.168.2.2 dst: 192.168.2.1:666
receives packet
src: 192.168.2.2 dst: 192.168.2.1:666
sends answer packet
src: 192.168.2.1:666 dst: 192.168.2.2
Receives answer packet:
src: 192.168.2.1:666 dst: 192.168.2.2
de-masqueraded to
src: 10.0.0.1:666 dst: 10.0.0.2
이것이 가능하지 않다면 어떤 다른 옵션이 있습니까? 궁극적으로 포트를 기반으로 다른 로컬 서버로 패킷을 전달하고 싶습니다.
추가 참고 사항: VPN의 전체 목적은 이러한 서비스를 노출하는 것입니다. VPN 네트워크( 10.0.0.x
)는 LAN 내에서 서비스를 노출하는 서버와 해당 서비스를 사용하는 원격 클라이언트로 구성되어야 합니다.
답변1
내 질문에 답하기: 이 질문에 대한 Iain Brown의 답변에 따라 결합된 DNAT와 SNAT를 성공적으로 설정할 수 있습니다. https://superuser.com/questions/1286555/iptables-port-forwarding-with-internal-snat:
몇 가지 실험을 거친 후 내 질문에 대한 답변을 얻은 것 같으므로 다른 사람이 유용하다고 생각할 경우를 대비하여 여기에 게시해야 합니다. 예, 가능하며 매우 간단합니다. 올바른 주소와 포트 조합을 얻으십시오.
내 스크립트에 대한 의견:
# summary: # allow forwarding *to* destination ip:port # allow forwarding *from* destination ip:port # nat packets identified by arrival at external IP / port to have # *destination* internal ip:port # nat packets identified by arrival at internal IP / port to have # *source* internal network IP of gateway machine
질문의 예를 들면 다음과 같습니다.
# allow inbound and outbound forwarding iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 54321 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.2.10 --sport 54321 -j ACCEPT # route packets arriving at external IP/port to LAN machine iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:54321 # rewrite packets going to LAN machine (identified by address/port) # to originate from gateway's internal address iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 54321 -j SNAT --to-source 192.168.2.5
실제 스크립트는 직접 적용하기가 더 쉬울 것입니다.
# EXTIP = external IP of gateway (1.2.3.4) # EPORT = external port (12345) # DIP = destination IP in local network (192.168.2.10) # DPORT = destination port (54321) # INTIP = internal IP of gateway (192.168.2.5) iptables -A FORWARD -p tcp -d $DIP --dport $DPORT -j ACCEPT iptables -A FORWARD -p tcp -s $DIP --sport $DPORT -j ACCEPT iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport $EPORT -j DNAT --to-destination $DIP:$DPORT iptables -A POSTROUTING -t nat -p tcp -d $DIP --dport $DPORT -j SNAT --to-source $INTIP