说明
iptables来源:《Linux网络技术》王波(第一版)。中关于iptables的命令介绍。见增补信息。
在使用过程中,并不是一定要按照书中所规定的代码实现需求。而是应该按照好wireshark等能够抓包的软件,然后通过iptables调试和观察,实现最后的调通。
rinetd端口转发
端口转发,比iptables好用的多的工具是rinetd。但是其源码没有找到,无法做重新编译和嵌入式移植。
rinetd的使用方法在https://www.cnblogs.com/llhl/p/9648614.html中有详细的说明。该软件可以自动处理一些跨网段的问题。
假如用户网段10.8.0.0/24,该用户要访问的网段192.168.1.0/24中的192.168.1.111设备。
两个网段之间的网关设备直接写入一条命令,让网关1(如10.8.0.2)导入到192.168.1.111即可(不用写入192.168.1.105(网关2))。
软件自动处理为192.168.1.105去访问192.168.1.111。看不懂也没得关系,反正软件很方便就行了。配合wireshark使用,抓包,观察,排错,调试。
iptablesIP转发开启
首先试一下sysctl -p是不是能使用。
然后修改(创建文件)/etc/sysctl.conf,取消或者写入net.ipv4.ip_forward=1。重新执行sysctl -p。
按道理说,这时候查看/proc/sys/net/ipv4/ip_forward中的值为1,则打开了IP转发功能。
iptables表链
三张表,每张表对应了几条链,还有可以自行创建链。数据进入到网关中,走的是哪一条链路,是否进入到该网关内部,都是应该理解的。
理解需要很多的实际代码操作,这里不再说明。书中有很详细的案例。
iptables常用操作
-A添加 -I插入 -j 动作 -F 清空 -t 选表 -p 策略 等等。详细见增补信息。
iptables做转发
外网段用户访问内网中网段某一个指定机器的数据,需要知道的是,不同网段是无法访问数据的。
代码1:
iptables -t nat -A PREROUTING -p tcp -d 10.8.0.88 --dport 1020 -j DNAT --to 192.168.15.103:1020
该代码存在网关机器上,该网关机器有双网卡。其网卡1为10.8.0.88,网卡2为192.168.15.11。
当外部机器10.8.0.22访问内部网络机器192.168.15.103对应的1020端口时候,发送给网卡机器的数据包的源地址为10.8.0.22,目的地址为10.8.0.88
在网卡机器上,该代码将外部机器访问该网关的数据包数据的目的地址10.8.0.88转变为了192.168.15.103与端口等(此时数据包的源地址为10.8.0.22).
不同网段之间无法访问,所以这里虽然目的地址转变了,但是源地址不合法。10.8.0.22-->192.168.15.103
代码2:
iptables -t nat -A POSTROUTING -p tcp -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 192.168.15.11
该代码位于POSTROUTING上,就是将之前处理过的数据包,源地址为10.8.0.0/24网络段的数据包,转变为192.168.15.11。此时,数据包为:
192.168.15.11-->192.168.15.103,即可完成正向的传递。可以访问数据了。
做转发过程中,需要配合抓包的问题,注意数据包在iptables中的流向表链,确定iptables的代码书写。
额外说明ping的问题
比如a能ping通b,b不能ping通a,可能是a的防火墙问题。(这里指的是redirect host问题)
注意是a的防火墙。尝试关闭防火墙。另外可以检查a的防火墙设置中,入栈出栈规则中,所有禁用或未启用项中,通用里面的,打印机之类的icmp有关设置是否在未启用列表,
设置为允许通过。
增补信息
实例参阅代码
iptables -F iptables -X iptables -A INPUT -p tcp -dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 1194 -j ACCEPT iptables -P FORWARD DROP iptables -P OUTPUT DROP