我需要帮助解决以下情况:
我在 AWS 上有一个小型实例,它应该接受来自端口 1024:65535 的所有流量并将其发送到我的本地服务器。本地服务器不应通过隧道发送任何流量,而应接收来自云服务器的流量。为了测试这一点,本地服务器在端口 8080 上打开了一个简单的 http 服务器。
但我无法让它正常工作。我知道端口是打开的,因为当使用 ssh 隧道时,它可以完美运行。
这是服务器配置:
[Interface]
Address = 10.200.200.1/24
PrivateKey = <private-server-key>
ListenPort = 51820
PostUp = /usr/sbin/iptables -t nat -A PREROUTING -i ens5 -p tcp --dport 1024:65535 -j DNAT --to-destination 10.200.200.2
PostUp = /usr/sbin/iptables -t nat -A POSTROUTING -o ens5 -p tcp --dport 1024:65535 -j MASQUERADE
[Peer]
PublicKey = <public-client-key>
AllowedIPs = 10.200.200.2/32
这是客户端配置:
[Interface]
Address = 10.200.200.2/32
PrivateKey = <private-client-key>
[Peer]
PublicKey = <public-server-key>
Endpoint = <server-ip>:51820
我甚至没有从服务器上的客户端获得握手,除非我添加
AllowedIPs = 0.0.0.0/0, ::/0
到客户端配置,但其他什么都不起作用。
答案1
针对客户端回复流量进行策略路由可能是最佳方法。请尝试对您的 WireGuard 客户端配置执行此操作(假设您仅转发 IPv4 流量):
[Interface]
Address = 10.200.200.2/24
PrivateKey = <private-client-key>
Table = 123
PreUp = ip rule add from 10.200.200.2 table 123 priority 456
PostDown = ip rule del from 10.200.200.2 table 123 priority 456
[Peer]
PublicKey = <public-server-key>
Endpoint = <server-ip>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
它使用自定义路由表(123
)和策略路由规则,确保对最初进入 WireGuard 接口的入站流量的所有回复都将以相同的方式出去 - 而不会影响源自客户端本身的流量(除了到该10.200.200.0/24
范围的流量)。
查看从互联网进行 WireGuard 端口转发文章中介绍了一些其他替代选择。
在服务器端,如果客户端从不发起出站连接(仅回复它们),则可以删除服务器的MASQUERADE
iptables 规则(除非您出于其他原因使用它)。
而且,通常你不会想转发一切在服务器的临时端口范围内,因为通常您希望允许服务器使用这些端口进行自己的出站连接(例如,下载系统更新)。您最好在服务器的DNAT
iptables 规则中仅指定客户端实际要侦听的端口(或至少调整它或服务器的net.ipv4.ip_local_port_range
内核参数以避免两者之间发生大规模冲突)。