1. 如果数据包的目的地址是本机,则系统数据包送往Input链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。    
2. 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往Forward链。如果通过规则检查,则该包被发给相应的本地进程处理; 如果没有通过规则检查,系统就会将这个包丢掉。    
3. 如果数据包是由本地系统进程产生的,则系统将其送往Output链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。

input– 用于处理进入路由器的数据包,即数据包目标IP地址是到达路由器一个接口的IP地址,经过路由器的数据包不会在input-chains处理。    
forward– 用于处理通过路由器的数据包    
output– 用于处理源于路由器并从其中一个接口出去的数据包。

http://www.zdh1909.com/html/Cisco/19041.html

Iptables 应用解析I---Filter

至于iptables是什么,干什么用的,这里就不介绍了.感兴趣的朋友可以Google一下.下面这张图是我在互联网CP过来的基本可以描述iptables防火墙的工作流程!

数据从网卡穿过IP层必经过链PREROUTING,再经过路由选择接收还是转发,分别走INPUT FORWARD不同的链.

从INPUT链经过的数据包进入本地系统进行处理,从本地系统出来经OUTPUT的数据和转发FORWARD出来的数据经由POSTROUTING链发出穿越IP数据层.

iptables主要功能就是在数据穿越IP层时在各链上对数据包进行规则限制.根据规则的不同的功能形成三种不同功能的表nat mangle filter,三个表常作用的链图已标明,通过这三个表可以很方便的对数据包进行管理过滤.

以下以实例形式对Filter进行讲解:

Filter 包过滤功能

filter表是专门过滤包的,内建三个链,可以对包进行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。

#iptables -t filter -A INPUT -s 10.0.0.5 -j DROP 凡是来自10.0.0.5包丢弃

#iptables -t filter -nL INPUT -V 查看INPUT链的filter详细(-V)规则 并显示IP不做解析(-n)

#iptables -t filter -F INPUT 清空INPUT中filter规则

#iptables -I INPUT 1 -s 10.0.0.4 -j DROP 丢弃来自10.0.0.4的包并成为规则的第一项 缺省filter

#iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT

#iptables -A FORWARD -m iprange --dst-range 10.0.0.0-10.255.255.255 -j ACCEPT

以上二例是允许目标ip/源ip地址范围的包通过

#iptables -t filter -D INPUT 2 删除第二条规则

#iptables -t filter -P FORWARD DROP 修改FORWARD链的缺省策略

注: -I 指所有规则前插入(优先起作用) -A表插入到表末(iptables -nL可看出)

#iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

#iptables -A FORWARD -i eth0 -o eth1 -p udp -j DROP 凡是从外网(eth0)去DMZ(eth1)的udp包丢弃

注:当条件中有-p 协议号时 后可有更详细的匹配

A: -p icmp icmp扩展即被装入 可指定icmp类型(类型详见#iptables -p icmp -h)

例:iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j DROP 不允许ping主机

B: -p udp udp扩展装入 --sport/dport [!] port[:port] 单个端口或一端口范围

例:#iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT 开放www

C: -p tcp 同上格式 重点匹配 --tcp-flags [!] mask comp mask关第状态位 comp为1的状态位

例:#iptables -t filter -A FORWORD -i eth0 -o eth1 -p tcp

--tcp-flags SYN,ACK,FIN,RST SYN -j DROP 此行可改为 --syn -j DROP 即第二次握手匹配

另有些功能需安装模块(不常用)

1.#...-p tcp --tcp-flags SYN,ACK,FIN,RST ACK -m length --length 40:60

选出数据包长在40--60 byte的纯ACK包(打上标记QD处优先发出)

2.#iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/sec -j ACCEPT

#iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j DROP

此二句顺序使用表示只接收每秒2次的ping请求,超过丢弃(一个ping每秒发一ping包,可用多个ping 命令实现).

3.#iptables -t filter -A INPUT -m mac --mac-source 00:5E:3C:4B:28:E4 (PR FO IN三链可用)

4.# -m owner --uid/gid -owner userid/groupid 由哪个用户/用户组发出的包

# -m owner --cmd-owner squid 由squid命令发出的包

5.# -m physdev --physdev -in 具体指定网桥内的哪块物理网卡

6.#iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

常用于链的首位表若此数据包属于已知流或相关流则匹配常用于NAT网关FORWARD链第一条..

需要打补丁的功能(当然需要安装模块)

7.控制并发连接应用

#iptables -A FORWARD -i * -o * -p tcp --syn -m connlimit --connlimit-abve 5 -j DROP

限制并发数为5 默认-t filter 此处省略

注:-j REJECT 亦丢弃 但发ICMP给发包方通知 公网不用

#iptables -I FORWARD -s 192.168.1.189 -p tcp --syn --dport 80

-m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP

8.匹配限额

#iptables -t filter -A FORWORD -d 10.0.0.5 -m quota --quota 100000000 -j ACCEPT

#iptables -t filter -A FORWORD -d 10.0.0.5 -j DROP

此二句顺序使用限制单个IP下载量

#iptables -I FORWARD -s 192.168.1.189 -p tcp --dport 80 -m quota --quota 500 -j DROP

#iptables -I FORWARD -s 192.168.1.189 -p tcp --dport 80 -m quota --quota 500 -j ACCEPT

9.#iptables -t filter -A FORWORD -d 10.0.0.9 -m random --average 1 -j DROP

去往10.0.0.9的包丢率为1% linux模拟网络延迟功能

10.封杀BT类P2P软件

#iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP

#iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP

#iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP

11.CDN对下载的限制示例

#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP

#iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS

-update --seconds 60 --hitcount 30 -j REJECT

同一IP允许5个并发链接 60秒内限制30次

自定义子链

子链的应用平常工作中尚未用到,以下培训时针对子链应用的一脚本.

#iptables -t filter -N/-X 链名(自定) 新链的创建/删除

#!/bin/sh

mychain=BLACK_IP

conf=/root/black_list

if ! iptables -t filter -L $mychain >/dev/null 2>&1;then

iptables -t filter -N $mychain 新建子链

iptables -t filter -I INPUT -j $mychain 在INPUT链中加子链

iptables -t filter -I FORWARD -j $mychain

iptables -t filter -F $mychain

for ip in `cat $conf`;do 此循环定义子链中的规则

iptables -t filter -A $mychain -s $ip -j DROP

done

fi

由于篇幅问题,对于表NAT Mangle的解析只能留到下一篇再作介绍.

http://blog.sina.com.cn/s/blog_417b97470100a816.html

Iptables 应用解析II---NAT/Mangle

上篇Filter的解析已是一周前的事了,上周一直比较忙也没时间整理繁琐的笔记.呵呵,这周补上吧!

接上篇Filter来介绍NAT Mangle的功能及用法.亦附上数据穿越IP层的示意图:

1.NAT --- Network Address Translation 网络地址转换

网络地址转换即改变数据包的源/目的地址,做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被 NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,OUTPUT链改变本地产生的包的目的地址,POSTROUTING链在包就要离开防火墙之前改变其源 地址。

所以NAT分为SNAT DNAT SANT作用只限于POSTROUTING 而DANT作用于PREROUTING OUTPUT

 A.SNAT 源地址NAT

常用于linux网关

例:内网10.0.0.0/8  外网192.168.14.14/24 内网通过此外网机器访问外网

 #iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j SNAT --to 192.168.14.14 网关

凡是来自内网10.0.0.0/8的包,把src换成192.168.14.14转发出若把 -j SNAT --to 192.168.14.14

换为MASQUERDE 适合动态可变的IP,即根据本机路由选择IP 注:DNAT由网关192.168.14.14自动完成

 B.DNAT 目的地址NAT

常用于解决内网的Server发布内网端口的映射

例:内网:10.0.0.2/8:80  外网:192.168.14.14/24:8001

 #iptables -t nat -A PREROUTING -d 192.168.14.14 -p tcp --dport 8001 -j DNAT --to 10.0.0.2:80

凡目的地址为192.168.14.14:8001的数据包目的地址改为10.0.0.2:80

注:--to [ipaddr]-[ipaddr] [:port-port] 可多IP(范围)作负载均衡(轮转),但存在单点故障

 #iptables -t filter -A FORWARD -p udp -j DROP

 #iptables -t nat -A PREROUTING -s 10.0.0.0/8 -p udp --dport 53 -j DNAT --to 192.168.14.254

上面二条规则限制网关将不转发udp包,内网的任何DNS查询将被发往指定的企业DNS服务器,实现DNS的透

明代理.

 #iptables -t nat -A PREROUTING -s 10.0.0.0/8 -p tcp

                       --dport 80 -j DNAT --to 192.168.14.14:3128 此句实现web透明代理

 #iptables -t nat -I PREROUTING -m mac --mac-source 00:1A:A0:98:B1:6E -j DROP

 #iptables -A FORWARD -i eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT 网关常用

 #iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 端口NAT

 #iptables -A FORWARD -s 192.168.1.189 -m limit –limit 20/s -j ACCEPT  
 #iptables -A FORWARD -s 192.168.1.189 DROP 以二句用在网关上限速..

 iprange模块的应用..

   #iptables -t nat -I PREROUTING -i eth2 -m iprange

                        --src-range 192.168.1.102-192.168.1.102 -j ACCEPT

   #iptables -t nat -A PREROUTING -m iprange --src-range 192.168.0.20-192.168.0.255

                          -i eth1 -p tcp -m tcp --dport 1:65535 -j REDIRECT --to-ports 80

 string模块的应用..

   #iptables -I FORWARD -s 192.168.1.189 -m string --string "qq.com" -j DROP

                        -m comment --comment "denny go to qq.com"

   #iptables -I FORWARD -m string --string "腾讯" -j DROP

   #iptables -I FORWARD -s 192.168.1.189 -m string --string "qq.com" -j DROP

   #iptables -I FORWARD -p tcp --sport 80 -m string --string "广告" -j DROP

 comment模块的应用..

   #iptables -I FORWARD -s 192.168.1.189 -p tcp --dport 80 -j DROP

                       -m comment --comment "the bad guy can not online"

#iptables -I FORWARD -s 192.168.3.159 -m string --string "qq.com" -j DROP

                       -m comment --comment "denny go to qq.com"

其它常应用:

 #iptables -t nat -I PREROUTING -p udp --dport 53 -j ACCEPT

 #iptables -t nat -I PREROUTING -p tcp --dport 80 -j ACCEPT

 #iptables -t nat -I PREROUTING -p gre -j ACCEPT  
 #iptables -t nat -I PREROUTING -p icmp -j ACCEPT

 #iptables -A INPUT -i tun+ -j ACCEPT  
 #iptables -A FORWARD -i tun+ -j ACCEPT

2.Mangle 数据包高级管理

这个表主要用来mangle数据包。我们可以改变不同的包及包头的内容,比如 TTL,TOS或MARK。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTINGPOSTROUTINGOUTPUTINPUTFORWARDPREROUTING在包进入防火墙之后、路由判断之前改变包,POSTROUTING是在所有路由判断之后。 OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的TTL,TOS或MARK,而不是其源目地址。

 Mangle不常用,主要用来打标记,只用于本地.

 #-j MARK --set-mark value

 #iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 9

在mangle中给从eth1进入的数据包打上标记9

 #iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21

                                                    -s 10.89.9.0/24 -j MARK --set-mark 1  
 #iptables -t mangle -A  PREROUTING -p ALL -d  192.168.1.0/24

                               -m state --state ESTABLISHED,RELATED -j MARK --set-mark 4

例:优先发出ACK数据包 标记为13

 #tc fi add dev eth0 parent 1: pref 1000 protocol ip handle 13 fw flowid 1:1

 #iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST ACK -m length --length

     40:60 -j MARK --set-mark 13

至此简单介绍linux iptables的一般应用,当然介绍肯定不全,是针对于我个人的工作来讲解,算是笔记吧!

不足之处请大家提出宝贵见意,不甚感谢!

http://blog.sina.com.cn/s/blog_417b97470100aahw.html

Iptables 应用解析III---实例详解

介绍三篇iptables应用的例子,工作中可能会用到.

1.SSH 客户端登陆限制

 #!/bin/sh

 /etc/init.d/iptables stop  
 sleep 1    
 /etc/init.d/iptables start

/sbin/modprobe ip_conntrack  
 sleep 1    
echo 81920000 > /proc/sys/net/ipv4/ip_conntrack_max

 cd /root/iptables  
 iptables -F    
 iptables -A INPUT -p tcp --dport 22 -j DROP    
 while read line    
 do    
         iptables -I INPUT -p tcp --dport 22 -s $line -j ACCEPT    
 done < acc_list

此例中acc_list文件是允许登陆的IP段列表,按行存放.ip_conntrack模块有些iptables版本需加载.

对ip_conntrack_max尽量大,防止局域网内的p2p下载导致无法上网.

 ip_conntrack参考文档:Iptables---ip_conntrack的解析

2. Linux 网关实例

自己搭建的一个linux网关,脚本名firewal.sh,内容如下:

   #/bin/sh

   # load modules 有些modules根据内核版本的不同可选择性添加  
   /sbin/depmod -a

   /sbin/modprobe ipt_MASQUERADE  
   /sbin/modprobe ip_tables    
   /sbin/modprobe iptable_filter    
   /sbin/modprobe iptable_nat    
   /sbin/modprobe ipt_limit    
   /sbin/modprobe ipt_state    
   /sbin/modprobe ip_conntrack_ftp    
   /sbin/modprobe ip_conntrack    
   /sbin/modprobe ip_nat_ftp

   echo 1 > /proc/sys/net/ipv4/ip_forward

   echo 1 > /proc/sys/net/ipv4/tcp_syncookies

   echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog  
   echo "1048576" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max    
   echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range    
   #echo "100 1200 128 512 15 5000 500 1884 2" > /proc/sys/vm/bdflush    
   echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts    
   echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses    
   echo "268435456" >/proc/sys/kernel/shmall    
   echo "536870912" >/proc/sys/kernel/shmmax    
   echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established    
   echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1    
   echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2    
   echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3    
   echo "52428800" > /proc/sys/net/ipv4/route/max_size    
   echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp    
   echo "1" > /proc/sys/net/ipv4/tcp_window_scaling    
   #######################################################################

   # flush all the rules in the filter and nat tables.

注:脚本用crontab执行时有时需指全iptables全路径...  
   iptables -F

   iptables -t nat -F

   iptables -t mangle -F

   # erase all chains that's not default in filter and nat table.

   iptables -X  
   iptables -t nat -X    
   iptables -t mangle -X

   iptables -Z  
   iptables -P FORWARD DROP 一般做NAT FORWARD默认DROP..INPUT跟OUTPUT皆可DROP    
   iptables -P INPUT DROP              
   #######################################################################    
   iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    
   iptables -A INPUT -p tcp -m multiport --dports 110,8080,80,25,22 -j ACCEPT    
     #允许内网samba,smtp,pop3,连接

   iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT  
     #允许dns连接

   iptables -A INPUT -p tcp --dport 1723 -j ACCEPT  
   iptables -A INPUT -p gre -j ACCEPT    
     #允许外网***连接

   iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO

     --log-prefix "ICMP packet IN: "  
   iptables -A INPUT -p icmp -m limit --limit 6/m -j ACCEPT    
   iptables -A INPUT -p icmp -j DROP    
     #设置icmp阔值 ,并对***者记录在案

   iptables -A INPUT -i eth1 -p tcp --dport 22  -j DROP  
     #拒绝外网对22端口访问.

   iptables -N syn-flood  
   iptables -A INPUT -p tcp --syn -j syn-flood    
   iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN    
   iptables -A syn-flood -j REJECT    
     #防止SYN***(轻量)

   iptables -I INPUT -s 192.168.1.189 -j ACCEPT 允许189连接此网关服务器  
   #######################################################################    
   iptables -A FORWARD -p tcp -i eth1 -m multiport --dports 80,110,21,25,1723 -j ACCEPT    
   iptables -A FORWARD -p udp -i eth1 --dport 53 -j ACCEPT    
   iptables -A FORWARD -p gre -i eth1 -j ACCEPT    
   iptables -A FORWARD -p icmp -i eth1 -j ACCEPT    
     #允许***客户走***网络连接外网    
   iptables -I FORWARD -i eth0 -m iprange --src-range 192.168.1.2-192.168.1.100 -j ACCEPT    
   iptables -I FORWARD -s 192.168.1.121 -j ACCEPT  

   iptables -A FORWARD -i eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT

     #只允许规定数据包转发..即只允许内网规定的IP上网...

   iptables -t nat -A POSTROUTING  -s 192.168.1.0/24 -j SNAT --to-source 173.52.147.35

注:以下为针对性的一些功能...

   #缩短SYN- Timeout时间:  
     iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT    
     iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT

3.企业linux网络环境(互联网文档整理)

环境:某企业租用DDN专线上网,网络拓扑如下:  
   +--------------+    
   | 内部网段 | eth1+--------+eth0 DDN    
   | +------------|firewall|<===============>;Internet    
   | 198.168.80.0 | +--------+    
   +--------------+    
   eth0: 198.199.37.254    
   eth1: 198.168.80.254    
以上的IP地址都是Internet上真实的IP,故没有用到IP欺骗。并且,我们假设在内部网中存在以下服务器:    
 www服务器:www.yourdomain.com 198.168.80.11    
 ftp服务器:ftp.yourdomain.com 198.168.80.12    
 email服务器:mail.yourdomain.com 198.168.80.13    
此例中主要是对内部的各种服务器提供保护。

 #!/bin/sh  
 echo "Starting iptables rules..."    
 #Refresh all chains    
 /sbin/iptables -F

 #首先禁止转发任何包,然后再一步步设置允许通过的包。  
 /sbin/iptables -P FORWARD DROP    
 #WWW服务:服务端口为80,采用tcp或udp协议。规则为:eth0=>;允许目的为内部网WWW服务器的包。

 #Allow www request packets from Internet clients to www servers  
 /sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT  
 #FTP服务采用tcp协议。规则为:eth0=>;仅允许目的为内部网ftp服务器的包。

 #Allow ftp request packets from Internet clients to Intranet ftp server  
 /sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT    
 #smtp端口为21,采用tcp协议。eth0=>;仅允许目的为email服务器的smtp请求。    
 /sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT    
 #定义Internet对Intranet客户的返回包    
 /sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT    
 /sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT    
 /sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT

 #说明:第一条允许Intranet客户采用消极模式访问Internet的FTP服务器;第二条接收来自Internet的非连接请求tcp包;最后一条接收所有udp包,主要是针对oicq等使用udp的服务。  
 #接受来自整个Intranet的数据包过虑    
 /sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT  
 #接受所有的ip碎片采用limit匹配扩展对单位时间通过的ip碎片数量进行限制,防止ip碎片***.  

 /sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

 #对不管来自哪里的ip碎片都进行限制,允许每秒通过100个ip碎片,该限制触发的条件是100个ip碎片。  
 #设置icmp包过滤 通常用于网络测试

 /sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

 #说明:对不管来自哪里的icmp包都进行限制,允许每秒通过一个包,该限制触发的条件是10个包

 Iptables学习到此也就结束了,当然要想更好的掌握iptables防火墙的高级应用,亦需进行更深的研究.这三篇文档权当是基础,作个参考.不足之处,日后工作中补足,也希望朋友们看过后留下宝贵的建议.不甚感激!

http://blog.sina.com.cn/s/blog_417b97470100aakc.html

Iptables---ip_conntrack的解析

网友对于博文Iptables 应用解析III---实例详解的问题.本来已回评论作解答,无奈评论怎么也显示不到正文中,不知道新浪博客出了什么问题,在此作一博文.希望关心此问题的网友们能满意...

 ip_conntrack 是Linux NAT一个跟踪连接条目的模块记录着允许的跟踪连接条目ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且预设 timeout 时间长达五天 (432,000 秒).所以局域网中当有人使用p2p类的软件就很容易使ip_conntrack达到最大值...也由此造成:

 ip_conntrack: table full, dropping packet.  的错误提示..网关丢弃数据包..网络中断..

具体解决办法如下二种:

1.加大ip_conntrack_max设定值  
 #modprobe ip_conntrack 需提前加载ip_conntrack模块    
 #echo "986400" > /proc/sys/net/ipv4/ip_conntrack_max 数值具体多大应计算得出    
开机使用新数值..有三种办法:    
除vi /etc/rc.local外亦有:    
 #vi /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 986400    
 #sysctl -w net.ipv4.ip_conntrack_max=986400

2.减小ip_conntrack timeout 的时限 默认5天即432000s

 ip_conntrack_tcp_timeout_established 值默认432000s 即5天  
 #echo "3600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established    
开机使用同于上例    
 #vi /etc/sysctl.conf 加入: net.ipv4.ip_tcp_timeout_established = 3600    
 #sysctl -w net.ipv4.ip_tcp_timeout_established=3600

另:通过ip_conntrack buffer 使用状况查出局域网中进行p2p下载的主机

查看目前 ip_conntrack buffer 使用状况  
   #grep conn /proc/slabinfo

结果实例: ip_conntrack 5918 8140 384 10 1:tunables 54 27 0:slabdata 814 814 0 (各值说明如下)

   ip_conntrack the cache name  
   5918 the number of currently active objects    
   8140 the total number of available objects    
   384 the size of each object in bytes    
   814 the number of pages with at least one active object    
   814 the total number of allocated pages    
   1 the number of pages per slab are given

 man slabinfo 可查询详细说明.

查出目前 ip_conntrack 记录最多的前五名 IP  
   #cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c |

     sort -nr | head -n 5

结果实例:

  2987 192.168.1.30  
   334 192.168.1.52    
   166 192.168.1.56    
    99 192.168.1.43    
    84 192.168.1.46

由此可知, 192.168.1.30占用了绝大多数的ip_connect buffer,推断这个IP的User可能使用了P2P软件

推荐一个清除某IP链接的方法:通过过滤ip_conntrack表得到ESTABLISHED状态过多的ip,用hping工具将这些ip从表中清理掉...

下载: http://www.hping.org/download.html  
安装: ./configure;make;make install

 hping清理IP链接脚本:(此脚本修改链接状态为closed)

   #!/bin/sh

     if [ -z $1 ] ; then  
             echo "NO INPUT IP"    
             exit    
     fi    
     grep -E "^tcp .{10,25}ESTABLISHED src=$1 " /proc/net/ip_conntrack | while read line; do

     S_IP=`echo $line | awk '{print substr($5,5)}'`  
     S_SOCK=`echo $line | awk '{print substr($7,7)}'`    
     D_IP=`echo $line | awk '{print substr($6,5)}'`    
     D_SOCK=`echo $line | awk '{print substr($8,7)}'`    
     echo "$S_IP:$S_SOCK $D_IP:$D_SOCK"  
     hping2 $D_IP -R -s $S_SOCK -p $D_SOCK -a $S_IP -k -c 1 > /home/huaying/1.log 2>&1 &  
     done

对于具体p2p下载产生链接数及ip_connect_max具体设置数值大小推荐以下范文,感兴趣的朋友可以看看...http://www.chinaunix.net/jh/36/596067.html

附:linux NAT 性能优化常用设置...

 #echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range

 #echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

 #echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts  
 #echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

 #echo "1048576" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max  
 #echo "1" > /proc/sys/net/ipv4/ip_forward

 #echo "268435456" >/proc/sys/kernel/shmall  
 #echo "536870912" >/proc/sys/kernel/shmmax    
 #echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established    
 #echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1    
 #echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2    
 #echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3    
 #echo "52428800" > /proc/sys/net/ipv4/route/max_size

 #echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp  
 #echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

http://blog.sina.com.cn/s/blog_417b97470100akjx.html

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工 作原理,你会发现其实它很简单。

首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。  
图: IPTables Table, Chain, and Rule Structure

一、iptables的表与链

iptables具有Filter, NAT, Mangle, Raw四种内建表:

1. Filter表

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

  • INPUT – 处理来自外部的数据。

  • OUTPUT – 处理向外发送的数据。

  • FORWARD – 将数据转发到本机的其他网卡设备上。

2. NAT表

NAT表有三种内建链:

  • PREROUTING – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。

  • POSTROUTING – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。

  • OUTPUT – 处理本机产生的数据包。

3. Mangle表

Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:

  • PREROUTING

  • OUTPUT

  • FORWARD

  • INPUT

  • POSTROUTING

4. Raw表

Raw表用于处理异常,它具有2个内建链:

  • PREROUTING chain

  • OUTPUT chain

5.小结

下图展示了iptables的三个内建表:  
图: IPTables 内建表

二、IPTABLES 规则(Rules)

牢记以下三点式理解iptables规则的关键:

  • Rules包括一个条件和一个目标(target)

  • 如果满足条件,就执行目标(target)中的规则或者特定值。

  • 如果不满足条件,就判断下一条Rules。

目标值(Target Values)

下面是你可以在target里指定的特殊值:

  • ACCEPT – 允许防火墙接收数据包

  • DROP – 防火墙丢弃包

  • QUEUE – 防火墙将数据包移交到用户空间

  • RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。

如果你执行iptables --list你将看到防火墙上的可用规则。下例说明当前系统没有定义防火墙,你可以看到,它显示了默认的filter表,以及表内默认的input链, forward链, output链。

# iptables -t filter --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

查看mangle表:

# iptables -t mangle --list

查看NAT表:

# iptables -t nat --list

查看RAW表:

# iptables -t raw --list

/!\注意:如果不指定-t选项,就只会显示默认的filter表。因此,以下两种命令形式是一个意思:

# iptables -t filter --list
(or)
# iptables --list

以下例子表明在filter表的input链, forward链, output链中存在规则:

# iptables --list
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0
 
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0
 
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
 
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
3    ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     ah   --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     udp  --  0.0.0.0/0            224.0.0.251         udp dpt:5353
6    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:631
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

以上输出包含下列字段:

num – 指定链中的规则编号  
target – 前面提到的target的特殊值  
prot – 协议:tcp, udp, icmp等  
source – 数据包的源IP地址  
destination – 数据包的目标IP地址

三、清空所有iptables规则

在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则:

iptables --flush
或者
iptables -F

这两条命令是等效的。但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:

iptables -t NAT -F
四、永久生效

当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不同,具体操作也不同。下面进行简单介绍:

1.Ubuntu

首先,保存现有的规则:

iptables-save > /etc/iptables.rules

然后新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:

#!/bin/bash
iptables-restore < /etc/iptables.rules

这样,每次系统重启后iptables规则都会被自动加载。  
/!\注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

2.CentOS, RedHat
# 保存iptables规则
service iptables save
 
# 重启iptables服务
service iptables stop
service iptables start

查看当前规则:

cat  /etc/sysconfig/iptables
五、追加iptables规则

可以使用iptables -A命令追加新规则,其中-A表示Append。因此,新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功。

1.语法
iptables -A chain firewall-rule
  • -A chain – 指定要追加规则的链

  • firewall-rule – 具体的规则参数

2.描述规则的基本参数

以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。

-p 协议(protocol)
  • 指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。

  • 如果不指定-p参数,则默认是all值。这并不明智,请总是明确指定协议名称。

  • 可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols

  • 还可以使用–protocol参数代替-p参数

-s 源地址(source)
  • 指定数据包的源地址

  • 参数可以使IP地址、网络地址、主机名

  • 例如:-s 192.168.1.101指定IP地址

  • 例如:-s 192.168.1.10/24指定网络地址

  • 如果不指定-s参数,就代表所有地址

  • 还可以使用–src或者–source

-d 目的地址(destination)
  • 指定目的地址

  • 参数和-s相同

  • 还可以使用–dst或者–destination

-j 执行目标(jump to target)
  • -j代表”jump to target”

  • -j指定了当与规则(Rule)匹配时如何处理数据包

  • 可能的值是ACCEPT, DROP, QUEUE, RETURN

  • 还可以指定其他链(Chain)作为目标

-i 输入接口(input interface)
  • -i代表输入接口(input interface)

  • -i指定了要处理来自哪个接口的数据包

  • 这些数据包即将进入INPUT, FORWARD, PREROUTE链

  • 例如:-i eth0指定了要处理经由eth0进入的数据包

  • 如果不指定-i参数,那么将处理进入所有接口的数据包

  • 如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包

  • 如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包

  • 还可以使用–in-interface参数

-o 输出(out interface)
  • -o代表”output interface”

  • -o指定了数据包由哪个接口输出

  • 这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链

  • 如果不指定-o选项,那么系统上的所有接口都可以作为输出接口

  • 如果出现! -o eth0,那么将从eth0以外的接口输出

  • 如果出现-i eth+,那么将仅从eth开头的接口输出

  • 还可以使用–out-interface参数

3.描述规则的扩展参数

对规则有了一个基本描述之后,有时候我们还希望指定端口、TCP标志、ICMP类型等内容。

–sport 源端口(source port)针对 -p tcp 或者 -p udp
  • 缺省情况下,将匹配所有端口

  • 可以指定端口号或者端口名称,例如”–sport 22″与”–sport ssh”。

  • /etc/services文件描述了上述映射关系。

  • 从性能上讲,使用端口号更好

  • 使用冒号可以匹配端口范围,如”–sport 22:100″

  • 还可以使用”–source-port”

–-dport 目的端口(destination port)针对-p tcp 或者 -p udp
  • 参数和–sport类似

  • 还可以使用”–destination-port”

-–tcp-flags TCP标志 针对-p tcp
  • 可以指定由逗号分隔的多个参数

  • 有效值可以是:SYN, ACK, FIN, RST, URG, PSH

  • 可以使用ALL或者NONE

-–icmp-type ICMP类型 针对-p icmp
  • –icmp-type 0 表示Echo Reply

  • –icmp-type 8 表示Echo

4.追加规则的完整实例:仅允许SSH服务

本例实现的规则将仅允许SSH数据包通过本地计算机,其他一切连接(包括ping)都将被拒绝。

# 1.清空所有iptables规则
iptables -F
 
# 2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
 
# 3.拒绝所有其他数据包
iptables -A INPUT -j DROP
六、更改默认策略

上例的例子仅对接收的数据包过滤,而对于要发送出去的数据包却没有任何限制。本节主要介绍如何更改链策略,以改变链的行为。

1. 默认链策略

/!\警告:请勿在远程连接的服务器、虚拟机上测试!  
当我们使用-L选项验证当前规则是发现,所有的链旁边都有policy ACCEPT标注,这表明当前链的默认策略为ACCEPT:

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

这种情况下,如果没有明确添加DROP规则,那么默认情况下将采用ACCEPT策略进行过滤。除非:  
a)为以上三个链单独添加DROP规则:

iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP

b)更改默认策略:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

糟糕!!如果你严格按照上一节的例子配置了iptables,并且现在使用的是SSH进行连接的,那么会话恐怕已经被迫终止了!  
为什么呢?因为我们已经把OUTPUT链策略更改为DROP了。此时虽然服务器能接收数据,但是无法发送数据:

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            
 
Chain FORWARD (policy DROP)
target     prot opt source               destination         
 
Chain OUTPUT (policy DROP)
target     prot opt source               destination
七、配置应用程序规则

尽管5.4节已经介绍了如何初步限制除SSH以外的其他连接,但是那是在链默认策略为ACCEPT的情况下实现的,并且没有对输出数据包进行限制。 本节在上一节基础上,以SSH和HTTP所使用的端口为例,教大家如何在默认链策略为DROP的情况下,进行防火墙设置。在这里,我们将引进一种新的参数 -m state,并检查数据包的状态字段。

1.SSH
# 1.允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 
# 2.允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
  • -m state: 启用状态匹配模块(state matching module)

  • –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED

  • –sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22

  • –dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22

如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:

# 1.送出的数据包目的端口为22
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 
# 2.接收的数据包源端口为22
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
2.HTTP

HTTP的配置与SSH类似:

# 1.允许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 
# 1.允许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
3.完整的配置
# 1.删除现有规则
iptables -F
 
# 2.配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
 
# 3.允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
 
# 4.允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
 
# 5.允许HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
References

[1] Linux Firewall Tutorial: IPTables Tables, Chains, Rules Fundamentals
[2] IPTables Flush: Delete / Remove All Rules On RedHat and CentOS Linux
[3] Linux IPTables: How to Add Firewall Rules (With Allow SSH Example)
[4] Linux IPTables: Incoming and Outgoing Rule Examples (SSH and HTTP)
[5] 25 Most Frequently Used Linux IPTables Rules Examples
[6] man 8 iptables

版权声明? iptables详细教程:基础、架构、清空规则、追加规则、应用实例

2.1 框架图

-->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING-->

mangle | mangle ^ mangle

nat | filter | nat

| |

| |

v |

INPUT OUTPUT

| mangle ^ mangle

| filter | nat

v ------>local------->| filter

2.2 链和表

filter: 顾名思义,用于过滤的时候

nat: 顾名思义,用于做 NAT 的时候

NAT:Network Address Translator

INPUT: 位于 filter 表,匹配目的 IP 是本机的数据包

FORWARD: 位于 filter 表,匹配穿过本机的数据包,

PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)

POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)

3.1 iptables 语法概述

iptables [-t 要操作的表]

<操作命令>

[要操作的链]

[规则号码]

[匹配条件]

[-j 匹配到以后的动作]

3.2 命令概述

操作命令(-A、-I、-D、-R、-P、-F)

查看命令(-[vnx]L)

3.2.1 -A

-A <链名>

APPEND,追加一条规则(放到最后)

例如:

iptables -t filter -A INPUT -j DROP

在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则)

匹配所有访问本机 IP 的数据包,匹配到的丢弃

3.2.2 -I

-I <链名> [规则号码]

INSERT,插入一条规则

例如:

iptables -I INPUT -j DROP

在 filter 表的 INPUT 链里插入一条规则(插入成第 1 条)

iptables -I INPUT 3 -j DROP

在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)

注意: 1、-t filter 可不写,不写则自动默认是 filter 表

2、-I 链名 [规则号码],如果不写规则号码,则默认是 1

3、确保规则号码 ≤ (已有规则数 + 1),否则报错

3.2.3 -D

-D <链名> <规则号码 | 具体规则内容>

DELETE,删除一条规则

例如:

iptables -D INPUT 3(按号码匹配)

删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)

iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配)

删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则

(不管其位置在哪里)

注意:

1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条

2、按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错

3、按内容匹配删除时,确保规则存在,否则报错

3.2.3 -R

-R <链名> <规则号码> <具体规则内容>

REPLACE,替换一条规则

例如:

iptables -R INPUT 3 -j ACCEPT

将原来编号为 3 的规则内容替换为“-j ACCEPT”

注意:

确保规则号码 ≤ 已有规则数,否则报错

3.2.4 -P

-P <链名> <动作>

POLICY,设置某个链的默认规则

例如:

iptables -P INPUT DROP

设置 filter 表 INPUT 链的默认规则是 DROP

注意:

当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理

3.2.5 -F

-F [链名]

FLUSH,清空规则

例如:

iptables -F INPUT

清空 filter 表 INPUT 链中的所有规则

iptables -t nat -F PREROUTING

清空 nat 表 PREROUTING 链中的所有规则

注意:

1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则

2、-P 设置了 DROP 后,使用 -F 一定要小心!!!

3、如果不写链名,默认清空某表里所有链里的所有规则

3.2.6 -[vxn]L

-L [链名]

LIST,列出规则

v:显示详细信息,包括每条规则的匹配包数量和匹配字节数

x:在 v 的基础上,禁止自动单位换算(K、M)

n:只显示 IP 地址和端口号码,不显示域名和服务名称

例如:

iptables -L

粗略列出 filter 表所有链及所有规则

iptables -t nat -vnL

用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号

iptables -t nat -vxnL PREROUTING

用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解

3.3 匹配条件

流入、流出接口(-i、-o)

来源、目的地址(-s、-d)

协议类型 (-p)

来源、目的端口(--sport、--dport)

3.3.1 按网络接口匹配

-i <匹配数据进入的网络接口>

例如:

-i eth0

匹配是否从网络接口 eth0 进来

-i ppp0

匹配是否从网络接口 ppp0 进来

-o 匹配数据流出的网络接口

例如:

-o eth0

-o ppp0

3.3.2 按来源目的地址匹配

-s <匹配来源地址>

可以是 IP、NET、DOMAIN,也可空(任何地址)

例如:

-s 192.168.0.1 匹配来自 192.168.0.1 的数据包

-s 192.168.1.0/24 匹配来自 192.168.1.0/24 网络的数据包

-s 192.168.0.0/16 匹配来自 192.168.0.0/16 网络的数据包

-d <匹配目的地址>

可以是 IP、NET、DOMAIN,也可以空

例如:

-d 202.106.0.20 匹配去往 202.106.0.20 的数据包

-d 202.106.0.0/16 匹配去往 202.106.0.0/16 网络的数据包

-d www.abc.com 匹配去往域名 www.abc.com 的数据包

3.3.3 按协议类型匹配

-p <匹配协议类型>

可以是 TCP、UDP、ICMP 等,也可为空

例如:

-p tcp

-p udp

-p icmp --icmp-type 类型

ping: type 8 pong: type 0

3.3.4 按来源目的端口匹配

--sport <匹配源端口>

可以是个别端口,可以是端口范围

例如:

--sport 1000 匹配源端口是 1000 的数据包

--sport 1000:3000 匹配源端口是 1000-3000 的数据包(含1000、3000)

--sport :3000 匹配源端口是 3000 以下的数据包(含 3000)

--sport 1000: 匹配源端口是 1000 以上的数据包(含 1000)

--dport <匹配目的端口>

可以是个别端口,可以是端口范围

例如:

--dport 80 匹配源端口是 80 的数据包

--dport 6000:8000 匹配源端口是 6000-8000 的数据包(含6000、8000)

--dport :3000 匹配源端口是 3000 以下的数据包(含 3000)

--dport 1000: 匹配源端口是 1000 以上的数据包(含 1000)

注意:--sport 和 --dport 必须配合 -p 参数使用

3.3.5 匹配应用举例

1、端口匹配

-p udp --dport 53

匹配网络中目的地址是 53 的 UDP 协议数据包

2、地址匹配

-s 10.1.0.0/24 -d 172.17.0.0/16

匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包

3、端口和地址联合匹配

-s 192.168.0.1 -d www.abc.com -p tcp --dport 80

匹配来自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 协议数据包

注意:

1、--sport、--dport 必须联合 -p 使用,必须指明协议类型是什么

2、条件写的越多,匹配越细致,匹配范围越小

3.4 动作(处理方式)

ACCEPT

DROP

SNAT

DNAT

MASQUERADE

3.4.1 -j ACCEPT

-j ACCEPT

通过,允许数据包通过本链而不拦截它

类似 Cisco 中 ACL 里面的 permit

例如:

iptables -A INPUT -j ACCEPT

允许所有访问本机 IP 的数据包通过

3.4.2 -j DROP

-j DROP

丢弃,阻止数据包通过本链而丢弃它

类似 Cisco 中 ACL 里的 deny

例如:

iptables -A FORWARD -s 192.168.80.39 -j DROP

阻止来源地址为 192.168.80.39 的数据包通过本机

3.4.3 -j SNAT

-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 链)

源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池

(一组连续的 IP 地址)

例如:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \

-j SNAT --to 1.1.1.1

将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \

-j SNAT --to 1.1.1.1-1.1.1.10

同上,只不过修改成一个地址池里的 IP

3.4.4 -j DNAT

-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 链)

目的地址转换,DNAT 支持转换为单 IP,也支持转换到 IP 地址池

(一组连续的 IP 地址)

例如:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \

-j DNAT --to 192.168.0.1

把从 ppp0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \

-j DNAT --to 192.168.0.2:80

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \

-j DNAT --to 192.168.0.1-192.168.0.10

3.4.5 -j MASQUERADE

-j MASQUERADE

动态源地址转换(动态 IP 的情况下使用)

例如:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

将源地址是 192.168.0.0/24 的数据包进行地址伪装

3.5 附加模块

按包状态匹配 (state)

按来源 MAC 匹配(mac)

按包速率匹配 (limit)

多端口匹配 (multiport)

3.5.1 state

-m state --state 状态

状态:NEW、RELATED、ESTABLISHED、INVALID

NEW:有别于 tcp 的 syn

ESTABLISHED:连接态

RELATED:衍生态,与 conntrack 关联(FTP)

INVALID:不能被识别属于哪个连接或没有任何状态

例如:

iptables -A INPUT -m state --state RELATED,ESTABLISHED \

-j ACCEPT

3.5.2 mac

-m mac --mac-source MAC

匹配某个 MAC 地址

例如:

iptables -A FORWARD -m --mac-source xx:xx:xx:xx:xx:xx \

-j DROP

阻断来自某 MAC 地址的数据包,通过本机

注意:

MAC 地址不过路由,不要试图去匹配路由后面的某个 MAC 地址

3.5.3 limit

-m limit --limit 匹配速率 [--burst 缓冲数量]

用一定速率去匹配数据包

例如:

iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s \

-j ACCEPT

iptables -A FORWARD -d 192.168.0.1 -j DROP

注意:

limit 仅仅是用一定的速率去匹配数据包,并非 “限制”

3.5.4 multiport

-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]

一次性匹配多个端口,可以区分源端口,目的端口或不指定端口

例如:

iptables -A INPUT -p tcp -m multiports --ports \

21,22,25,80,110 -j ACCEPT

注意:

必须与 -p 参数一起使用

4. 实例分析

单服务器的防护

如何做网关

如何限制内网用户

内网如何做对外服务器

连接追踪模块

4.1 单服务器的防护

弄清对外服务对象

书写规则

网络接口 lo 的处理

状态监测的处理

协议 + 端口的处理

实例:一个普通的 web 服务器

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp -m multiport 22,80 -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

注意:确保规则循序正确,弄清逻辑关系,学会时刻使用 -vnL

4.2 如何做网关

弄清网络拓扑

本机上网

设置 nat

启用路由转发

地址伪装 SNAT/MASQUERADE

实例:ADSL 拨号上网的拓扑

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 \

-j MASQUERADE

4.3 如何限制内网用户

过滤位置 filer 表 FORWARD 链

匹配条件 -s -d -p --s/dport

处理动作 ACCEPT DROP

实例:

iptables -A FORWARD -s 192.168.0.3 -j DROP

iptables -A FORWARD -m mac --mac-source 11:22:33:44:55:66 \

-j DROP

iptables -A FORWARD -d bbs.chinaunix.net -j DROP

4.4 内网如何做对外服务器

服务协议(TCP/UDP)

对外服务端口

内部服务器私网 IP

内部真正服务端口

实例:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \

-j DNAT --to 192.168.1.1

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \

-j DNAT --to 192.168.1.2:80

4.5 连接追踪模块

为什么要使用连接追踪模块

FTP 协议的传输原理

传统防火墙的做法

如何使用

4.5.1 FTP 协议传输原理

使用端口

command port

data port

传输模式

主动模式(ACTIVE)

被动模式(PASSIVE)

4.5.1 FTP 协议传输原理

主动模式

client server

xxxx |---|----------|-->| 21

yyyy |<--|----------|---| 20

FW1 FW2

被动模式

client server

xxxx |---|----------|--->| 21

yyyy |---|----------|--->| zzzz

FW1 FW2

4.5.2 传统防火墙的做法

只使用主动模式,打开 TCP/20

防火墙打开高范围端口

配置 FTP 服务,减小被动模式端口范围

4.5.3 如何使用连接追踪模块

modprobe ipt_conntrack_ftp

modprobe ipt_nat_ftp

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -m state --state \

RELATED,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

5. 网管策略

怕什么

能做什么

让什么 vs 不让什么

三大“纪律”五项“注意”

其他注意事项

5.1 必加项

echo "1" > /proc/sys/net/ipv4/ip_forward

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

echo "1" > \

/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

5.2 可选方案

堵:

iptables -A FORWARD -p tcp --dport xxx -j DROP

iptables -A FORWARD -p tcp --dport yyy:zzz -j DROP

通:

iptables -A FORWARD -p tcp --dport xxx -j ACCEPT

iptables -A FORWARD -p tcp --dport yyy:zzz -j ACCEPT

iptables -A FORWARD -m state --state RELATED,ESTABLISHED \

-j ACCEPT

iptables -P FORWARD DROP

5.3 三大“纪律”五项“注意”

三大“纪律”——专表专用

filter

nat

mangle

五项“注意”——注意数据包的走向

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

5.4 其他注意事项

养成好的习惯

iptables -vnL

iptables -t nat -vnL

iptables-save

注意逻辑顺序

iptables -A INPUT -p tcp --dport xxx -j ACCEPT

iptables -I INPUT -p tcp --dport yyy -j ACCEPT

学会写简单的脚本

6. FAQ.1

Q:我设置了 iptables -A OUTPUT -d 202.xx.xx.xx -j DROP

为何内网用户还是可以访问那个地址?

A:filter 表的 OUTPUT 链是本机访问外面的必经之路,内网数据不经过该链

Q:我添加了 iptables -A FORWARD -d 202.xx.xx.xx -j DROP

为何内网用户还是可以访问那个地址?

A:检查整个规则是否存在逻辑错误,看是否在 DROP 前有 ACCEPT

Q:iptables -t nat -A POSTROUTING -i eth1 -o eth2 -j MASQUERADE

这条语句为何报错?

A:POSTROUTING 链不支持“流入接口” -i 参数

同理,PREROUTING 链不支持“流出接口” -o 参数

6. FAQ.2

Q:我应该怎么查看某个模块具体该如何使用?

A:ipitables -m 模块名 -h

Q:执行 iptables -A FORWARD -m xxx -j yyy

提示 iptables: No chain/target/match by that name

A:/lib/modules/`uname -r`/kernel/net/ipv4/netfilter 目录中,

缺少与 xxx 模块有关的文件,或缺少与 yyy 动作有关的文件

名字为 ipt_xxx.o(2.4内核) 或 ipt_yyy.ko(2.6内核)

Q:脚本写好了,内网上网没问题,FTP 访问不正常,无法列出目录,为什么?

A:缺少 ip_nat_ftp 这个模块,modprobe ip_nat_ftp

详细出处参考:http://www.jb51.net/os/RedHat/1335.html

如果你的IPTABLES基础知识还不了解,建议先去看看.

开始配置

我们来配置一个filter表的防火墙.

(1)查看本机关于IPTABLES的设置情况

[root@tp ~]# iptables -L -n  
Chain INPUT (policy ACCEPT)  
target       prot opt source                 destination        

Chain FORWARD (policy ACCEPT)  
target       prot opt source                 destination        

Chain OUTPUT (policy ACCEPT)  
target       prot opt source                 destination        

Chain RH-Firewall-1-INPUT (0 references)  
target       prot opt source                 destination          
ACCEPT       all    --    0.0.0.0/0              0.0.0.0/0            
ACCEPT       icmp --    0.0.0.0/0              0.0.0.0/0             icmp type 255  
ACCEPT       esp    --    0.0.0.0/0              0.0.0.0/0            
ACCEPT       ah     --    0.0.0.0/0              0.0.0.0/0            
ACCEPT       udp    --    0.0.0.0/0              224.0.0.251           udp dpt:5353  
ACCEPT       udp    --    0.0.0.0/0              0.0.0.0/0             udp dpt:631  
ACCEPT       all    --    0.0.0.0/0              0.0.0.0/0             state RELATED,ESTABLISHED  
ACCEPT       tcp    --    0.0.0.0/0              0.0.0.0/0             state NEW tcp dpt:22  
ACCEPT       tcp    --    0.0.0.0/0              0.0.0.0/0             state NEW tcp dpt:80  
ACCEPT       tcp    --    0.0.0.0/0              0.0.0.0/0             state NEW tcp dpt:25  
REJECT       all    --    0.0.0.0/0              0.0.0.0/0             reject-with icmp-host-prohibited  
可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口.

如果你在安装linux时没有选择启动防火墙,是这样的

[root@tp ~]# iptables -L -n  
Chain INPUT (policy ACCEPT)  
target       prot opt source                 destination        

Chain FORWARD (policy ACCEPT)  
target       prot opt source                 destination        

Chain OUTPUT (policy ACCEPT)  
target       prot opt source                 destination  

什么规则都没有.

(2)清除原有规则.

不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.

[root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则  
[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则

我们在来看一下

[root@tp ~]# iptables -L -n  
Chain INPUT (policy ACCEPT)  
target       prot opt source                 destination        

Chain FORWARD (policy ACCEPT)  
target       prot opt source                 destination        

Chain OUTPUT (policy ACCEPT)  
target       prot opt source                 destination      

什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart

现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧

(3)设定预设规则

[root@tp ~]# iptables -p INPUT DROP

[root@tp ~]# iptables -p OUTPUT ACCEPT

[root@tp ~]# iptables -p FORWARD DROP  
上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包

而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.

可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.

这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP.

注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.

怎么办,去本机操作呗!

(4)添加规则.

首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链

为了能采用远程SSH登陆,我们要开启22端口.

[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.

其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:

[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)

如果做了WEB服务器,开启80端口.

[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  
如果做了邮件服务器,开启25,110端口.

[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT  
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT  
如果做了FTP服务器,开启21端口

[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT

[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果做了DNS服务器,开启53端口

[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

如果你还做了其他的服务器,需要开启哪个端口,照写就行了.

上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP

允许icmp包通过,也就是允许ping,

[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)

[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT    (INPUT设置成DROP的话)

允许loopback!(不然会导致DNS无法正常关闭等问题)

IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)  
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)

下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.

减少不安全的端口连接

[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP

[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP

有些些特洛伊***会扫描端口31337到31340(即***语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会

还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.

当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加

允许SSH登陆一样.照着写就行了.

下面写一下更加细致的规则,就是限制到某台机器

如:我们只允许192.168.0.3的机器进行SSH连接

[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.

或采用命令方式:

[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT

然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样写 !192.168.0.3 表示除了192.168.0.3的ip地址

其他的规则连接也一样这么设置.

在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.

开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)

[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的TCP包

[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止***,允许每秒100个

[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.

[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

我在前面只所以允许ICMP包通过,就是因为我在这里有限制.

二,配置一个NAT表放火墙

1,查看本机关于NAT的设置情况

[root@tp rc.d]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)  
target       prot opt source                 destination        

Chain POSTROUTING (policy ACCEPT)  
target       prot opt source                 destination          
SNAT         all    --    192.168.0.0/24         anywhere              to:211.101.46.235

Chain OUTPUT (policy ACCEPT)  
target       prot opt source                 destination    

我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置NAT,参考我的另一篇文章

当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的

如果你想清除,命令是

[root@tp ~]# iptables -F -t nat

[root@tp ~]# iptables -X -t nat

[root@tp ~]# iptables -Z -t nat

2,添加规则

添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),

添加规则,我们只添加DROP链.因为默认链全是ACCEPT.

防止外网用内网IP欺骗

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP  
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP  
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP  
如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)

例:

禁止与211.101.46.253的所有连接

[root@tp ~]# iptables -t nat -A PREROUTING    -d 211.101.46.253 -j DROP

禁用FTP(21)端口

[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP

这样写范围太大了,我们可以更精确的定义.

[root@tp ~]# iptables -t nat -A PREROUTING    -p tcp --dport 21 -d 211.101.46.253 -j DROP

这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.

按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.

最后:

drop非法连接
[root@tp ~]# iptables -A INPUT     -m state --state INVALID -j DROP  
[root@tp ~]# iptables -A OUTPUT    -m state --state INVALID -j DROP  
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP  
允许所有已经建立的和相关的连接
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart

别忘了保存,不行就写一部保存一次.你可以一边保存,一边做实验,看看是否达到你的要求,

上面的所有规则我都试过,没有问题.

写这篇文章,用了我将近1个月的时间.查找资料,自己做实验,希望对大家有所帮助.如有不全及不完善的地方还请提出.

http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html