编写规则
- Iptables命令
- iptables [-t table] command [match] [target/jump]
- 命令总是放在开头或者紧挨着表名,我们用命令告诉应用程序我们想干什么。例如增加一个规则,在链尾增加一个规则或者是删除一条规则,下面我们还会说这个问题。
- match 细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源 IP 地址,网络接口,端口,协议类型,或者其他什么。
- 最后我们说说 target,假如一个报文匹配所有的 matches,那么 target 就告诉这个报文应该做什么。例如让内核把报文送到我们自定义的链上,我们也可以告诉内核直接丢掉这个报文,甚至可以让内核给发送者回复一个特定报文。
表(Tables)
-t选项指明你准备操作哪个表,默认情况下,filter表会被使用。
Table | Explanation |
---|
filter | Filter 明确的就是用来完成报文过滤的,和操作其他表一样,我们在 filter 里面可以丢弃/记录/接受/拒绝报文。FORWARD 链主要用来处理 非本机报文,INPUT 链处理所有目的地址为本机的报文,而 OUTPUT 则 处理所有本机发送的报文。 |
nat | nat 表的主要用处是网络地址转换,即 Network Address Translation,缩写为 NAT。做过 NAT 操作的数据包的地址就被改变 了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过 这个表一次。如果第一个包被允许做 NAT 或 Masqueraded,那么余下的 包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个 表,一个一个的被 NAT,而是自动地完成。这就是我们为什么不应该在 这个表中做任何过滤的主要原因,对这一点,后面会有更加详细的讨 论。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地 址,如果需要的话。OUTPUT 链改变本地产生的包的目的地址。 POSTROUTING 链在包就要离开防火墙之前改变其源地址 |
mangle | 这个表主要用来 mangle 数据包。我们可以改变不同的包及包头的内 容,比如 TTL,TOS 或 MARK。注意 MARK 并没有真正地改动数据包,它 只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如 tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的 链: PREROUTING,POSTROUTING, OUTPUT,INPUT 和 FORWARD。 PREROUTING 在包进入防火墙之后、路由判断之前改变包,POSTROUTING 是在所有路由判断之后。 OUTPUT 在确定包的目的之前更改数据包。 INPUT 在包被路由到本地之后,但在用户空间的程序看到它之前改变 包。FORWARD 在最初的路由判断之后、最后一次更改包的目的之前 mangle 包。注意,mangle 表不能做任何 NAT,它只是改变数据包的 TTL,TOS 或 MARK,而不是其源目地址。NAT 是在 nat 表中操作的。 |
raw | Raw 表和它的链都在 netfilter 的模块之前,他主要就是用来完成 NOTRACK 功能,如果我们想使用这个功能,需要 2.6 以及之后的内核。 Raw 表里面有 PREROUTING 和 OUTPUT 两条链,在这两条链上他们早于 netfilter 处理报文。PREROUTING 用于到本机的所有报文,而 OUTPUT 链用于本机发送的所有报文。 |
Command | Example | Example |
---|
-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 | 为链设置默认的 target(可用的是 DROP 和 ACCEPT),这个 target 称作策略。 |
-E, --rename-chain | iptables -E allowed disallowed | 这条命令会把这个链的第一个名字改成第二个 |
Options
Option | Example | Example |
---|
-v, --verbose | --list, --append, --insert, --delete, --replace | 这个选项主要和—list 一起使用。假如两个一起用的话,输出 信息就包含接口地址/规则选项以及 TOS 的标记。 --list 命令 还会列出字节和报文统计。其中计数器是以 K、M、G(这里用的 是 10 的幂而不是 2 的幂哦)为单位的。如果想知道到底有多少 个包、多少字节,还要用到选项-x,下面会介绍。如果-v 和-- append、--insert、--delete 或--replace 连用,iptables 会 输出详细的信息告诉你规则是如何被解释的、是否正确地插入等 等 |
-x, --exact | --list | 使--list 输出中的计数器显示准确的数值,而不用 K、M、G 等估值。注意此选项只能和--list 连用。 |
-n, --numeric | --list | 使输出中的 IP 地址和端口以数值的形式显示,而不是默认的名 字,比如主机名、网络名、程序名等。注意此选项也只能和-- list 连用 |
--line-numbers | --list | --line-number 命令和—list 一起合用,他们用来控制输出数 字。用了这个选项后,每一条规则都带有序号,这样我们就很方 便的知道每条规则的位置。这条命令只能和—list 合用。 |
-c, --set-counters | --insert, --append, --replace | 这个选项可以让我们在创建或者修改规则的时候,设置字节或者 报文的计数值。语法大致是这个样子的,--set-counters 20 4000,这个命令设置报文计数值为 20 而字节计数值为 4000. |
--modprobe | All | 此选项告诉 iptables 探测并装载要使用的模块。这是非常有用 的一个选项,万一 modprobe 命令不在搜索路径中,就要用到了。有了这个选项,在装载模块时,即使有一个需要用到的模块 没装载上,iptables 也知道要去搜索。 |
Iptables的匹配(matches)
- 通用匹配 Kernel 2.3, 2.4, 2.5 and 2.6
Match | Example | Explanation |
---|
-p, --protocol | iptables -A INPUT -p tcp | 这个匹配器(match)主要用来检查特定的协议,/etc/protocols |
-s, --src, --source | iptables -A INPUT -s 192.168.1.1/24 | 匹配报文的源地址 |
-d, --dst, --destination | iptables -A INPUT -d 192.168.1.1 | 匹配报文的目的地址 |
-i, --in-interface | iptables -A INPUT -i eth0 | 包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于 INPUT,FORWARD 和 PREROUTING 这三个链 |
-o, --out-interface | iptables -A FORWARD -o eth0 | 包离开本地所使用的网络接口来匹配包 |
-f, --fragment | iptables -A INPUT -f | 匹配一个被分片的包的第二片或及以后的部分 |
- TCP 匹配器(matchs)Kernel 2.3, 2.4, 2.5 and 2.6
Match | Example | Explanation |
---|
--sport, --source-port | iptables -A INPUT -p tcp --sport 22 | 基于 TCP 包的源端口来匹配包 |
--dport, --destination-port | iptables -A INPUT -p tcp --dport 22 | 目的端口用来匹配报文的目的端口 |
--tcp-flags | iptables -p tcp --tcp-flags SYN,FIN,ACK SYN | 匹配指定的 TCP 标记。有两个参数,它们都是列表,列表内部用 英文的逗号作分隔符,这两个列表之间用空格分开。第一个参数 指定我们要检查的标记(作用就象掩码),第二个参数指定“在 第一个列表中出现过的且必须被设为 1(即状态是打开的)的” 标记(第一个列表中其他的标记必须置 0)。也就是说,第一个 参数提供检查范围,第二个参数提供被设置的条件(就是哪些位 置 1)。这个匹配操作可以识别以下标记:SYN, ACK,FIN, RST ,URG,PSH。另外还有两个词也可使用,就是 ALL 和 NONE。 顾名思义,ALL 是指选定所有的标记,NONE 是指未选定任何标 记。这个匹配也可在参数前加英文的感叹号表示取反。例如: 1、iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 表示匹配那 些 SYN 标记被设置而 FIN 和 ACK 标记没有设置的包,注意各标记 之间只有一个逗号而没有空格。 |
2、--tcp-flags ALL NONE 匹配所有标记都未置 1 的包。 3、iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN 表示匹配 那些 FIN 和 ACK 标记被设置而 SYN 标记没有设置的包,注意和例 1 比较一下。 | | |
--syn | iptables -p tcp --syn | 这个匹配或多或少算是 ipchains 时代的遗留物,之所以还保留 它,是为了向后兼容,也是为了方便规则在 iptables 和 ipchains 间的转换。它匹配那些 SYN 标记被设置而 ACK 和 RST 标 记没有设置的包,这和 iptables -p tcp --tcp-flags SYN,RST,ACK SYN 的作用毫无二样。这样的包主要用在 TCP 连接 初始化时发出请求。如果你阻止了这样的包,也就阻止了所有由 外向内的连接企图,这在一定程度上防止了一些攻击。但外出的 连接不受影响,恰恰现在有很多攻击就利用这一点。比如有些攻 击黑掉服务器之后安装会一些软件,它们能够利用已存的连接到 达你的机子,而不要再新开一个端口。这个匹配也可用英文感叹 号取反,如:! --syn 用来匹配那些 RST 或 ACK 被置位的包,换 句话说,就是状态为已建立的连接的包。 |
--tcp-option | iptables -p tcp --tcp-option 16 | 根据选项匹配包。TCP选项是TCP头中的特殊部分,有三个不同的 部分。第一个 8 位组表示选项的类型,第二个 8 位组表示选项的 长度(这个长度是整个选项的长度,但不包含填充部分所占的字 节,而且要注意不是每个TCP选项都有这一部分的),第三部分当 然就是选项的内容了。为了适应标准,我们不必执行所有的选 项,但我们可以查看选项的类型,如果不是我们所支持的,那就 只是看看长度然后跳过数据部分。这个操作是根据选项的十进制 值来匹配的,它也可以用英文感叹号取反。所有的选项都可在 Internet Engineering Task Force里找到。 |
- udp 匹配器(matchs)Kernel 2.3, 2.4, 2.5 and 2.6
Match | Example | Explanation |
---|
--sport, --source-port | iptables -A INPUT -p udp --sport 53 | 基于 UDP 包的源端口来匹配包 |
--dport, --destination-port | iptables -A INPUT -p udp --dport 53 | 基于 UDP 包的目的端口来匹配包 |
- ICMP 匹配器(matchs)Kernel 2.3, 2.4, 2.5 and 2.6
Match | Example | Explanation |
---|
--icmp-type | iptables -A INPUT -p icmp --icmp-type 8 | ICMP类型匹配包,类型的指定可以使用十进制数值或相应的名字 |
- SCTP 匹配器(matchs)Kernel 2.3, 2.4, 2.5 and 2.6 流控制传输协议(SCTP)
Match | Example | Explanation |
---|
--sport,--source-port | | |
--dport,--destination-port | | |