转发到VPN客户端?


21

我遇到了一个难题,没有太多运气找到解决方案。现在,我(不幸地)通过Verizon 3G连接到了网络。它们过滤所有传入的流量,因此我无法打开端口来接受连接。

我目前在linode.com上有一个Linux虚拟机,这种想法让我无法安装pptpd并尝试进行一些iptables端口转发。我已经pptpd安装好了,而且我的家用计算机也能愉快地连接。也就是说,这是一些常规信息:

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

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

我要完成的是:

互联网-> WAN IP:端口->转发到客户端VPN IP:端口

因此,例如,如果我在客户端上打开了端口6000,那么一个人可以telnet到xxxx:6000,服务器将捕获该并将其转发到192.168.3.100:6000。

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

Answers:


25

您需要在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)匹配。


您好AGWA,感谢您的答复。我已经有了ip_forwarding,并且您的规则运行得很好,尽管起初还没有。问题是(在我的iptables愚昧无知中),我没有意识到iptables -F没有刷新nat条目,而iptables -L没有列出它们。在弄清楚如何正确列出它们之后,我注意到之前尝试过的几个冲突条目。刷新并尝试您的规则后,它可以完美运行。不过,一个简单的问题是,在您的规则中指定了tcp。将其更改为“全部”对两种TCP / UDP通信都有效吗?
Vile Brigandier

别客气!(顺便说一句,我喜欢iptables-save用来显示我的iptables规则-尽管输出不是供人食用的,它仍然可读并且显示了所有 iptables规则。)不,不幸的是,您不能在那里使用“全部”,因为--dport仅与实际上具有端口的协议一起使用(“全部”将包括例如ICMP,它没有端口的概念)。您将需要针对TCP和UDP的单独规则。
AGWA 2012年

感谢您的iptables保存提示。对于TCP和UDP,一切都按预期工作。干杯。
Vile Brigandier

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

只要禁用了ufw,我就可以使用,即使我在ufw中允许8080,但是一旦启用ufw,此转发功能也就无法使用。
Sudhir N

3

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

  • 我有一个以上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 TestClient的,也推动了子网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

2

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

尝试这个:

sysctl -w net.ipv4.ip_forward = 1

我的意思是除了iptables配置。


0

想要使用pptpdOpenVPN和iptables 实现(可能)非常有可能,但是,对于这种用例,您可能会发现tinc是更好的选择。我刚刚读了这篇文章,它描述了如何针对该用例设置tinc。这是(或可能更简单)替代pptdpOpenVPN的一部分。然后,您需要完全相同的iptables规则。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.