linux系统之iptables其二命令注解-阿里云开发者社区

开发者社区> 安全> 正文

linux系统之iptables其二命令注解

简介:

温馨提示:

如果对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都应该放行;

(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服务?

注: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的用法











本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1386787,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

云安全开发者的大本营

其他文章