linux防火墙之表链

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux防火墙之表链相关的知识,希望对你有一定的参考价值。

后续要整理常用的,所以复制过来了,我的上一篇是:linux防火墙

以下内容采自于:http://my.oschina.net/HankCN/blog/117796

 

技术分享

 

 

 

 

Filter表:过滤数据包,默认表。

 

(1)INPUT   链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤)

(2)OUTPUT 链:过滤所有本机产生的数据包(对源地址得数据包的过滤)

(3)FORWARD链:过滤所有路过本机的数据包(源地址和目标地址都不是本机的数据包。

 

NAT表:网络地址转换(Network Address Translation)

如果第一个数据包允许经行NAT或Masquerade,那么其它数据包都会被做相同的动作,也就是其他数据包不会被一个一个地NAT(属于一个流的包只会经过这个表一次)任何时候都不要在这个表任何一条链经行过滤。

    包括三个动作

(1)DNAT:改变数据包的目的地址使包能重路由到某台机器

            (使公网能够访问局域网的服务器)

(2)SNAT: 改变数据包的源地址(使局域网能访问公网)

(3)NASQUERADE:和SNAT一样使局域网能访问公网,无固定IP使用PPP.PPPoE等拨号上网接入Internet

 

Nat表包含3条链:

(1)PREROUTING链 :数据包到达防火墙时改变包的目的地址。

(2)OUTPUT链:改变本地产生数据包的目标地址。

(3)POSTROUTING:在数据包离开防火墙时改变数据包的源地址。

 

Mangle表:修改数据包,改变包头中内容(TTL, TOS,  MARK )

(1)TOS :设置改变数据包的服务类型,不要使用TOS设置发往Internet的包除非打算依赖TOS来路由,不能在表中配置任何过滤。SNAT、DNAT

(2)TTL:改变数据包的生存时间,可以让数据包只有一个特殊的TTL,欺骗ISP,有些ISP并不希望多台计算机共享一个连接访问Internet,ISP通过检查一台计算机所发出的数据包是否含有不同的TTL来判断。

(3)Mask:给数据包设置特殊的标记,通过标记配置带宽限制和基于请求分类。

 

Mangle表的5条链:

(1)PREROUTING  链:数据包进入防火墙后,路由判断之前改变数据包。

(2)POSTROUTING链:数据包确定了目标地址后,即路由判断前改变数据包。

(3)OUTPUT链:在数据包被确定目的地址前改变数据包

(4)INPUT链:在数据包进入本机后,应用程序接受之前改变数据包。

(5)FORWARD链:第一次路由判断之后,最后一次路由判断前改变数据包。

 

IPTABLES中数据包和4种被跟踪连接的4种不同状态。

(1)NEW : 该包想要开始一个连接(重新连接或将连接重定向)

(2)RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。

--icmp-type  0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的

(3)ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。

INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。 

 

常用命令列表:

 

命令 -A, --append   
范例 iptables -A INPUT ...   

说明 新增规则到某个规则炼中,该规则将会成为规则炼中的最后一条规则。

 

命令 -D, --delete   
范例 iptables -D INPUT --dport 80 -j DROP   
iptables -D INPUT 1    

说明 从某个规则炼中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

 

命令 -R, --replace   
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP   

说明 取代现行规则,规则被取代后并不会改变顺序。

 

命令 -I, --insert   
范例 iptables -I INPUT 1 --dport 80 -j ACCEPT   

说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。

 

命令 -L, --list   
范例 iptables -L INPUT   

说明 列出某规则炼中的所有规则。

 

命令 -F, --flush   
范例 iptables -F INPUT   

说明 删除某规则炼中的所有规则。 

 

命令 -Z, --zero   
范例 iptables -Z INPUT   

说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

 

命令 -N, --new-chain   
范例 iptables -N allowed   

说明 定义新的规则炼。

 

命令 -X, --delete-chain   
范例 iptables -X allowed   

说明 删除某个规则炼。

 

命令 -P, --policy   
范例 iptables -P INPUT DROP   

说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。

 

命令 -E, --rename-chain   
范例 iptables -E allowed disallowed   

说明 修改某自订规则炼的名称。

 

常用封包比对参数:

 

参数 -p, --protocol   
范例 iptables -A INPUT -p tcp   

说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含 udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。

 

参数 -s, --src, --source   
范例 iptables -A INPUT -s 192.168.1.1   

说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时也可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。

 

参数 -d, --dst, --destination

范例 iptables -A INPUT -d 192.168.1.1

说明 用来比对封包的目的地 IP,设定方式同上。

 

参数 -i, --in-interface

范例 iptables -A INPUT -i eth0

说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,例如:-i ! eth0。 

 

参数 -o, --out-interface   
范例 iptables -A FORWARD -o eth0   

说明 用来比对封包要从哪片网卡送出,设定方式同上。

 

参数 --sport, --source-port   
范例 iptables -A INPUT -p tcp --sport 22   
说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:--sport 22:80,表示从 22 到 80   
埠之间都算是符合条件,如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 !   

运算子进行反向比对。

 

参数 --dport, --destination-port   
范例 iptables -A INPUT -p tcp --dport 22   

说明 用来比对封包的目的地埠号,设定方式同上。

 

参数 --tcp-flags   
范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN   
说明 比对 TCP   
封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设定,未被列举的旗号必须是空的。TCP   
状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)  

等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子进行反向比对。

 

参数 --syn   
范例 iptables -p tcp --syn   

说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 ! 运算子,可用来比对非要求联机封包。

 

参数 -m multiport --source-port   
范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110   

说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。

 

参数 -m multiport --destination-port   
范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110   

说明 用来比对不连续的多个目的地埠号,设定方式同上。

 

参数 -m multiport --port   
范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110   

说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80 但目的地埠号为 110,这种封包并不算符合条件。

 

参数 --icmp-type   
范例 iptables -A INPUT -p icmp --icmp-type 8   

说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可以用。

 

参数 -m limit --limit   
范例 iptables -A INPUT -m limit --limit 3/hour   
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。   
除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。   

除了进行封包数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。

 

参数 --limit-burst   
范例 iptables -A INPUT -m limit --limit-burst 5   

说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。

 

参数 -m mac --mac-source   
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01   
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting   
规则炼上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables   

在进行封包比对时,并不知道封包会送到哪个网络接口去。

 

参数 --mark   
范例 iptables -t mangle -A INPUT -m mark --mark 1   

说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最大不可以超过 4294967296。

 

参数 -m owner --uid-owner   
范例 iptables -A OUTPUT -m owner --uid-owner 500   

说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出去,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。

 

参数 -m owner --gid-owner   
范例 iptables -A OUTPUT -m owner --gid-owner 0   

说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

 

参数 -m owner --pid-owner   
范例 iptables -A OUTPUT -m owner --pid-owner 78   

说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。

 

参数 -m owner --sid-owner   
范例 iptables -A OUTPUT -m owner --sid-owner 100   

说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。

 

参数 -m state --state   
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED    
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。   
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。   
ESTABLISHED 表示该封包属于某个已经建立的联机。   
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。    

RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

 

常用的处理动作:   

-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:

 

ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)。

 

REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP   
echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。   
范例如下:   

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

 

DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

 

REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy   
或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j   

REDIRECT --to-ports 8080

 

MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port   
对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP   伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候   MASQUERADE 特别有用。范例如下:   

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

 

LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。例如:   

iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

 

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:   

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

 

DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:   

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

 

MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

 

QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。

 

RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

 

MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:   

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

开始实验

 

如果你的IPTABLES基础知识还不了解,建议先去看看.
开始配置
我们来配置一个filter表的防火墙.
(1)查看本机关于IPTABLES的设置情况 默认查看INPUT FORWARD OUTPUT三个表的策略。
[[email protected] ~]# iptables -L -n  
Chain INPUT (policy ACCEPT)  Chain INPUT (policy DROP) 
target     prot opt source               destination 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0 
ACCEPT     tcp  --  192.168.181.34       0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  192.168.181.35       0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 


Chain FORWARD (policy DROP) 
target     prot opt source               destination 


Chain OUTPUT (policy DROP) 
target     prot opt source               destination 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0 
ACCEPT     tcp  --  192.168.181.33       0.0.0.0/0           tcp spt:22 
 

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

 

1
2
3
4
5
6
7
8
# 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的所有规则.

 

[[email protected] ~]# iptables -F        清除预设表filter中的所有规则链的规则 

[[email protected] ~]# iptables -X        清除预设表filter中使用者自定链中的规则

[[email protected] ~]# iptables -Z         清楚预设表filter中计数器

 

我们在来看一下
[[email protected] ~]# 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一样,重起就会失去作用),怎么保存.
[[email protected] ~]# /etc/rc.d/init.d/iptables save
 
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[[email protected] ~]# service iptables restart
 
现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧

(3)设定预设规则

到这最好做一个shellscript.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# vi ipt.sh
 
#!/bin/bash
#iptables init
#---------------------------
iptables -F
iptables -X
iptables -Z
#set the default rules
#---------------------------
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
 
#---------------------------
service iptables save
echo "------------------------------------------------------------------------"
iptables -L -n
echo "-------------------------------------------------------------------------"
1
<span># bash ./ipt.sh</span>

 

 

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

而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.
 
注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.

怎么办,去本机操作呗!

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

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

到这块就和其他博客不一样了。

开启SSH所需要打开22端口

iptables -A INPUT  (-s 192.168.181.34) -p tcp --dport 22 -j ACCEPT #进入INPUT的来源IP
iptables -A OUTPUT (-s 192.168.181.33) -p tcp --sport 22 -j ACCEPT #出去OUTPUT的来源IP(基本都是本机)

 

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

 

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  
如果做了邮件服务器,开启25,110端口.
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT  
如果做了FTP服务器,开启21端口
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
如果做了DNS服务器,开启53端口
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping,
# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
# 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(放弃)的链.
减少不安全的端口连接
# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
# 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连接
# 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 因为它表示所有地址都可以登陆.
或采用命令方式:
# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.
# /etc/rc.d/init.d/iptables save
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.
 
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制.  
二,配置一个NAT表放火墙
1,查看本机关于NAT的设置情况
[[email protected] 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在默认情况下是什么都没有的
如果你想清除,命令是
# iptables -F -t nat
# iptables -X -t nat
# iptables -Z -t nat
 
2,添加规则
添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),
添加规则,我们只添加DROP链.因为默认链全是ACCEPT.
防止外网用内网IP欺骗
# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP  
如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)
例:
禁止与211.101.46.253的所有连接
# iptables -t nat -A PREROUTING    -d 211.101.46.253 -j DROP

 

 

禁用FTP(21)端口
# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
这样写范围太大了,我们可以更精确的定义.
# 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非法连接  
# iptables -A INPUT     -m state --state INVALID -j DROP
# iptables -A OUTPUT    -m state --state INVALID -j DROP
# iptables-A FORWARD -m state --state INVALID -j DROP  
允许所有已经建立的和相关的连接  
# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# /etc/rc.d/init.d/iptables save

以上是关于linux防火墙之表链的主要内容,如果未能解决你的问题,请参考以下文章

软件防火墙之iptables/netfilter概念篇(一)

Linux防火墙------iptables(基础概述)

Linux系统面试题

防火墙——iptables防火墙(四表五链防火墙配置方法匹配规则详解)

mysql数据查询之多表链接

关于防火墙那些你不得不知道的知识!防火墙基础知识!linux下的防火墙!什么是三表五链!一文全都告诉你!