wireguard——保留原始IP的同时进行端口转发?

wireguard——保留原始IP的同时进行端口转发?

我正在尝试对我的一台服务器(为避免混淆,从现在起称为“客户端”)进行 DDOS 保护。为此,我从 OVH 租用了一台廉价服务器(称为“服务器”),并尝试将所有流量从服务器路由到客户端,以便它通过 DDOS 保护。

我决定使用 Wireguard 作为最佳解决方案,并成功链接了两台服务器。我现在正在尝试将端口从客户端转发到服务器,并尝试了此设置(其中10.20.40.2是客户端,10.20.40.1是服务器):

sudo iptables -t nat -A PREROUTING -p tcp --dport $port -j DNAT --to-destination 10.20.40.2                                                            
sudo iptables -A FORWARD -o wg0 -p tcp --syn --dport $port -m conntrack --ctstate NEW -j ACCEPT                                                        
sudo iptables -A FORWARD -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT                                                                      
sudo iptables -A FORWARD -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT                                                                     
sudo iptables -t nat -A PREROUTING -p tcp --dport $port -j DNAT --to-destination 10.20.40.2                                                            
sudo iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport $port -d 10.20.40.2 -j SNAT --to-source 10.20.40.1

这很好,只是从客户端的角度来看,每个 IP 都10.20.40.1属于服务器。有没有办法将公共 IP 地址转发给客户端?我以前在 StackExchange 上看到过这个问题,但限制是“客户端”在他们的情况下无法访问。我对两台服务器都有完全访问权限,因此在任意一台服务器上安装软件都不是问题。

客户端的 Wireguard 配置:

[Interface]                                                                                                                                                              
PrivateKey = (redacted)                                                                                                             
ListenPort = 51820                                                                                                                                                       
Address = 10.20.40.2/16                                                                                                                                                  
                                                                                                                                                                         
[Peer]                                                                                                                                                                   
PublicKey = (redacted)                                                                                                               
Endpoint = (redacted):51820                                                                                                                                          
AllowedIPs = 10.20.40.0/16

服务器的 Wireguard 配置:

[Interface]                                                                                                                                                              
PrivateKey = (redacted)                                                                                                                                                  
ListenPort = 51820                                                                                                                                                       
Address = 10.20.40.1/24                                                                                                                                                  
                                                                                                                                                                         
[Peer]                                                                                                                                                                   
PublicKey = (redacted)                                                                                                                                                   
AllowedIPs = 10.20.40.0/24

答案1

在 POSTROUTING 中交换 IP 地址:

sudo iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport $port -d 10.20.40.1 -j SNAT --to-source 10.20.40.2

在客户端 wireguard 配置中允许 IP:

AllowedIPs = 0.0.0.0/0

因为数据包现在将具有原始源地址。

答案2

是的,不使用该 SNAT 规则其作用实际上就是替换原始的 IP 地址。

您可能添加了该 SNAT 规则来诱骗目标服务器通过 WG 隧道接口发送响应。这可以通过其他方式更好地完成,例如策略路由:

  1. 在您的服务器上,创建一个新的路由表,其中默认路由指向“wg0”,没有其他任何内容:

    ip -4 route add default dev wg0 table 1234
    
  2. 在同一台服务器上,添加策略路由规则,每当即将发送响应时,将源 IP 地址 10.20.40.2 与新路由表关联:

    ip -4 rule add pref 1000 from 10.20.40.2 lookup 1234
    

答案3

我最终使用了这个 WireGuard 配置来解决我的问题:

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

以及这个端口转发命令:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport [PORT] -j DNAT --to-destination 10.20.40.2

相关内容