我有一个运行 Ubuntu 18.04 的 KVM VPS,它同时:
- 具有 IP 的 L2TP 服务器 (xl2tpd + strongswan)
192.168.42.1/24
- Wireguard 客户端及其 IP
192.168.73.3/24
(服务器的 IP 是192.168.73.1/24
)
L2TP 和 Wireguard 连接彼此独立,都能很好地运行。
我想允许将 L2TP 客户端的流量重定向到 Wireguard 服务器,即192.168.42.x <===> 192.168.73.1
VPS 上的 Wireguard 配置:
~# cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <....>
Address = 192.168.73.3/24
[Peer]
PublicKey = <...>
Endpoint = <....>
AllowedIPs = 192.168.73.0/24
PersistentKeepalive = 15
L2TP 服务器已使用这个很棒的脚本。它创建以下 iptables 规则:
~# iptables --list-rules
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol none -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500 -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j DROP
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -i ens3 -o ppp+ -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ppp+ -o ens3 -j ACCEPT
-A FORWARD -s 192.168.42.0/24 -d 192.168.42.0/24 -i ppp+ -o ppp+ -j ACCEPT
-A FORWARD -j DROP
显然已启用 IP 转发
~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
路由表(连接 1 个 L2TP 客户端)如下:
~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 X.X.X.X 0.0.0.0 UG 0 0 0 ens3
XXX.XXX.XXX.XXX 0.0.0.0 255.255.255.0 U 0 0 0 ens3
X.X.X.X 0.0.0.0 255.255.255.255 UH 0 0 0 ens3
192.168.42.10 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
192.168.73.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0
XXX – 机密网关和外部 IP。
我尝试添加以下规则:
~# iptables -D FORWARD -j DROP
~# iptables -A FORWARD -i ppp+ -o wg0 -j ACCEPT
~# iptables -A FORWARD -i ppp+ -o wg0 -j ACCEPT
~# iptables -A FORWARD -j DROP
但转发ppp0 <===> wg0
仍然不起作用。
我应该添加哪些 iptables 规则来允许这种转发?
答案1
您需要在 L2TP VPN 客户端上添加路由,路由指示192.168.73.0/24
应通过 发送数据包192.168.42.1
。
另外,您需要在 Wireguard 服务器上添加路由,该路由告诉192.168.42.0/24
应通过 发送数据包192.168.73.3
。
您的命令的问题iptables
在于您在-j DROP
规则之后添加规则。这意味着这些规则永远不会被命中,数据包将被丢弃。
您应该-I
首先在链中插入规则。
您还需要检查 Wireguard 客户端防火墙配置。