首页 > Linux, Tomato > Tomato路由器NAT至vpn客户端实现移动网络的端口映射

Tomato路由器NAT至vpn客户端实现移动网络的端口映射

2011年9月6日 LTNS     访问次数 1,360 发表评论 阅读评论

由于移动、联通等手机运营商不提供NAT端口映射服务,有时在外面想利用手边的笔记本电脑作TCP Server用(来做一些基于GPRS DTU的测试)就没法实现了,于是想到一个办法:笔记本电脑通过移动网络远程接入路由器上的vpn server,然后通过该路由器来实现端口映射。

示意图如下

 

准备条件:
1. 一个已刷了tomato vpn版固件的路由器当作 openvpn server 使用

内网ip: 192.168.1.1
外网ip: PPPoE拨号得到的公网ip,所以申请了xxx.3322.org二级域名做DDNS用
注:在tomato设置的vpn server页面里勾选“Direct clients to redirect Internet traffic”,强制vpn客户端的internet流量重定向至vpn server/路由器。

2. 笔记本电脑通过联通或移动的手机网络上网,然后作为vpn客户端通过tap模式接入路由器上的vpn server,获得一个vpn网络的ip地址 192.168.1.101

现在内网子机(192.168.1.0/24)可以跟vpn客户端(192.168.1.101 )之间互访,就像在同一个局域网内,vpn客户端也可以通过openvpn server访问internet(vpn客户端访问ip检查页面时显示的是路由器的外网ip)。

但在路由器上设置了端口映射后,在外网通过internet却无法访问vpn客户端上的TCP Server(如在端口映射设置里把192.168.1.101替换为任何一个实际的内网子机就正常,说明路由器的NAT功能是可用的)。

 

从外网访问 xxx.3322.org:12345 失败,vpn客户端上的TCP server测试软件能接收到数据包但反馈的数据包却没有正确返回。

执行 iptables -t nat -nvL 命令显示如下NAT规则

Chain PREROUTING (policy ACCEPT 6718 packets, 745K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       0    --  ppp+   *       0.0.0.0/0            192.168.1.0/24
   28  1696 DNAT       icmp --  *      *       0.0.0.0/0            x.x.x.x         to:192.168.1.1
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            x.x.x.x         tcp dpt:xxxxx to:192.168.1.1:22
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            x.x.x.x         tcp dpt:12345 to:192.168.1.101:12345
    0     0 upnp       0    --  *      *       0.0.0.0/0            x.x.x.x 
 
Chain POSTROUTING (policy ACCEPT 9008 packets, 545K bytes)
 pkts bytes target     prot opt in     out     source               destination
   12   720 SNAT       tcp  --  *      *       192.168.1.0/24       192.168.1.101        tcp dpt:12345 to:x.x.x.x
 6051  687K MASQUERADE 0    --  *      ppp+    0.0.0.0/0            0.0.0.0/0
  209 60210 MASQUERADE 0    --  *      *       192.168.1.0/24       0.0.0.0/0
 
Chain OUTPUT (policy ACCEPT 1306 packets, 129K bytes)
 pkts bytes target     prot opt in     out     source               destination
注:x.x.x.x是路由器的外网ip

这时发现从 192.168.1.101 不能 ping 通路由器的外网ip x.x.x.x(但可ping通 192.168.1.1),而从实际的内网子机(192.168.1.0/24)却可以。参考文章 iptables 端口映射设置,试着把SNAT那一行规则里最末尾的 to:x.x.x.x 替换成 to:192.168.1.1 ,这时数据包就能正常返回到路由器了。

于是就到Port Forwarding页面里取消 12345 -> 192.168.1.101的NAT规则,然后到 Administration> Scripts>Firewall 页面里添加如下三行,重启路由器,问题就解决了。

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 12345 -j DNAT --to-destination 192.168.1.101:12345
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.101 -p tcp -m tcp --dport 12345 -j SNAT --to-source 192.168.1.1
iptables -A FORWARD -d 192.168.1.101 -p tcp --dport 12345 -j ACCEPT

注:因为不知道Port Forwarding设置页面是如何自动生成iptables命令行里的实际的动态的外网ip,所以就没在DNAT规则里指定目标ip。

 

参考文章
http://www.blogjava.net/alwayscy/archive/2007/11/18/161423.html

 

分类: Linux, Tomato 标签: , , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
33 + 5 = (必填)