温馨提示:
一、命令部分
1
2
3
4
5
6
7
8
9
10
11
<code>#命令格式:</code>
<code>iptables [-t table] {-A|-D} chain rule-specification</code>
<code>iptables [-t table] -I chain [rulenum] rule-specification</code>
<code>iptables [-t table] -R chain rulenum rule-specification</code>
<code>iptables [-t table] -D chain rulenum</code>
<code>iptables [-t table] -S [chain [rulenum]]</code>
<code>iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]</code>
<code>iptables [-t table] -N chain</code>
<code>iptables [-t table] -X [chain]</code>
<code>iptables [-t table] -P chain target</code>
<code>iptables [-t table] -E old-chain-name </code><code>new</code><code>-chain-name</code>
注
-t :对那一个表进行操作,如果不指定将以filter为默认操作表。(相关表那些、功能、内核模块,请参照前一篇博文说明)
1、命令注解
命令
-A (append:追加)
样例
#iptables -A INPUT -p tcp --dport 80 -j DROP
注解
这个选项表示在链尾追加一条规则,这条规则将最后才能被检查到。
-D (delete:删除)
#iptables -D INPUT -p tcp --dport 80 -j DROP,#iptables -D INPUT 1
这条命令删除链里面的一条规则,我们有两种方式输出一条规则,第一是输入一条完整的规则,另外就是通过序号删除。假如你用第一种方法删除,那么你输入的规则必须和你想删除的规则完全一致。如果你想用第二种方法来删除规则,你必须制定删除的序号,链的序号从顶部开始从1编号,如果此链当前编号为1,删除后第二条的编号将变为1。
-I (insert:插入)
#iptabels -I OUTPUT 1 -p tcp --dprot 443 -j ACCEPT
在链里面插入一条规则,这条规则会在指定的地方插入,如果不指定默认为第一个编号上插入。
-R (replace:替换 )
#iptables -R INPUT 1 -s 192.168.0.1 -j DROP
这条命令替换指定位置的旧规则,它和 delete 工作方式一样的,但是不同在于它不完全删除这条规则,而是替换上一条新的规则。
-S(显示)
#iptables -S
显示filter表中所有链上的规则
-L(list:列出)
#iptables -L
这条命令列出指定链的所有规则
-F (flush:清空)
#iptables -F INPUT
这个命令情况链上的所有规则,它等同于逐条删除所有规则,只是它更快。没有指定参数的话,他会把指定表上面所有链的规则删除干净。
-Z (zero:清零)
#iptables -Z OUTPUT
将默认表中的 OUTPUT链的计数器清空
-N (new:新建) chain
#iptables -N chain_out
这个命令让在指定的表上面创建一条新的用户自定义链,请注意,名字不能和系统内建的重合
-P --policy (策略)
#iptables -P INPUT DROP
为链设置默认的 target(可用的是 DROP 和 ACCEPT),这个target 称作策略。所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被作为策略使用,也就是说不能象这样使用:iptables -P INPUT allowed(或者是内建的链).
-E (rEname-chain)
#iptables -E allowed disallowed
这条命令会把这个链的第一个名字改成第二个,只是改变名称,内容不会变。
-X (delete-chain)
#iptables -X chain_out
这条命令会从表上删除指定的链,要想删除这个链,这儿必须没
有任何规则关联到这个链。
2、选项注解
选项
-x, (--exact:更精确)
#iptables -L -n -x
使--list 输出中的计数器显示准确的数值,而不用 K、M、G 等
估值。注意此选项只能和--list 连用。
-n, (--numeric:数值)
#iptables -L -n -x -v
使输出中的 IP 地址和端口以数值的形式显示,而不是默认的名字,比如主机名、网络名、程序名等。注意此选项也只能和--list连用
-v,(--verbose:以详细格式显示)
#iptables -L -n -x -v或 #iptables -L -n -x -vv
iptables 会输出详细的信息告诉你规则是如何被解释的、是否正确地插入等
等(-vv比-v要详细)
--line-numbers
#iptables -L -n --line-number
每一条规则都带有序号,很方便的知道每条规则的位置.
3、匹配规则
⑴、通用匹配
匹配符
-p, --protocol(协议)
#iptables -t INPUT -p tcp --dport 80 -j ACCEPT
这个匹配器(match)主要用来检查特定的协议;
它主要有以下几种使用方式:
1. 制定协议的名称,它必须在/etc/protocols 里面定
义,不然就会报错。
2.你可以指定一个整数值,例如ICMP 就是 1,TCP
就是 6 而 UDP 是 17.(-p 6 -p 17)
3. 另外你可以指定为 ALL,ALL 表示仅仅匹配
ICMP/TCP/UDP 协议,这个是默认配置,数值为 0.
4. 可以是协议列表,以英文逗号为分隔符,如:
udp,tcp
5. 最后我们还可以对协议取反,例如!TCP 表示匹配
UDP/ICMP,当然从这儿我们也可以看到取反只能针
对 TCP/UDP/ICMP 协议。
-s, --src, --source (源地址)
#iptables -A INTPUT -s 192.168.1.34 -p tcp -j ACCEPT
它不仅可以匹配单台主机,还以匹配一个网络(ip/mask)
-d, --dst, --destination (目标地址)
#iptables -A OUTPUT -d 192.168.1.1 -p tcp j DROP
匹配报文的目的地址,用法和源地址匹配一致。
-i, --in-interface
#iptables -A INPUT -i eth0 -p tcp -j ACCEPT
包进入本地所使用的网络接口来匹配包。要注意这个匹配操作
只能用于 INPUT,FORWARD 和 PREROUTING 这三个链.(注:接口前加英文感叹号表示取反,如 -i ! eth0,注意有空格)
-o, --out-interface
#iptables -A FORWARD -o eth0 -p tcp -j ACCEPT
以包离开本地所使用的网络接口来匹配包。使用的范围和指定接
口的方法与--in-interface 完全一样。
⑵、隐含匹配(适用于tcp/udp)
--sport, --source-port (源端口)
#iptables -A INPUT -p tcp --sport 22 -j ACCEPT
1、不指定此项,则暗示所有端口。
2、使用服务名或端口号,但名字必须是在/etc/services中定义
的
3、可以使用连续的端口,如果两个号的顺序反了也没关系,如:--source-port 80:22 这和 --source-port 22:80 的效果一样。
4、可以省略第一个号,默认第一个是 0,如:--source-port :80 表示从0到80的所有端口。
5、也可以省略第二个号,默认是 65535,如:--source-port 22:表示从 22 到 65535 的所有端口.
6、在端口号前加英文感叹号表示取反,注意空格,如:--source-port ! 22 表示除 22 号之外的所有端口;--source-port ! 22:80 表示从 22 到 80(包括 22 和 80)之外的所有端口。
注:此处不能匹配不连续的端口
--dport, --destination-port (目的端口)
#iptables -A INPUT -p tcp --dport 22 (此处没有指定target表示以链的默认的策略为准)
目的端口用来匹配报文的目的端口,用法和源端口一样
--syn(tcp三次握手的第一次)
#iptables -A INPUT -d 172.16.32.45 -t tcp --tcp-flags --syn -j ACCEPT
这里用到的是TCP封包中的控制标志来限定数据。(常用的有syn,ack,fin)
all(此处代表--tcp-flags的六个标志为1,none则表示全为0)
#iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
或
#iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
拒绝tcp标志位全部为1或为0的非法tcp的报文
(3)、icmp
--icmp-type (icmp报文的类型)
#iptables -A INPUT -p icmp --icmp-type 8
根据ICMP类型匹配包,类型的指定可以使用十进制数值或相应的
名字。(常用的有两个8表示请求,0表示响应)
(4)、显示匹配(-m)
multiport --dports (多目的端口)(此处可以是多个不相连的多个端口(<15))
#iptables -I INPUT -d 172.16.32.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
到达172.16.3.27协议是tcp的使用是22和80的端口程序放行
multiport --sports (多源端口)
#iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
从172.16.100.7使用22,80端口出去的程序放行
iprange --src-range (基于范围的源地址)
#iptables -A INPUT -p tcp -m iprange --src-range
192.168.1.13-192.168.2.19
--src-range 用来匹配一整段的源地址也可以对地址取反,例 iprange ! --src-range
iprange --dst-range (基于范围的目的地址)
#iptables -A INPUT -p tcp -m iprange --dst-range
匹配一整段的目的地址,用法和源一致
[!] --connlimit-above(限定并发连接数)
#iptables -I INPUT -d 192.168.2.34 -p tcp -dport 80 -m connlimit --connlimit-above 5 -j DROP
限定并发连接数
limit --limit(报文速率控制)
#iptables -A INPUT -m limit --limit 3/(hour|second|minute|day)
单位时间内通过的报文数(通常与limit-burst同用)
limit-burst
#iptables -A INPUT -m iprange --src-range 172.16.32.1-172.16.32.100 -p tcp -m limit --limit 2/minute --limit-burst 2
这里定义的是limit的峰值,就是在单位时间内最多可匹配几个报文
time(指定时间范围)
类别
-datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day...]
#iptables -A INPUT -d 172.16.32.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
时间范围的限定(天、小时、周),此项是可以取反的。
string --algo {kmp|bm}{--string "STRING"|--hex-string “HEX-STRING”}
#iptables -A INPUT -p tcp --dport 80 -m string --algo kmp ! --string "admin" -m state --state ESTABLISHED -j ACCEPT
过滤指定的字符--string "STRING":要查找的字符串或--hex-string "HEX-STRING"先将查找的字符,编码成16进制格式再比较
state --state
iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED
指定要匹配包的的状态,当前有4 种状态可用:INVALID,ESTABLISHED,NEW和RELATED。
INVALID意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。
ESTABLISHED意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。
NEW表示包将要或已经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。RELATED说明包正在建立一个新的连接,这个
连接是和一个已建立的连接相关的.
四、注意事项
1、规则相关
(1)、对于进入的状态为ESTABLISHED都应该放行;
(2)、对于出去的状态为ESTABLISHED都应该放行;
(3)、严格检查进入的状态为NEW的连接;
(4)、所有状态为INVALIED都应该拒绝;
2、连接相关
(1)、调整连接追踪功能所能容纳的追踪的最大连接数:
# cat /proc/sys/net/nf_conntrack_max
(2)、定义了连接追踪的最大值,因此,建议按需调大此值;
# cat /proc/net/nf_conntrack
(3)、记录了当前追踪的所有连接
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
3、如何放行工作于被动模式下的FTP服务?
(1)、确保iptables加载ftp协议支持的模块:ip_nat_ftp, nf_conntrack_ftp
编辑/etc/sysconfig/iptables-config文件,定义如下参数:
IPTABLES_MODULES="ip_nat_ftp nf_conntrack_ftp"
(2)、放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;
#modprobe ip_nat_ftp
#modprobe nf_conntrack_ftp
#iptabls -P OUTPUT DROP
#iptables -I INPUT -d 172.16.32.45 -p tcp --dport 21 -j ACCEPT
#iptables -I OUTPUT -s 172.16.32.45 -p tcp --sport 21 -j ACCEPT
#iptables -I INPUT -d 172.16.32.45 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -I OUTPUT -s 172.16.32.45 -p tcp -m state --state ESTABLISHED -j ACCEPT
4、保存规则
service iptables save保存防火墙规则,保存的位置为/etc/sysconfig/iptables文件中。
iptables-save > /path/to/some_rulefile把规则写入到某个文件中。
iptables-restore</path/from/some_rulefile输入重定向。
================================未完====================================================
PS:
下一篇将介绍NAT的用法
本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1386787,如需转载请自行联系原作者