将 IPtables 配置为充当 VPN 边缘的路由器

将 IPtables 配置为充当 VPN 边缘的路由器

我想在一台 Linux 机器上配置 IPtables,使数据包能够流入和流出 VPN。

这是一个包含 3 个节点的小规模网络:

  1. v1:VPN 内的 Linux 机器。 VPN 子网为 10.10.100.0/22
  2. out1 :VPN 之外的 Linux 机器。它包含 VPN 内部存在多少节点及其 VPN IP 的信息,但它本身不在 VPN 上
  3. 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。

  1. 在 Linux 路由器上安装 VPN(我使用的是 ipvanish w. openvpn)

  2. 使用 iptables 路由流量

    sudo iptables -t nat -A POSTROUTING -o [VPN dev] -j MASQUERADE
    

    例子:

    sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
    
  3. 配置路由表(以确保所有流量都通过 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
    
  4. 通过运行以下命令检查网络上的设备是否确实通过 VPN 路由:

    Windows:tracert 1.1.1.1Linux:traceroute 1.1.1.1

你完成了!

相关内容