温馨提示:
如果对iptables相关概念不甚了解,请查看前一篇博文。
一、命令部分
1
2
3
4
5
6
7
8
9
10
11
|
#命令格式: iptables [-t table] {-A|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new -chain-name
|
注
-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 192.168.1.13-192.168.2.19 |
注解 | 匹配一整段的目的地址,用法和源一致 |
匹配符 | [!] --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都应该放行;
(3)、严格检查进入的状态为NEW的连接;
(4)、所有状态为INVALIED都应该拒绝;
2、连接相关
# 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服务?
注:ftp的工作模式完全取决于客户端,具体原因请查看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
#iptables -P INPUT DROP
#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的用法