1 iptables概述
iptables会对网络数据包进行匹配,符合条件的,则根据相应的处理动作来处理。
防火墙,限流限速等功能都可以用iptables完成。
iptables包含四个表,五个链。
表按照对数据包的操作划分,链按照hook点划分
规则按顺序挂载在链上,链保存到表中。
实际运行时,一条完整的链可能有多种表的规则,例如:
PREROUTING链上,有mangle、nat两个表的规则,则先由mangle表处理,再由nat表处理。
2 iptables基本语法
一条iptables规则基本由如下语句来定义:
iptables [-t table] command chain [creteria] -j action
其中:
table:指定该规则要加入的表,有filter、nat、mangle三个表可选,默认为filter,可以缺省
command:指定该规则的行为,不能缺省
chain:指定规则属于的链,有PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD供选择,不能缺省
creteria:指定匹配条件,可以缺省
action:指定处理动作,有ACCEPT、DENY、DROP、REJECT、SNAT、DNAT,不能缺省
具体的用法有如下几类:
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
2.1 table
表名 | 说明 |
---|---|
filter | 用于过滤数据包 有3个链: INPUT:针对目的地址为本地的包 OUTPUT:针对源地址为本地的包 FORWARD:针对剩余的包 |
nat | 用于网络地址转换 有3个链 PREROUTING:当数据包刚到达防火墙时改变其目标地址 POSTROUTING:当数据包即将离开防火墙时改变其源地址 OUTPUT:改变本地产生的包的目的地址 |
mangle | 用于操作数据包,改变包或包头内容 有5个链,任意阶段都可以操作 |
raw | 常用于跳过处理,提高性能 有2个链: PREROUTING:对接收到的包全部放行 OUTPUT:对发出的包全部放行 |
优先级方面,raw>mangle>nat>filter。
2.2 command
命令 | 说明 |
---|---|
-A --append | 在所选择的chain末尾加入规则 |
-C --check | 检查规则是否存在 |
-D --delete | 在所选择的链中删除指定序号的规则 |
-I --insert | 在指定链的指定位置上插入规则,默认插第一个 |
-R --replace | 替换指定位置的规则 |
-L --list | 列出所选链的全部规则 |
-F --flush | 清空所选的链,没有指定则清空全部链 |
-Z --zero | 把指定链的所有计数器归零 |
-N --new-chain | 新建自定义链 |
-X --delete-chain | 删除自定义链 |
-E --rename-chain | 重命名自定义链 |
-P --policy | 设置默认策略 |
2.3 chain
按照先后顺序:
链名 | 说明 |
---|---|
PREROUTING | 在数据包进入路由表之前生效 |
INPUT | 通过路由表之后,对目的地址为本机的数据包生效 |
FORWARD | 通过路由表之后,对目的地址不是本机的数据包生效 |
OUTPUT | 由本机产生,向外转发时生效 |
POSTROUTING | 数据包发送到网卡之前生效 |
2.4 creteria
匹配项 | 说明 |
---|---|
-s --source [!]IP | 匹配源地址,! 表示取反 |
-d --destination [!]IP | 匹配目的地址 |
-p --protocol [!]proto | 匹配协议,tcp/udp/icmp |
-i --in-interface if | 匹配从if网口进入的包 |
-o `–out-interface if | 匹配从if网口出去的包` |
当指定协议之后,会有隐含匹配项
tcp隐含匹配项 | 说明 |
---|---|
--sport port | 匹配源端口 |
--dport port | 匹配目的端口 |
--tcp-flags tcp标志位 |
udp隐含匹配项 | 说明 |
---|---|
--sport port | 匹配源端口 |
--dport port | 匹配目的端口 |
icmp隐含匹配项 | 说明 |
---|---|
--icmp-type | 8/request 表示请求,0/reply 表示响应 |
3 常见场景实例
4 iptables文档
Usage:
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--wait -w [seconds] wait for the xtables lock
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe=<command> try to insert modules using this command
--set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version.