linux下iptables的重要性大家都不陌生吧?今天就以实验的形式把iptables的基本配置简要总结一下,还请大家不吝赐教,多多斧正才好!有关iptables的具体语法和格式将在理论部分具体阐述,在这里就不赘述了。



先来回顾一下iptables的语法格式:



iptables [ -t table ] COMMAND chains [ num ] match condition –j Action



table 表示的是一个表名,例如:filter nat mangle 等。



COMMAND 对链规则进行管理,常用参数为:-A -I -R -D等。



若要对链本身进行管理,则常用参数为: -F -P -N -X 等。



match condition 表示匹配规则。



Action 表示要执行的动作。



例如:



iptables –t filter -A OUTPUT –s 192.168.0.83 –d 192.168.0.82 –p tcp –dport 80 –j REJECT



闲话少说,开始做实验吧!



实验一:用 iptables 链拒绝主机 ping



所搭建的实验环境为:两台RehHat linux虚拟机。



IP地址分别为:192.168.0.82 192.168.0.86



在默认情况下,两台虚拟机是可以互相ping通的,现在我们为了模拟真实环境,假定192.168.0.82的主机为服务器,192.168.0.86的主机为客户机,为了保证服务器的安全,我不允许客户机来ping我的服务器。所以呢,我们目的是让这两台虚拟机不能ping通,我们可以用iptables很轻松的来实现。



iptables 版本 iptables destination_服务器



在进行配置之前,先来测试一下两台主机是否可以ping通。



iptables 版本 iptables destination_服务器_02



现在就来设置一下,让PC2不能ping通PC1,那么该如何设置呢?



规则如下:设置好之后要记得查看一下是否生效。



iptables 版本 iptables destination_IP_03



再从PC2上ping 一下PC1,结果显示是没有反应。



上面的iptables链的意思就是说:当来自192.168.0.86主机通过ICMP协议来链接192.168.0.82主机时,PC1所做的动作是DROP(忽略:既不响应,也不拒绝)。打个比方吧:PC2对PC1打招呼(PC2 尝试pingPC1),但是PC1就是不理你,把PC2当空气了(iptables链所定义的规则)。因此,主机PC2当然不能ping通主机PC1了。



iptables 版本 iptables destination_iptables 版本_04



当主机PC2来ping主机PC1时,PC1的反应还有可能是立即拒绝PC2,命令为:



iptables –t filter -A INPUT –s 192.168.0.86 –d 192.168.0.82 -p icmp --icmp-type 8



-j REJECT



添加完命令时要养成查看,命令是否添加成功的好习惯。



【注:】与前面一幅图对比,可以发现执行iptables –L –t命令后,显示的结果仍然是一条,因为在写iptables链之前,执行了iptables –F的命令,因此,就可以知道iptables —F 命令的意思就是清除上一次的iptables链。



iptables 版本 iptables destination_服务器_05



再次用主机PC2来ping主机PC1时,就可以看到显示的结果与前一条命令的不同之处了。



iptables 版本 iptables destination_iptables 版本_06



【思考:】如果允许主机PC2可以ping通主机PC1,该如何设置呢?



对啦!就是把第二条iptables链中的REJECT改为ACCEPT就行了。



【拓展:】上面的实验是对进入PC1的ping数据进行拒绝,如果不想让PC1的ping数据外界发送,那么命令就要改为:



iptables –t filter –A OUTPUT –s 192.168.0.82 –d 192.168.0.86 –p icmp –icmp-type 0



-j REJECT



由于上面的实验中设置的是不允许ping数据进入主机PC1,那么也就谈不上PC1向外界发送数据了。



实验二:基于源地址的 NAT 转发 (将内网地址转换为外网地址)



现在网络需求提高了,我们需要对数据进行端口转发。具体实验环境为三台虚拟机示意图为:



iptables 版本 iptables destination_iptables 版本_07


【注:】需要说明的是:PC1 属于内部局域网,PC2 外部网 (我们所处的位置是PC1)



先来搭建实验环境,关于PC1和PC2的设置比较简单,手动配置IP地址就行了,有一点要说明的是PC1的网关指向网卡1 ,同理,PC2的网关要指向网卡2。接下来就是重头戏服务器的配置了。



在设置之前,要保证PC1与服务器可以ping通,PC2与服务器可以ping通。并且在PC1上可以ping通服务器和PC2



iptables 版本 iptables destination_服务器_08



为了使PC1能ping通PC2,要打开服务器的路由转发功能。编辑/etc/systcl.conf文件,把net.ipv4.ip_forward=0修改为1。保存退出后,要记得重新读取该文件。命令为:sysctl –p



iptables 版本 iptables destination_iptables 版本_09



在PC2 上配置www服务,编辑一个测试页面,并测试配置成功。





iptables 版本 iptables destination_IP_10



 



 



 



iptables 版本 iptables destination_服务器_11



 



测试结果显示,在本地访问PC2的www服务是没有任何问题的。



为了使试验的结果明显,在没有进行iptables配置之前,再来从PC1端来访问一下看是否可以成功访问。结果显示如下:



 



iptables 版本 iptables destination_服务器_12



 



好了,实验前的所有准备工作都完成了,现在开始实验的重要部分:



 



1、内网访问外网的nat地址转换。具体配置如下:



 



iptables 版本 iptables destination_iptables 版本_13



 



使用iptables –t nat –L 来查看一下刚才的配置是否成功。



 



iptables 版本 iptables destination_IP_14



 



再次从PC1上访问PC2,测试是否能访问PC2。



 



iptables 版本 iptables destination_iptables 版本_15



 



结果是可以访问PC2的,从PC1的角度来看,配置地址转发与开启服务器的路由功能得到的结果是相同的。那么这两者究竟有什么区别呢?



这个问题可以到PC2上来解决,由于PC2上www的服务会记录来访者的日志,我们可以通过查看一下日志,看看能不能发现这两者的不同之处。如图所示:在四个日志记录中,前两次是本地测试的记录,第三个记录是PC1通过路由器来访问PC2的。第



四个记录是PC1通过地址转换来访问PC2的。现在该明白了吧?



 



iptables 版本 iptables destination_外网_16



实验三 基于目标地址的 NAT 转发 (将外网地址转换成内网地址)



iptables 版本 iptables destination_服务器_17



【注:】需要说明的是:PC1 属于外网,PC2 内部局域网 (我们所处的位置是PC2)



千万不可与前面实验二搅合到一起了,这是两个完全独立的实验,借用前面的所搭建的实验环境和示意图,只是为了节省时间,还请见谅!



实验开始前还是测试PC1可以ping通PC2,以及测试PC1可以访问PC2的www服务。在这里就省略测试连通性的步骤。



执行iptables –F命令清除所有已经存在的iptables链。实验环境搭建好了,现在就可以直接进行配置iptables链了。命令如下:



iptables –t nat –A PREROUTING –s 192.168.0.0/24 –d 192.168.8.82 –p tcp –dport 80 –j DNAT –-to-dest 192.168.8.100



使用iptables -t nat –L来查看命令是否执行。



 



 



iptables 版本 iptables destination_外网_18



 



重新登陆PC1,使用elinks 192.168.8.100访问PC2的www服务,结果是可以访问到PC2的www服务。切换到PC2上,查看PC2上的www服务访问日志记录,可以看到最后一行的源地址依然是主机PC1的IP地址,并没有发生改变。



 



iptables 版本 iptables destination_IP_19



除此之外,还可以指定目标地址的转发端口。在PC2上,把www默认的服务端口80修改为8080。



用vim编辑器打开位于/etc/httpd/conf,找到Listen 80 这一项,把80修改8080,完成后保存退出即可。



iptables 版本 iptables destination_外网_20



重启www服务,命令为:service httpd restart



然后查看8080端口是否打开,命令为:netstat –tunl



iptables 版本 iptables destination_服务器_21



 



清除所有iptables链,然后写一条新的iptables链,命令为:



iptables –t nat –A PREROUTING –s 192.168.0.0/24 -d 192.168.0.82 –p tcp –dport 80 –j DNAT



--to-dset 192.168.8.100:8080



执行完成后,记得查看是否添加成功。



 



iptables 版本 iptables destination_iptables 版本_22



 



重新登陆PC1,使用elinks 192.168.8.100访问



PC2的www服务,结果是仍然可以正常访问到PC2的www服务。切换到PC2上,查看PC2上的www服务访问日志记录,可以看到最后一行的源地址依然是主机PC1的IP地址,并没有发生改变。



 



iptables 版本 iptables destination_外网_23


转载于:https://blog.51cto.com/linuxtro/279334