鉴于使用情况有限,扩展部分(Match Extensions
Target Extensions
)暂只梳理常见项,待更新。
注: 请结合Usage
中table、chain、rule-specification和options的位置阅读本文,更易食用。
1. Usage:
iptables [-t table] -[ACD] chain rule-specification [options] |
2. Tables(表)
filter
默认表值nat
当创建新连接的数据包时mangle
该表用于专门的数据包更改raw
该表主要用于与NOTRACK目标一起配置免除连接跟踪的功能。它在具有优先级的netfilter钩子处注册,因此在ip_conntrack或任何其他IP表之前被调用
3. Chain(链)
filter
表中的ChainINPUT
用于发往本地套接字的数据包FORWARD
用于通过盒子路由的数据包OUTPUT
用于本地生成的数据包
nat
表中的ChainPREROUTING
用于在进入后立即更改数据包OUTPUT
用于在路由之前更改本地生成的数据包POSTROUTING
用于在即将外出时更改数据包
mangle
表中的ChainPREROUTING
用于在路由之前更改传入的数据包OUTPUT
用于在路由之前更改本地生成的数据包INPUT
用于进入的数据包FORWARD
用于更改通过包装箱路由的数据包POSTROUTING
用于更改将要包装的数据包
raw
表中的ChainPREROUTING
用于通过任何网络接口到达的数据包OUTPUT
用于由本地进程生成的数据包
4. rule-specification(规则)
规则是以列表的方式被加进每条链。
每个包会从第一条规则开始检查,直至最后一条。假若包与其中一条规则吻合,相应的Target便会被执行,例如接纳(ACCEPT)或丢弃(DROP)包。
一旦有吻合的规则,这个包便会按照规则来处理,而不再被链内的其它规则所检查。假如包通过所有检查而不符合任何规则链内的任何一条规则,那这条链的缺省动作将会被执行,这就是所谓的缺省政策(-P, --policy
),可以设置为接纳(ACCEPT)或丢弃(DROP)封包。
5. Targets(目标)
防火墙规则指定数据包的标准和target(目标),如果数据包不匹配,则检查链中的下一个规则;如果匹配,则下一个规则由目标值指定,该值可以是用户定义chain的名称,也可以是特殊值: - ACCEPT
- DROP
- QUEUE
- RETURN
以及后面详细介绍的Target Extensions
6. options(选项)
-A, --append chain rule-specification
增加-I, --insert chain [rulenum] rule-specification
插入-D, --delete chain rule-specification/rulenum
删除-F, --flush [chain]
冲洗选定的链(如果没有指定chain,代表表中的所有链)。这等效于删除所有规则。-R, --replace chain rulenum rule-specification
替换-L, --list [chain]
列出所选链中的所有规则-Z, --zero [chain]
将选定的链(如果没有指定chain,代表表中的所有链)的数据包和字节计数器清零。同样指定-L,-- list(list)选项是合法的,以便在清除计数器之前立即查看它们。-N, --new-chain chain
通过给定名称创建一个新的用户定义链。该名称必须没有target。-X, --delete-chain [chain]
删除指定的用户自定义链,不能有规则引用该链,必须删除或替换引用规则,然后才能删除链。如果未提供任何参数,它将尝试删除表中的每个非内置链。-P, --policy chain target
为链的政策设置为某个Target,如iptables -P INPUT DROP
指将INPUT
链的缺省政策改为DROP
-E, --rename-chain old-chain new-chain
重命名链
7. 参数
以下参数构成rule-specification(规则)规范(在添加,删除,插入,替换和追加命令中使用)。 - -p, --protocol [!] protocol
规则中要匹配的数据包的协议,protocol可以是tcp
udp
icmp
或all
,缺省all
,还允许/etc/protocols
中的协议名称,0
代表all
,!
代表反转,! tcp
代表匹配非tcp协议 - -s, --src, --source [!] address[/mask]
规则中要匹配的数据包的来源,address可以是网络名称、主机名、网络IP地址(带有/mask)或纯IP地址。该mask(掩码)可以是网络掩码,也可以是纯数字,如24
等效于255.255.255.0
- -d, --dst, --destination [!] address[/mask]
规则中要匹配的数据包的目的地,参考-s
- -j, --jump target
指定规则的目标,即,如果数据包匹配,该怎么办。target可以是用户定义的链(此规则所在的链除外),可以是立即确定数据包命运的特殊内置Target
之一(如ACCEPT
),也可以是Target Extensions
。如果在规则中省略了此选项(并且未使用-g),则匹配规则将不会影响数据包的命运,但是规则上的计数器将增加。 - -g, --goto chain
这指定处理应按用户指定的链继续进行。与--jump
选项不同,--goto
将return且不在此链中继续处理,而--jump
是在链中继续处理。 - -i, --in-interface [!] name
接收数据包所通过的接口的名称(仅适用于INPUT
,FORWARD
和PREROUTING
链的数据包),如-i eth0
。!
代表取反,+
结尾代表任何以该名称开头的接口都将匹配。如果省略此选项,则任何接口名称都将匹配。 - [!] -f, --fragment
这意味着该规则仅引用分段数据包的第二个片段和之后的片段,由于片段无法告知此类数据包(或ICMP类型)的源端口或目标端口,因此此类数据包将不匹配任何指定它们的规则,! -f
时该规则将仅匹配头片段或未分段的数据包。 - -c, --set-counters PKTS BYTES
这使管理员可以初始化规则的包和字节计数器(在INSERT,APPEND,REPLACE操作期间)。 - -v, --verbose
详细输出。此选项使list命令显示接口名称,规则选项(如果有)和TOS掩码。对于追加,插入,删除和替换,这将导致打印有关一个或多个规则的详细信息。 - -n, --numeric
数值输出。显示IP地址和端口号,默认情况下,程序将尝试将它们显示为主机名,网络名或服务。 - -x,--exact
显示数据包和字节计数器的确切值,此选项仅与-L
命令有关。 - --line-numbers
列出规则时,将行号添加到每个规则的开头,对应于该规则在链中的位置。 - --modprobe=command
在将规则添加或插入到链中时,请使用command
来加载任何必要的模块(Target
,Match Extensions
等)
8. Match Extensions(匹配扩展)(只列出常见)
扩展的数据包匹配模块,两种方式 - -p, --protocol
隐式地,如-p icmp
则会加载icmp
扩展 - -m, --match module
加载特定module模块
可以在一行中指定多个扩展匹配模块,详情见: Match Extensions
account
定义网络/mask中所有主机的帐户流量
示例:
192.168.0.0/24网络的帐户流量进入表mynetworkiptables -A FORWARD -m account --aname mynetwork --aaddr 192.168.0.0/24
icmp
如果指定了--protocol icmp
,则会加载此扩展名。它提供以下选项:--icmp-type [!] typename
这允许指定ICMP类型,该类型可以是数字ICMP类型,也可以是命令显示的ICMP类型名称之一。 如:iptables -p icmp -h
mport
此模块与一组源端口或目标端口匹配。最多可以指定15个端口。它只能与-p tcp或-p udp结合使用。--sports, --source-ports port[,port[,port...]]
如果源端口是给定端口之一,则匹配。--dports, --destination-ports port[,port[,port...]]
如果目标端口是给定端口之一,则匹配。--ports port[,port[,port...]]
如果源端口和目标端口彼此相等并且与给定端口之一相等,则匹配。
multiport
此模块与一组源端口或目标端口匹配。最多可以指定15个端口。端口范围(port:port)被视为两个端口。它只能与-p tcp或-p udp结合使用。--sports, --source-ports [!] port[,port[,port:port...]]
如果源端口是给定端口之一,则匹配。--dports, --destination-ports [!] port[,port[,port:port...]]
如果目标端口是给定端口之一,则匹配。--ports [!] port[,port[,port:port...]]
如果源端口或目标端口等于给定端口之一,则匹配。
osf
操作系统--log 1/0
--smart
如果存在,则OSF将使用一些智能来确定远程OS。仅当连接源位于我们的本地网络中时,OSF才会使用初始TTL。--netlink
如果存在,则OSF还将通过netlink NETLINK_NFLOG组1记录所有事件。--genre [!] string
通过被动指纹匹配操作系统类型
示例:
iptables -I INPUT -j ACCEPT -p tcp -m osf --genre Linux --log 1 --smart
set
该模块包含可以由ipset
定义的IP集。--set setname flag[,flag...]
其中的flag是src
dst
,并且最多可以包含六个
示例:
在指定的数据集中找到数据包的源地址或端口号(取决于数据集的类型),如果存在规则才会与数据包匹配iptables -A FORWARD -m set --set test src,dst
state
与连接跟踪结合使用时,此模块允许访问此数据包的连接跟踪状态。--state state
其中state是要匹配的连接状态的逗号分隔列表INVALID
由于某种原因无法识别该数据包,,包括内存不足和与任何已知连接都不对应的ICMP错误ESTABLISHED
已建立连接NEW
已开始新连接,但还没有建立连接RELATED
正在开始新的连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。
string
该模块通过使用某些模式匹配策略来匹配给定的字符串。它需要> = 2.6.14的Linux内核。--algo bm|kmp
选择模式匹配策略。--from offset
设置从其开始寻找任何匹配的偏移量。如果未通过,则默认为0。--to offset
设置从其开始寻找任何匹配的偏移量。如果未通过,则默认为数据包大小。--string pattern
匹配给定的模式。--hex-string pattern
以十六进制表示法匹配给定的模式。
tcp
加载tcp扩展--sport, --source-port [!] port[:port]
源端口。还可以使用port:port格式指定包含范围,如果省略第一个端口,则假定为"0",如果省略最后一个,则假定为"65535",如果第二个端口大于第一个,则将交换它们。--dport, --destination-port [!] port[:port]
目标端口,参考--sport
--tcp-flags [!] mask comp
当TCP标志如指定时则匹配。mask是我们应该检查的标志,写为以逗号分隔的列表,comp是必须设置的以逗号分隔的标志列表。标志为:SYN ACK FIN RST URG PSH ALL NONE。
示例:
仅匹配设置了SYN标志且未设置ACK,FIN和RST标志的数据包iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn
仅匹配SYN位置为1,且ACK,RST和FIN位为零的TCP数据包。匹配后,阻止此类数据包进入接口,将阻止传入的TCP连接,但传出的TCP连接将不受影响。它等效于--tcp-flags SYN,RST,ACK,FIN SYN
。! --syn
代表含义反转。--tcp-option [!] number
如果设置了TCP选项,则匹配。参见: TCP options Number列--mss value[:value]
将TCP SYN或SYN/ACK数据包与指定的MSS值(或范围)匹配,以控制该连接的最大数据包大小。
udp
加载udp扩展--sport, --source-port [!] port[:port]
源端口,参考TCP部分--dport, --destination-port [!] port[:port]
目标端口,参考TCP部分
9. Target Extensions(目标扩展)(只列出常见)
DNAT
端口转发。该Target仅在nat表,PREROUTING和OUTPUT链以及仅从那些链中调用的用户定义的链中有效。它指定应修改数据包的目标地址(并且此连接中所有将来的数据包也将被修改),并且规则应停止检查。--to-destination ipaddr[-ipaddr][:port-port]
它可以指定一个新的目标IP地址,一个IP地址(包括端值)范围和一个可选的端口范围(仅在规则还指定-p tcp或-p udp时才有效)。如果未指定端口范围,则将永远不会修改目标端口。 示例:外界请求eth0的tcp 3124端口,则在路由前修改DESTINATION为内网的192.168.100.10:3000端口,如果destination是本机的话,还可以使用iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3124 -j DNAT --to-destination 192.168.100.10:3000
REDIRECT
:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
SNAT
源NAT,该Target仅在POSTROUTING链的nat表中有效。它指定应修改数据包的源地址(此连接中所有将来的数据包也将被修改),并且规则应停止检查。--to-source ipaddr[-ipaddr][:port-port]
它可以指定一个新的源IP地址,一个IP地址(包括端值)范围和一个可选的端口范围(仅在规则还指定-p tcp或-p udp时才有效)。如果未指定端口范围,则低于512的源端口将被映射到低于512的其他端口:介于512和1023之间(包括512和1023之间)的那些端口将被映射到低于1024的端口,而其他端口将被映射到1024或更高版本。尽可能不发生端口更改。
DNAT VS SNAT
SNAT
修改的是Source的地址,也就是要在路由后修改Source,故而配置POSTROUTING规则DNAT
修改的是Destination的地址,也就是在路由前修改Destination,故而配置PREROUTING规则,详情见规则链图。
MASQUERADE
源NAT,该Target仅在POSTROUTING链的nat表中有效。它仅应与动态分配的IP(拨号)连接一起使用:如果您具有静态IP地址,则应使用SNAT。伪装等同于指定到数据包出接口的IP地址的映射,但是还具有当接口断开时会忘记连接的效果。当下一次拨号不太可能具有相同的接口地址(因此,无论如何建立的连接都会丢失)时,这是正确的行为。--to-ports port[-port]
这指定了要使用的源端口范围,将覆盖默认的SNAT源端口选择启发式方法(请参见上文)。仅当规则还指定-p tcp或-p udp时,此选项才有效。
SNAT VS MASQUERADE
这两个Target都在POSTROUTING链的nat表中提供源NAT(或SNAT)。
差异性:- MASQUERADE不需要
--to-source
,因为它可以用于动态分配的IP地址。 - SNAT 使用静态IP地址。
- MASQUERADE比起SNAT每次MASQUERADE目标被数据包击中,目标都要检查要使用的IP地址,它具有额外的开销,并且速度较慢。
重要说明:仍然可以将MASQUERADE目标与静态IP 一起使用。请注意,这将增加额外的开销(用于计算)。
示例:# stick to SNAT for static IP
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to-source ELASTIC_IP
# don't be lazy, simple but slower due to more overhead
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE- MASQUERADE不需要
MARK
这用于设置与数据包关联的netfilter标记值。它仅在mangle表中有效。例如,它可以与iproute2结合使用。--set-mark mark
REDIRECT
跳转。 该Target仅在nat表,PREROUTING和OUTPUT链以及仅从那些链中调用的用户定义的链中有效。通过将目标IP更改为传入接口的主地址,它将数据包重定向到计算机本身(本地生成的数据包映射到127.0.0.1地址)。--to-ports port[-port]
这指定了目标端口或端口范围(使用:),没有此端口,就永远不会更改目标端口。仅当规则还指定-p tcp或-p udp时,此选项才有效。
REJECT
驳回。这用于响应匹配的数据包时发回错误数据包,否则,它等效于DROP,因此它是终止Target,结束规则遍历。该目标仅在INPUT,FORWARD和OUTPUT链以及仅从这些链调用的用户定义的链中有效。以下选项控制返回的错误包的性质:--reject-with type
它返回适当的ICMP错误消息。type可以是- icmp-net-unreachable
- icmp-host-unreachable
- icmp-port-unreachable 默认
- icmp-proto-unreachable
- icmp-net-prohibited
- icmp-host-prohibited
- icmp-admin-prohibited 将icmp-admin-prohibited与不支持的内核一起使用将导致普通的DROP而不是REJECT
- tcp-reset 只能与TCP协议一起使用,告诉
REJECT
发送一个TCP RST在应答数据包。TCP RST数据包用于正常关闭打开的TCP连接。
TARPIT
困住连接放到坑里。接受连接,但立即切换到持久状态(0字节窗口),在该状态中,远程端停止发送数据并要求每60-240秒继续一次。尝试关闭连接的尝试将被忽略,从而迫使远程端在12-24分钟内使连接超时。
错误想法:
TARPIT
可用于浪费攻击者的资源,从而减慢攻击速度并降低其攻击其他主机的能力,用来处理(D)DoS。
考虑一下:
攻击者每秒创建数千个服务器连接,如果每个连接都被困在tarpit中,则这些连接将如何影响服务器。您的服务器将快速消耗其所有可用资源(或文件句柄),从而不再允许连接。这比仅关闭连接还差。暂时放下犯罪者(REJECT)比尝试占用他的资源(TARPIT)要好。
10. 参考
https://linux.die.net/man/8/iptables
11. 重启iptables
开关防火墙 - 重启后生效 开启: chkconfig iptables on
关闭: chkconfig iptables off
- 即时生效,重启后失效 开启:
service iptables start
关闭:service iptables stop
12. 规则链图(转)
来自《鸟哥私房菜》
无Mangle的表更加常用,分析起来逻辑更加清晰。
