一般LINUX防火墙(iptalbes)的运用无非是用nat 表(PREROUTING、OUTPUT、POSTROUTING)和filter表(FORWARD、INPUT、OUTPUT)。我们只有知道了数据的流向才能正确的配置防火墙。现用一个相对比较直观的图形解释数据的走向。(此处只作最基本的iptables数据流走向说明。)

图释+案例解析 iptables 防火墙_iptables

      上图是你的家,蓝色的圈是你家院子,有两扇大门①⑥进出,你家有两个房间,分别为eth0和 eth1房间,每个房间有两个门可以进出②③④⑤。旁边是张三和李四的家,张三家和李四家之间的往返必须要过你家院子。
      现假设,eth0网卡IP为:192.168.5.1链接内网,eth1网卡IP为:218.100.100.111链接互连网。
      再假设,“张三家”为一个局域网,“李四家”为互连网。进我家院子用PREROUTING,出我家院子用FORWARD,进我家门用INPUT,出我家门用OUTPUT。(当我们的操作是征对服务器本身而言的话,如SSH操作,此时肯定会用到PREROUTING、INPUT和OUTPUT,当数据只是通过服务器去访问别的机器时会用到PREROUTING和FORWARD。)


 又假设,默认这六个门都是关的。生成如下代码。
 ###########################################################################
 *nat
 ################################
 :PREROUTING    DROP  [0:0]
 :OUTPUT         DROP  [0:0]
 :POSTROUTING   DROP  [0:0]
 ################################
 -F
 -Z
 -X
 ### 以后要新增语句请在此处增加。
 -L –v
 COMMIT
 ################################################
 *filter
 ##############################
 :INPUT          DROP  [0:0]
 :FORWARD      DROP  [0:0]
 :OUTPUT        DROP  [0:0]
 ##############################
 -F
 -Z
 -X
 ### 以后要新增语句请在此处增加。
 -L –v
 COMMIT
 ##########################################################################
局域网用户通过服务器共享上网
 (即从张三家到李四家)
 1)首先进①号门,再从⑥号门走出。
-A  PREROUTING –p tcp --dport 80 –j ACCEPT #允许TCP 80端口通过服务器
-A  FORWARD –p tcp --dport 80 –j ACCEPT    #允许TCP80 端口转发
-A  FORWARD –p tcp --sport 80 –j ACCEPT    #允许接收对方为TCP80端口反回的信息
 2)其次,由于我们上网打的是域名,为此有一个公网DNS服务器为我们服务,那当然也要允许内网机器与DNS服务器的数据转发。DNS用UDP 53或者 TCP 53端口。两者用其一个就行。
 -A  PREROUTING –p udp  --dport 53 –j ACCEPT  
 -A  FORWARD –p udp  --dport 53 –j ACCEPT     
 -A  FORWARD –p udp  --sport 53 –j ACCEPT     
 3)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。
 -A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111
允许局域网和公网可以访问服务器的SSH
 假设SSH采用默认端口TCP 22 。此要求相当于要进我的家的TCP 22号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。
-A  PREROUTING –p tcp --dport 22 –j ACCEPT
-A  INPUT –p tcp --dport 22 –j ACCEPT
-A  OUTPUT –p tcp --sport 22 –j ACCEPT
允许内网机器可以登录MSN和QQ。
(MSN和QQ默认是不允许登录的)QQ一般来说可以从TCP 80、8000、443及UDP 8000、4000登录,而MSN可以从TCP 1863、443登录。我们登录MSN和QQ的过程就象上网一样,也是去访问远程服务器的指定端口,故而我们只用数据转发即可。
-A  PREROUTING –p tcp --dport 1863 –j ACCEPT
-A  PREROUTING –p tcp --dport 443 –j ACCEPT
-A  PREROUTING –p tcp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p tcp --dport 1863 –j ACCEPT
-A  FORWARD –p tcp --sport 1863 –j ACCEPT
-A  FORWARD –p tcp --dport 443 –j ACCEPT
-A  FORWARD –p tcp --sport 443 –j ACCEPT
-A  FORWARD –p tcp --dport 8000 –j ACCEPT
-A  FORWARD –p tcp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 8000 –j ACCEPT
-A  FORWARD –p udp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p udp --sport 4000 –j ACCEPT
让内网机器可以收发邮件。
接收邮件是访问远程服务器的TCP 110端口,发送邮件是访问TCP25端口。用数据转发即可。
-A  PREROUTING –p tcp --dport 110 –j ACCEPT
-A  PREROUTING –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --dport 110 –j ACCEPT
-A  FORWARD –p tcp --sport 110 –j ACCEPT
-A  FORWARD –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --sport 25 –j ACCEPT
内部机器对外发布WEB。
 要把内网机器192.168.5.179的WEB对外发布的话,相当于是从外网访问内网。与第1步操作的局域网共享上网相同,只是访问的方向改变了。不是从内网访问外网,而是从外网访问内网。
 当公网访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。当内网机器访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 –dport 80 –j DNAT –to-destination 192.168.5.179:80
(以上两句必须写在 –A PREROUTING –p tcp --dport 80 –j ACCEPT 前面。)
   TCP 80端口的转发在第1步就已做过,此处就不用重复制作了。另外在
 -A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111 之后加上一句:
-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT
为什么要加这句话呢,我的理解是这样的,
公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)
 数据源 :   ip:199.199.199.199   sport:12345
 数据目标:  ip:218.100.100.111   dport 80
此时,通过-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正地址应该是192.168.5.179:80,然后我们通过-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT 目标地址218.100.100.111:80伪装成 192.168.5.179:80 。
 数据源 :   ip:199.199.199.199   sport:12345
 数据目标:  ip:192.168.5.179     dport 80
 
 当192.168.5.179返回数据时:
 数据源 :   ip:192.168.5.179     sport:80
 数据目标:  ip:199.199.199.199   dport 12345
数据经过 -A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111 后,
 数据源 :   ip:218.100.100.111   sport:80
 数据目标:  ip:199.199.199.199   dport 12345

完整的iptables配置
 ###########################################################################
 *nat
 ################################
 :PREROUTING    DROP  [0:0]
 :OUTPUT         DROP  [0:0]
 :POSTROUTING   DROP  [0:0]
 ################################
 -F
 -Z
 -X
 -A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80
 -A PREROUTING –i eth1 –p tcp –d 218.100.100.111 --dport 80 –j DNAT –to-destination 192.168.5.179:80
 -A  PREROUTING –p tcp --dport 80 –j ACCEPT
 -A  PREROUTING –p udp  --dport 53 –j ACCEPT  
 -A  PREROUTING –p tcp --dport 22 –j ACCEPT
 -A  PREROUTING –p tcp --dport 1863 –j ACCEPT
 -A  PREROUTING –p tcp --dport 443 –j ACCEPT
 -A  PREROUTING –p tcp --dport 8000 –j ACCEPT
 -A  PREROUTING –p udp --dport 8000 –j ACCEPT
 -A  PREROUTING –p udp --dport 4000 –j ACCEPT
 -A  PREROUTING –p tcp --dport 110 –j ACCEPT
 -A  PREROUTING –p tcp --dport 25 –j ACCEPT
 -A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111
 -A  POSTROUTING –p tcp --dport 80 –j  ACCEPT
 -L –v
 COMMIT
 ################################################
 *filter
 ##############################
 :INPUT          DROP  [0:0]
 :FORWARD      DROP  [0:0]
 :OUTPUT        DROP  [0:0]
 ##############################
 -F
 -Z
 -X
 -A  INPUT –p tcp --dport 22 –j ACCEPT
 -A  OUTPUT –p tcp --sport 22 –j ACCEPT
 -A  FORWARD –p tcp --dport 80 –j ACCEPT   
 -A  FORWARD –p tcp --sport 80 –j ACCEPT   
 -A  FORWARD –p udp --dport 53 –j ACCEPT     
 -A  FORWARD –p udp  --sport 53 –j ACCEPT  
 -A  FORWARD –p tcp --dport 1863 –j ACCEPT
 -A  FORWARD –p tcp --sport 1863 –j ACCEPT
 -A  FORWARD –p tcp --dport 443 –j ACCEPT
 -A  FORWARD –p tcp --sport 443 –j ACCEPT
 -A  FORWARD –p tcp --dport 8000 –j ACCEPT
 -A  FORWARD –p tcp --sport 8000 –j ACCEPT
 -A  FORWARD –p udp --dport 8000 –j ACCEPT
 -A  FORWARD –p udp --sport 8000 –j ACCEPT
 -A  FORWARD –p udp --dport 4000 –j ACCEPT
 -A  FORWARD –p udp --sport 4000 –j ACCEPT
 -A  FORWARD –p tcp --dport 110 –j ACCEPT
 -A  FORWARD –p tcp --sport 110 –j ACCEPT
 -A  FORWARD –p tcp --dport 25 –j ACCEPT
 -A  FORWARD –p tcp --sport 25 –j ACCEPT
 -L –v 
 COMMIT
 ##########################################################################
其它注意事项
1)在使用iptables防火墙之前,必须先打开IP转发功能。
 # echo “1” > /proc/sys/net/ipv4/ip_forward
2)以上内容(第6步生成的内容)保存到 /etc/sysconfig/iptables文件中。
3)每修改一次iptables文件后,都要重启iptalbes
    # service iptables restart
 以上就是我对iptables的初浅理解,里面的语句已在RedHat 9.0上测试通过

 

Iptables实例图解

 

图释+案例解析 iptables 防火墙_iptables_02
 

#!/bin/bash
#set -x
#zlls
#new gateway
# Enabling IP Forwarding......
#echo "Enabling IP Forwarding........"
echo "1" > /proc/sys/net/ipv4/ip_forward
#ip_forward文件中默认的值为"0",即不打开IP转发功能,改为1即打开IP转发功能

##清除所有规则
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -X -t nat
iptables -X -t mangle

##设置默认规则为全部接受(一般应设置为全部禁止即DROP)
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

###TCP paramete
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
sysctl -w net.ipv4.ip_conntrack_max=1048576 &>/dev/null

iptables -A INPUT -p tcp -d 192.168.1.7 -i eth0 -j ACCEPT
#接受从eth0网口进来的数据,并按指定的iptables规则进行数据跳转即数据转发
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包。
iptables -A INPUT -i eth1 -p icmp -j DROP
#禁止所有eth1网口进来的数据,即对外网ping不回应

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 192.168.1.6
#所有内网地址伪装为192.168.1.6,统一使用此IP地址向外通信

#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
#同上(如果是动态IP则将上面注释去掉)

##IP地址与MAC地址绑定
iptables -I FORWARD -s 192.168.1.251 -m mac --mac-source 00:1F:C6:81:35:6C -j ACCEPT
iptables -I FORWARD -s 192.168.1.249 -m mac --mac-source 00:05:5d:5e:12:03 -j ACCEPT
#IP地址绑定,即IP地址和MAC地址对应才可以访问网络

##放行
iptables -A INPUT -d 123.124.221.162 -j ACCEPT
iptables -A OUTPUT -s 123.124.221.162 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p udp --sport 21 -j ACCEPT
iptables -A OUTPUT -p udp --sport 20 -j ACCEPT

## 端口映射
iptables -t nat -A PREROUTING -d 192.168.1.7 -p tcp --dport 33333 -j DNAT --to 192.168.0.110:3389

##封网站
iptables -I FORWARD -d www.youku.com -j DROP
iptables -I FORWARD -d www.xunlei.com -j DROP
iptables -I FORWARD -d www.baidu.com -j DROP

##封QQ
iptables -I FORWARD -p udp --dport 4000 -j DROP
iptables -I FORWARD -p tcp --dport 4000 -j DROP
iptables -I FORWARD -p udp --dport 8000 -j DROP
iptables -I FORWARD -p tcp --dport 8000 -j DROP
iptables -I FORWARD -d 219.133.48.109 -j DROP
iptables -I FORWARD -d sz3.tencent.com -j DROP
iptables -I FORWARD -d tcpconn.tencent.com -j DROP
iptables -I FORWARD -d http.tencent.com -j DROP
iptables -I FORWARD -d web.qq.com -j DROP

iptables -I FORWARD -p tcp --dport 8000 -d 123.124.221.165 -j ACCEPT
iptables -I FORWARD -p tcp --dport 8000 -d 123.124.221.166 -j ACCEPT

##以上规则对以下IP地址无效
iptables -I FORWARD -s 192.168.1.251 -j ACCEPT

##封IP
iptables -I FORWARD -s 192.168.1.2 -j DROP
iptables -I FORWARD -p udp -s 192.168.1.104 -j DROP
##封传到IP地址192.168.1.104的udp协议