我想在一台 Linux 机器上配置 IPtables,使数据包能够流入和流出 VPN。
这是一个包含 3 个节点的小规模网络:
- v1:VPN 内的 Linux 机器。 VPN 子网为 10.10.100.0/22
- out1 :VPN 之外的 Linux 机器。它包含 VPN 内部存在多少节点及其 VPN IP 的信息,但它本身不在 VPN 上
- r :一台 Linux 机器,根据路由要求设置了 iptables。它位于 VPN 上,out1 也可以向其发送数据包。因此它处于边缘。因此,r 的 eth0 与 out1 位于同一网络,而 tun0 是其 VPN 接口
我已经设法让 r 成为所有离开 out1 的数据包的“下一跳”,目的地为 10.10.100.0/22。所以数据包正在进入r。 r 上的以下两条 iptables 规则使我能够拥有 out1,通过 netcat 与 v1 进行通信
iptables -t nat -A POSTROUTING --out-interface tun0 -j MASQUERADE
iptables -A FORWARD --in-interface eth0 -j ACCEPT
也许这些规则不正确,因为为什么我需要 MASQUERADE 函数?
当 v1 尝试 ACK 来自 out1 的数据包时,它们到达 r 并被丢弃。我使用 tcpdump 确认,v1 发送了发往 out1 的数据包,并且它们命中了 r,但它们从未到达 out1。
我如何关闭循环?我不需要进行 NAT,因为 out1 已经知道目标 IP,我只是希望 r 将数据包从其 eth0 移动到 tun0,然后将 tun0 移动到 eth0。
答案1
我是这样做的
#Forward connections coming in from eth0 to tun0
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
#Masquerade packets leaving tun0
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#Forward Stateful connections coming in from tun0 to eth0
iptables -A FORWARD -i tun0 -o eth0 -m state --state ESTABLISHED,RELATED \
-j ACCEPT
答案2
在以下示例中,VPN 设备名称为tun0
(OpenVPN),VPN 网关为 172.21.23.172。
在 Linux 路由器上安装 VPN(我使用的是 ipvanish w. openvpn)
使用 iptables 路由流量
sudo iptables -t nat -A POSTROUTING -o [VPN dev] -j MASQUERADE
例子:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
配置路由表(以确保所有流量都通过 VPN 路由)
sudo ip route add default via [VPN ipv4 address] dev [VPN dev]
例子:
sudo ip route add default via 172.21.23.172 dev tun0
通过运行以下命令检查网络上的设备是否确实通过 VPN 路由:
Windows:
tracert 1.1.1.1
Linux:traceroute 1.1.1.1
你完成了!