端口转发到 VPN 客户端?

Vil*_*ier 24 iptables vpn port-forwarding openvpn

我遇到了一些难题,但找到解决方案的运气并不好。现在我(遗憾地)通过 Verizon 3G 连接到网络。他们过滤所有传入的流量,所以我不可能打开端口来接受连接。

我目前在 linode.com 上有一台 Linux 虚拟机,我想到要安装pptpd并尝试进行一些iptables端口转发。我已经pptpd安装,我的家用机器连接愉快。也就是说,这里有一些一般信息:

服务器 (Debian) WAN IP: xxxx on eth0 - pptpd IP: yyy1 on ppp0 - 客户端 VPN IP: yyy100

为了验证我没有发疯,我尝试了一些从服务器到客户端开放端口的连接,并且客户端确实通过 VPN IP 接受了这些连接。

我想要完成的是:

Internet -> WAN IP:Port -> 转发到客户端 VPN IP:Port

例如,如果我在我的客户端上打开了 6000 端口,那么一个人可以远程登录到 xxxx:6000,服务器会捕获它并将其转发到 192.168.3.100:6000。

我已经尝试了至少 20 种不同的 Google 搜索iptables配置,但都没有奏效。有没有人有任何想法,或者甚至是我可能不知道的完全不同的方法?这里的目标是通过可怕的防火墙连接侦听,最好是 TCP 和 UDP 流量。

小智 27

你需要在你的 VPN 服务器(Linode)上做三件事来完成这项工作:

  1. 您必须启用 IP 转发:

    sysctl -w net.ipv4.ip_forward=1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置目标 NAT (DNAT) 以转发端口。您可能已经想通了,因为它是标准的端口转发内容,但为了完整性:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
    Run Code Online (Sandbox Code Playgroud)
  3. 设置源 NAT (SNAT),以便从您的 VPN 客户端的角度来看,连接来自 VPN 服务器:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    
    Run Code Online (Sandbox Code Playgroud)

您需要 SNAT 的原因是,否则您的 VPN 客户端将通过其默认网关(即 Verizon 3G)而不是通过 VPN 将其返回数据包直接发送到发起连接 (zzzz) 的主机。因此返回数据包上的源 IP 地址将是您的 Verizon 3G 地址,而不是 xxxx 这会导致各种问题,因为 zzzz 确实发起了到 xxxx 的连接

在大多数端口转发设置中,不需要 SNAT,因为执行端口转发的主机也是目标主机(例如家庭路由器)的默认网关。

另请注意,如果要将端口 6000 转发到其他端口(例如 7000),则 SNAT 规则应匹配 7000,而不是 6000。

  • 只是对这个答案的更新是使用 iproute2,您实际上可以将 VPN 客户端设置为具有 2 个网关并通过 VPN 将 DNAT 流量路由回。如果您不想使用 SNAT 并且所有流量似乎都来自 vpn 服务器,这将非常有用。http://www.thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System 包含有关如何设置的信息。 (2认同)