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很轻松的来实现。
clip_p_w_picpath001
在进行配置之前,先来测试一下两台主机是否可以ping通。
clip_p_w_picpath002
现在就来设置一下,让PC2不能ping通PC1,那么该如何设置呢?
规则如下:设置好之后要记得查看一下是否生效。
clip_p_w_picpath004
再从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了。
clip_p_w_picpath005
当主机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链。
clip_p_w_picpath007
再次用主机PC2来ping主机PC1时,就可以看到显示的结果与前一条命令的不同之处了。
clip_p_w_picpath008
【思考:】如果允许主机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 转发 (将内网地址转换为外网地址)
现在网络需求提高了,我们需要对数据进行端口转发。具体实验环境为三台虚拟机示意图为:
clip_p_w_picpath010
【注:】需要说明的是:PC1 属于内部局域网,PC2 外部网 (我们所处的位置是PC1)
先来搭建实验环境,关于PC1和PC2的设置比较简单,手动配置IP地址就行了,有一点要说明的是PC1的网关指向网卡1 ,同理,PC2的网关要指向网卡2。接下来就是重头戏服务器的配置了。
在设置之前,要保证PC1与服务器可以ping通,PC2与服务器可以ping通。并且在PC1上可以ping通服务器和PC2
clip_p_w_picpath011
为了使PC1能ping通PC2,要打开服务器的路由转发功能。编辑/etc/systcl.conf文件,把net.ipv4.ip_forward=0修改为1。保存退出后,要记得重新读取该文件。命令为:sysctl –p
clip_p_w_picpath012
在PC2 上配置www服务,编辑一个测试页面,并测试配置成功。
clip_p_w_picpath015
 
 
 
clip_p_w_picpath014
 
测试结果显示,在本地访问PC2的www服务是没有任何问题的。
为了使试验的结果明显,在没有进行iptables配置之前,再来从PC1端来访问一下看是否可以成功访问。结果显示如下:
 
clip_p_w_picpath017
 
好了,实验前的所有准备工作都完成了,现在开始实验的重要部分:
 
1、内网访问外网的nat地址转换。具体配置如下:
 
clip_p_w_picpath019
 
使用iptables –t nat –L 来查看一下刚才的配置是否成功。
 
clip_p_w_picpath021
 
再次从PC1上访问PC2,测试是否能访问PC2。
 
clip_p_w_picpath023
 
结果是可以访问PC2的,从PC1的角度来看,配置地址转发与开启服务器的路由功能得到的结果是相同的。那么这两者究竟有什么区别呢?
这个问题可以到PC2上来解决,由于PC2上www的服务会记录来访者的日志,我们可以通过查看一下日志,看看能不能发现这两者的不同之处。如图所示:在四个日志记录中,前两次是本地测试的记录,第三个记录是PC1通过路由器来访问PC2的。第
四个记录是PC1通过地址转换来访问PC2的。现在该明白了吧?
 
clip_p_w_picpath025
实验三 基于目标地址的 NAT 转发 (将外网地址转换成内网地址)
clip_p_w_picpath026
【注:】需要说明的是: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来查看命令是否执行。
 
 
clip_p_w_picpath028
 
重新登陆PC1,使用elinks 192.168.8.100访问PC2的www服务,结果是可以访问到PC2的www服务。切换到PC2上,查看PC2上的www服务访问日志记录,可以看到最后一行的源地址依然是主机PC1的IP地址,并没有发生改变。
 
clip_p_w_picpath030
除此之外,还可以指定目标地址的转发端口。在PC2上,把www默认的服务端口80修改为8080。
用vim编辑器打开位于/etc/httpd/conf,找到Listen 80 这一项,把80修改8080,完成后保存退出即可。
clip_p_w_picpath031
重启www服务,命令为:service httpd restart
然后查看8080端口是否打开,命令为:netstat –tunl
clip_p_w_picpath033
 
清除所有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
执行完成后,记得查看是否添加成功。
 
clip_p_w_picpath035
 
重新登陆PC1,使用elinks 192.168.8.100访问
PC2的www服务,结果是仍然可以正常访问到PC2的www服务。切换到PC2上,查看PC2上的www服务访问日志记录,可以看到最后一行的源地址依然是主机PC1的IP地址,并没有发生改变。