iptables/ufw를 사용하여 Wireguard VPN을 통해 다양한 포트의 트래픽을 전달하는 방법

iptables/ufw를 사용하여 Wireguard VPN을 통해 다양한 포트의 트래픽을 전달하는 방법

우분투 22.04를 실행하는 컴퓨터가 2대 있는데, 이를 서버와 프록시라고 부르겠습니다. 프록시는 고정 공용 IP를 가진 vps이고 서버는 nat 뒤에서 실행됩니다. 프록시의 일부 포트에서 모든 트래픽을 서버로 라우팅하고 싶습니다.

나는 2 사이에 wireguard VPN을 설정했으며 둘 다 서로 핑할 수 있습니다. 프록시에서 서버의 VPN 주소를 컬링하면 올바른 HTML 응답을 얻고 프록시에서 nginx를 설정합니다(의도된 최종 의도는 아님). http/https가 아닌 다른 서비스를 라우팅하고 싶기 때문에) VPN IP에 Proxy_pass를 허용하고 일단 올바른 HTML 응답을 얻을 수 있습니다.

하지만 iptables/ufw를 사용하여 전달을 설정할 수 없었습니다. 이것은 인터페이스 작동 시 iptables 라우팅 규칙을 포함하는 내 wireguard 구성입니다.

대리:

[Interface]
# Proxy with static ip
Address = 10.250.0.1/32
ListenPort = 23456
PrivateKey = {private key}
# packet forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# port forwarding
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.250.0.2
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.250.0.2
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.250.0.2
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.250.0.2
      
[Peer]
# main_server behind nat
PublicKey = {pub key}
AllowedIPs = 10.250.0.2/32

섬기는 사람:

[Interface]
Address = 10.250.0.2/32
ListenPort = 23456
PrivateKey = {priv key}

[Peer]
PublicKey = {pub key}
Endpoint = {proxy server ip}:23456
AllowedIPs = 10.250.0.0/16
PersistentKeepalive = 25

실행하면 sudo iptables-save -c 다음이 반환됩니다.

# Completed on Wed Aug 24 17:01:57 2022
# Generated by iptables-save v1.8.7 on Wed Aug 24 17:01:57 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
[0:0] -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.250.0.2
[4:208] -A PREROUTING -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.250.0.2
COMMIT

[4:208]웹 브라우저를 통해 프록시에 액세스하려고 할 때마다 패킷 및 바이트 수가 증가합니다.

답변1

저는 Wireguard를 통해 NAT 뒤의 서비스로 유사한 포트 전달이 작동하도록 하는 데 어려움을 겪고 있습니다. 내 구성은 귀하의 구성과 유사하지만 이를 작동시키려면 두 가지 변경 사항이 필요합니다.

첫째, DNAT 규칙 외에도 SNAT 규칙이 필요하다는 것을 알았습니다. 다음과 같이 시도해 볼 수도 있습니다.

iptables -t nat -A POSTROUTING -d 10.250.0.2 -o wg0 -p tcp --dport 80 -j SNAT --to-source 10.250.0.1

둘째, 여기서는 PreUp/PostDown보다는 PostUp/PreDown을 사용해야 한다고 생각합니다. iptables를 실행할 때 인터페이스가 아직 작동하지 않으면 라우팅 규칙이 유지되지 않는 것 같으므로 PostUp은 인터페이스가 먼저 제 위치에 있는지 확인합니다.

종합적으로 멀티포트를 사용하여 약간 단순화하면 프록시에서 다음 구성을 시도해 볼 수 있습니다.

[Interface]
# Proxy with static ip
Address = 10.250.0.1/32
ListenPort = 23456
PrivateKey = {private key}
# packet forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# port forwarding
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to- destination 10.250.0.2
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to- destination 10.250.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.250.0.2 -o wg0 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 10.250.0.1
PreDown = iptables -t nat -D POSTROUTING -d 10.250.0.2 -o wg0 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 10.250.0.1
  
[Peer]
# main_server behind nat
PublicKey = {pub key}
AllowedIPs = 10.250.0.2/32

인쇄상 오류가 발생하지 않았으면 좋겠습니다. 주의 깊게 확인하는 것이 가장 좋습니다.

관련 정보