iptables学习笔记:端口转发之“内网访问外网”
我们一般使用路由上网,本机IP是内网私有IP,如192.168.1.100/24,而不是公网IP。至于能上网,是因为路由器已经做了转发。本文以实例介绍地址转换,实现内网设备与外部网络通信。有了前文的介绍,就无须介绍太多原理方面的东西了。
并且要设置好服务器DNS。添加(或修改)/etc/resolv.conf文件,内容示例如下:
最后,在服务器上实现iptables地址转换:
意思是从eth0网卡传出的数据包并且源IP为100.100.100.0/24网段的,源地址都更改为服务器连接外网的IP(此处即为eth0的IP地址)。
下面是ping测试:
下面是telnet测试:
(所有IP地址已做一定掩饰)
先给出网络拓扑图如下:
服务器左边为“内网”,右边为“外网”。中间为服务器(工作站或网关,如无特别说明,下文提到的“服务器”都指这个服务器),服务器的eth1网卡连接内网的设备或PC,eth0连接外网(可以连接互联网),为了做演示,“外网”还添加其它服务器。
一、原理
由前文知道,通过服务器上的每个数据包,都会依次经过三个不同的机制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT),如下图所示:
本文示例的数据包流方向是从eth1到eth0。
二、实验
首先要正确设置服务器IP信息。设置默认网关(仅做示例):
- route add default gw 172.18.18.18
- domain latelee.com.cn
- search latelee.com.cn
- nameserver 172.18.18.10
其次,在服务器上使能转发,命令如下:
- echo "1" > /proc/sys/net/ipv4/ip_forward
- iptables -t nat -A POSTROUTING -o eth0 -s 100.100.100.0/24 -j MASQUERADE
此时服务器上iptables的NAT表如下:
- [email protected]: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地址。以下的设备的路由表示例:
- [email protected]:~# 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
- [email protected]:~# 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
- [email protected]:~# 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域名了,测试如下:
- [email protected]:~# 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
再跟踪一下路由:
- [email protected]:~# 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
可以看到,内网设备已能成功连接外网。
四、其它
其实,“内”、“外”只是相对而言。事实上,如果在本文所用的网络拓扑图右边添加一台PC,并将其默认设置网关,在服务器上做好SNAT,就能直接使用“内网”设备IP进行访问了。
注意,本文的服务器所有IP都是静态IP,故默认网关、DNS都要手动设置正确的值才能达到实验目的。在服务器上使用dnsmasq搭建DNS、DHCP服务后,在内网PC上自动获取IP,而DNS配置文件(/etc/resolv.conf)内容为“nameserver 192.168.1.1”,这样可以通过firefox上网。不过那是另外的事了。
参考资料:
《Linux网络安全技术与实现》