端口转发到 VPN 客户端?

端口转发到 VPN 客户端?

我遇到了一些难题,但没有找到解决方案。现在我(不幸的是)通过 Verizon 3G 连接到网络。它们过滤所有传入流量,因此我不可能打开端口来接受连接。

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

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

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

我想要完成的是这样的:

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

例如,如果我在客户端上打开端口 6000,则有人可以远程登录到 xxxx:6000,服务器会捕获该端口并将其转发到 192.168.3.100:6000。

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

答案1

您需要在 VPN 服务器(Linode)上执行三件事才能使其正常工作:

  1. 您必须启用 IP 转发:

    sysctl -w net.ipv4.ip_forward=1
    
  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
    
  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
    

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

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

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

答案2

我也遇到了这个问题,并尝试解决了几个小时。这是我的解决方案:

  • 我有不止一个VPNClient相同的IPAddress。所以我给了他们每个人一个静态IPAddress

定义应存储客户端脚本的目录,例如 /etc/openvpn/staticclients 并创建该目录

mkdir /etc/openvpn/staticclients

将此目录作为选项添加到服务器上的 openvpn 配置文件中:

client-config-dir /etc/openvpn/staticclients

您必须为每个客户端创建一个文件。文件名必须与common name客户端证书中指定的属性匹配。此命令从计算机证书中获取 CN:

此示例使用以下命令将IPAddress10.1.134.110/10.1.134.109 推送到客户端common name 测试客户端并且还推送子网 10.1.135.0 的附加路由。

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110

答案3

大多数服务器在默认配置中都禁用了 IP 转发。如果您想通过 VPN 重定向传入连接,则需要启用它。

尝试这个:

sysctl -w net.ipv4.ip_forward = 1

我的意思是除了 iptables 配置之外。

答案4

您想要实现的目标(可能)很可能通过pptpdOpenVPN 和 iptables 实现,但是,您可能会发现 tinc 更适合此用例。我刚刚读过其中描述了如何针对此用例设置 tinc。它是 或 OpenVPN 部分的替代品(可能更简单)pptdp。那么你就需要 iptables 完全相同的规则。

相关内容