编辑 :好吧,我会尽量使这更清楚。 我试图实现的只是一个端口,通过OpenVZ托pipe的openvpn服务器转发到在客户端上运行的服务。 我想转发一些不同的服务,比如Web服务器或者一个不知名的客户端。 为了争论,让我们说我只是想build立一个function的netcat连接与这个拓扑结构:
互联网—> [ – > server(1.2.3.4:15555)] – nat – / – > openvpn-server(10.8.0.1) – \ – >客户端运行webserver(10.8.0.6:15555)
要么 ….
(inet)—>(public ip)-nat-through-openvpn-server– | – > to-client- \ 10.8.0.6(destination)
其中inet代表互联网上的任何主机,1.2.3.4代表我的服务器的公共IP,10.8.0.6代表将托pipe服务器的ovpn客户端,我希望从VPN后面的地址/端口1.2 .3.4:15555
这是我的ifconfig:
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1037374 errors:0 dropped:0 overruns:0 frame:0 TX packets:1037374 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:141887598 (141.8 MB) TX bytes:141887598 (141.8 MB) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 PtP:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:1746329 errors:0 dropped:0 overruns:0 frame:0 TX packets:3193026 errors:0 dropped:117 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:104945794 (104.9 MB) TX bytes:4356609743 (4.3 GB) venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:127.0.0.2 PtP:127.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.255 UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1 RX packets:43166195 errors:0 dropped:0 overruns:0 frame:0 TX packets:44728488 errors:0 dropped:11647 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:34214141842 (34.2 GB) TX bytes:43166888251 (43.1 GB) venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:1.2.3.4 PtP:1.2.3.4 Bcast:1.2.3.4 Mask:255.255.255.255 UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1 venet0:1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:1.2.3.5 PtP:1.2.3.5 Bcast:1.2.3.5 Mask:255.255.255.255 UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
所以我希望互联网上的主机能够通过服务器的公共IP地址(通过openvpn服务器NAT)到达openvpn客户端的netcat监听器(或web服务器)。
我昨天晚上问了这个问题,并删除了它,因为我以为我已经找出了答案,但事实certificate,我没有。如果这似乎是一个重复的问题比我道歉。 我已经search,并试图按照这个主题的其他线程中find的build议。这个问题是我有一个Ubuntu Minimal vps。 这是一个OpenVZ容器。 它主要用作openvpn服务器。 networking拓扑是p2p。 我试图通过服务器的公共IP(例如1.2.3.4)将端口转发到客户端(例如10.8.0.6,p2p 10.8.0.5),以便从VPN地址1.2可以访问某个服务(比如说apache)。 3.4。
我知道,因为服务器是一个OpenVZ容器,所以需要使用某些iptables解决方法,比如openvpn:
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s $VPN_SN -j ACCEPT iptables -A FORWARD -j REJECT iptables -t nat -A POSTROUTING -s $VPN_SN -o venet0 -j SNAT --to-source $OUTIP
这工作正常。 我也可以将发往服务器的stream量从一个端口redirect到另一个端口:
iptables -A INPUT -i venet0 -d $EXTIP -p tcp --dport 80 -m state --state NEW -j ACCEPT $IPT -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j REDIRECT --to-port 9001 iptables -A INPUT -i venet0 -p tcp --dport 9001 -j ACCEPT
这也行得通,虽然我宁愿没有目的港(9001)向世界开放,但我不能让它工作,否则。 我根本无法工作的是将指定给服务器的公共IP(在上面的示例中为$ EXT_IP)的stream量转发到其中一个VPN客户端。 我尝试了几种不同的方法。 (我也想知道点对点拓扑结构是否使这个变得复杂了?)我尝试使用另一个线程中描述的规则:
$IPT -A INPUT -p tcp -d $OUTIP --dport 15555 -j ACCEPT $IPT -A FORWARD -i venet0 -p tcp --dport 15555 -j ACCEPT $IPT -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 15555 -j DNAT --to-destination 10.8.0.6:15555
(OUTIP表示外发IP地址或venet0:1的地址,VPNstream量通过venet0:0到venet0:1路由)
接下来,我设置了一个netcat监听器:nc -l 0.0.0.0 -p 15555
并用这个网站来testing连接,最终显示出一些进展:
invalid connection to [10.8.0.6] from (UNKNOWN) [66.240.174.69] 55814
现在至less我知道stream量正在被转发,这是一个开始。 所以我想也许我需要添加一个postrouting规则,以便交通知道去哪里发回
$IPT -A POSTROUTING -t nat -p tcp -d 10.8.0.6 --dport 15555 -j SNAT --to-source $OUT_IP:15555
我得到了同样的结果。 我花了几个小时试图将一个端口转发给客户,这让我感到非常惊讶。 我会认真感谢一些帮助!
我终于得到这个工作。 结果数据包没有被转发通过服务器。 我最终需要下面的这些规则。 我写了这个小脚本来启用/禁用端口转发规则。
## Port Forwarding to Client ## fwd_EN="false" # Change to 'true' to enable ext_if="venet0" # int_if="tun0" # int_ip="10.9.0.6" # client to forward to int_PRT="15555" if [[ $fwd_EN == "true" ]]; then echo Warning: Port Forwarding enabled $IPT -t nat -A PREROUTING -p tcp -i $ext_if --dport $int_PRT -j DNAT --to-dest $int_ip:$int_PRT $IPT -A FORWARD -p tcp -i $ext_if -o $int_if -d $int_ip --dport $int_PRT -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $ext_if -o $int_if -d $int_ip -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $int_if -s $int_ip -o $ext_if -m state --state ESTABLISHED,RELATED -j ACCEPT else echo Info: Port Forwarding Disabled fi
现在我可以在客户端和远程主机上build立一个nc监听器,运行nc 1.2.3.4 15555并且连接正常!
anon@vpnclient:~$ nc -l -v -p 15555 Listening on [0.0.0.0] (family 0, port 15555) Connection from [xxxx] port 15555 [tcp/*] accepted (family 2, sport 58939) Can you see me? yes, I can!