如何使用 iptables/ufw 通过 wireguard vpn 转发各个端口上的流量

如何使用 iptables/ufw 通过 wireguard vpn 转发各个端口上的流量

我有两台运行 ubuntu 22.04 的机器,我们将它们称为服务器和代理。代理是一个具有静态公共 IP 的 vps,服务器在 nat 后面运行。我想将代理上某些端口上的所有流量路由到服务器。

我已经在两者之间设置了一个 wireguard vpn,并且两者都可以互相 ping 通,如果我从代理 curl 服务器的 vpn 地址,我会得到正确的 html 响应,并且在代理上设置 nginx(这不是预期的最终解决方案,因为我想路由其他非 http/https 的服务)允许我通过 proxy_pass 到 vpn ip 并再次获得正确的 html 响应。

但我无法使用 iptables/ufw 设置转发。这是我的 wireguard 配置,其中包括接口启动时的 iptables 路由规则。

代理人:

[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]每次我尝试通过 Web 浏览器访问代理时,数据包和字节数都会增加

答案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

其次,我认为您应该在这里使用 PostUp/PreDown,而不是 PreUp/PostDown。如果在运行 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

希望我没有犯任何印刷错误——最好仔细检查一下。

相关内容