iptables学习笔记:端口转发之“内网访问外网” | 迟思堂工作室
A-A+

iptables学习笔记:端口转发之“内网访问外网”

2016-09-25 12:41 GNU/Linux系统, 网络方面 暂无评论 阅读 853 次

我们一般使用路由上网,本机IP是内网私有IP,如192.168.1.100/24,而不是公网IP。至于能上网,是因为路由器已经做了转发。本文以实例介绍地址转换,实现内网设备与外部网络通信。有了前文的介绍,就无须介绍太多原理方面的东西了。

先给出网络拓扑图如下:

服务器左边为“内网”,右边为“外网”。中间为服务器(工作站或网关,如无特别说明,下文提到的“服务器”都指这个服务器),服务器的eth1网卡连接内网的设备或PC,eth0连接外网(可以连接互联网),为了做演示,“外网”还添加其它服务器。

一、原理

由前文知道,通过服务器上的每个数据包,都会依次经过三个不同的机制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT),如下图所示:

本文示例的数据包流方向是从eth1到eth0。

二、实验

首先要正确设置服务器IP信息。设置默认网关(仅做示例):

route add default gw 172.18.18.18

并且要设置好服务器DNS。添加(或修改)/etc/resolv.conf文件,内容示例如下:

domain latelee.com.cn
search latelee.com.cn
nameserver 172.18.18.10

其次,在服务器上使能转发,命令如下:

echo "1" > /proc/sys/net/ipv4/ip_forward

最后,在服务器上实现iptables地址转换:

iptables -t nat -A POSTROUTING -o eth0 -s 100.100.100.0/24 -j MASQUERADE

意思是从eth0网卡传出的数据包并且源IP为100.100.100.0/24网段的,源地址都更改为服务器连接外网的IP(此处即为eth0的IP地址)。

此时服务器上iptables的NAT表如下:

root@localhost:test# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  100.100.100.0/24     anywhere

1、内网访问外网的其它服务器

内网设备的默认网关必须为服务器的eth1地址。以下的设备的路由表示例:

root@latelee:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
255.255.255.255 *               255.255.255.255 UH    0      0        0 eth0
100.100.100.0   *               255.255.255.0   U     0      0        0 eth0
default         100.100.100.44  0.0.0.0         UG    0      0        0 eth0

下面是ping测试:

root@latelee:~# ping 172.18.44.144
PING 172.18.44.144 (172.18.44.144): 56 data bytes
64 bytes from 172.18.44.144: seq=0 ttl=63 time=1.011 ms
64 bytes from 172.18.44.144: seq=1 ttl=63 time=1.467 ms
64 bytes from 172.18.44.144: seq=2 ttl=63 time=0.764 ms

下面是telnet测试:

root@latelee:~# telnet 172.18.44.144

Entering character mode
Escape character is '^]'.


Linux 3.13.0-32-generic (localhost) (pts/28)

 

2、内网PC访问互联网

内网PC中正确设置DNS(同上),然后可以ping域名了,测试如下:

root@latelee:~# ping www.latelee.org
PING www.latelee.org (183.60.158.197): 56 data bytes
64 bytes from 183.60.158.197: seq=0 ttl=48 time=20.246 ms
64 bytes from 183.60.158.197: seq=1 ttl=48 time=19.551 ms
64 bytes from 183.60.158.197: seq=2 ttl=48 time=19.207 ms

再跟踪一下路由:

root@latelee:~# traceroute www.latelee.org
traceroute to www.latelee.org.sudu-n7cd.com (183.60.18.107), 30 hops max, 38 byte packets
 1  100.100.100.44 (100.100.100.44)  0.556 ms  0.193 ms  0.182 ms
 2  172.18.18.18 (172.18.18.18)  0.652 ms  0.736 ms  0.768 ms
 3  * * *
 4  10.137.64.19 (10.137.64.19)  2.818 ms  2.475 ms  2.281 ms
 5  10.137.41.210 (10.137.41.210)  16.211 ms  16.298 ms  15.815 ms
 6  10.137.128.10 (10.137.128.10)  15.920 ms  15.668 ms  15.888 ms
 7  10.137.128.13 (10.137.128.13)  37.466 ms  17.123 ms  16.766 ms

(所有IP地址已做一定掩饰)

可以看到,内网设备已能成功连接外网。

四、其它

其实,“内”、“外”只是相对而言。事实上,如果在本文所用的网络拓扑图右边添加一台PC,并将其默认设置网关,在服务器上做好SNAT,就能直接使用“内网”设备IP进行访问了。

注意,本文的服务器所有IP都是静态IP,故默认网关、DNS都要手动设置正确的值才能达到实验目的。在服务器上使用dnsmasq搭建DNS、DHCP服务后,在内网PC上自动获取IP,而DNS配置文件(/etc/resolv.conf)内容为“nameserver 192.168.1.1”,这样可以通过firefox上网。不过那是另外的事了。

参考资料:
《Linux网络安全技术与实现》

李迟 2016.9.25 周日



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言