iptables quick start
简介
linux内置了一个强大的防火墙模块,称为iptables。用户通过在用户态操作iptables规则,可以使流量在内核态进行规则的匹配过滤。
Man手册中关于iptables的介绍为用于包过滤和NAT的系统工具。
iptables的规则可以从两个角度看。从功能上看,iptables分为多个已经定义好的table,每个table有自己的作用。从对包的操作流水线来看,iptables又是有各个CHAIN组成的。包在内核中游走的各个阶段分别会进入不同的CHAIN进行规则匹配操作。
iptables包含了预先定义好的5个table: filter, nat, mangle, raw, security. 比较常见的是前3个table。用户无法增加新的table
- filter: 这是默认用户在没有指定操作table时会操作的table。它包含了内置的INPUT, FORWARD, OUTPUT表。主要用于包过滤
- nat: 这张表的作用主要是对连接进行NAT,包括SNAT和DNAT。它包含了内置的PREROUTING, OUTPUT, POSTROUTING表。
- mangle: 主要用于对包内容的修改!例如进行mark!它包含了所有内置的CHAIN
iptables的各个table由各个CHAIN组成,内置了5个CHAIN在包游走的各个阶段使用CHAIN中的规则进行过滤操作。
- PREROUTING chain: 这个chain在包进入主机且没有在本机进行路由决策之前进行规则匹配。通常可以在这里进行DNAT, 例如访问docker容器
- INPUT chain: 经过本机路由决策后如果判定包是给本机的,则在包进入用户空间被进程处理之前会进过INPUT chain。
- FORWARD chain: 经过本机路由决策后发现需要路由到其他地方的,则进入该chain处理
- OUTPUT chain: 用户空间发出的包在进入内核后首先经过这个chain的处理
- POSTROUTING chain: 经过路由决策后需要发出去的包会经过该chain,可以在这里进行SNAT
具体的流程如下图所示
除了内置的5个CHAIN,用户还可以创建自己的CHAIN进行扩展。
基本命令
iptables [-t table] {-A|-C|-D} chain rule-specification
-A表示在末尾append一条规则
-C表示check规则存不存在
-D表示删除一条规则iptables [-t table] -I chain [rulenum] rule-specification
在第rulenum条规则前insert一条规则,默认为1,表示加在最开头iptables [-t table] -R chain rulenum rule-specification
replace规则iptables [-t table] -D chain rulenum
delete一条规则iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
-L表示list规则
-F表示清空规则
-Z表示清空包计数iptables [-t table] -N chain
新建一个chainiptables [-t table] -X [chain]
删除用户定义的chainiptables [-t table] -P chain target
设置默认的policy,target必须是ACCEPT或者DROPiptables [-t table] -E old-chain-name new-chain-name
重命名chain
其中:
1 | rule-specification = [matches...] [target] |
新增规则可以跟上以下参数1
2
3
4
5
6
7
8
9
10
11[!] -p, --protocol protocol 根据协议匹配,tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
[!] -s, --source address[/mask][,...] 源地址匹配
[!] -d, --destination address[/mask][,...] 目的地址匹配
-m, --match match 根据扩展模块进行匹配,后文说明
-j, --jump target 使用target进行处理,如ACCEPT,DROP,或者其他扩展的target如REJECT,SNAT,DNAT等。也可以进入用户自定义的chain中
-g, --goto chain 与-j类似,区别在于如果从chain回来,则不会继续在当前chain继续往下匹配而是return到上一层
[!] -i, --in-interface name 匹配入口网卡,如果name后面跟上+号,匹配所有前缀
[!] -o, --out-interface name 匹配出口网卡
[!] -f, --fragment 匹配非第一个ipv4分片
-c, --set-counters packets bytes 设置计数
--line-numbers 在列出规则时,可以显示rulenumber
以上就是iptables的基本用法了。
核心的iptables主要进行ACCEPT和DROP的工作,如果需要使用高级的功能,需要使用iptables的扩展模块。扩展模块对规则的匹配进行了扩展(使用-m match),对匹配规则的目标作用也进行了扩展,可以进行NAT等工作。
扩展
匹配扩展
addrtype
! –src-type type
! –dst-type type
type->[LOCAL, BROADCAST, BLACKHOLE, ]
cgroup
! –cgroup fwid
fwid 是被 cgroup net-cls 设置的
例子:iptables -A OUTPUT -p tcp –sport 80 -m cgroup ! –cgroup 1 -j DROP
multiport
! –sports|dports|ports port[,port|port:port]
set
[!] –match-set setname flag[,flag]
–return-nomatch
匹配ip集合,这个集合可以从ipset命令看到。在calico网络中就用到了这种匹配方式
例子:iptables -A FORWARD -m set –match-set test src,dst
state
state [state]
state->[INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED]
string
algo [BM|KMP]
from [offset]
to [offset]
string [str]
hex-string [str]
icase
tcp
! –sport|dport port[:port]
! –tcp-option number
! –tcp-flags mask comp mask为需要检查的flags,comp为需要检查的flags中哪些被设置,flags有[SYN ACK FIN RST URG PSH ALL NONE]. 例如iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
! –syn 与--tcp-flags SYN,RST,ACK,FIN SYN
等效
当指定-p tcp时使用
tcpmss
mss val[:val]
匹配tcp的mss范围
tos
! tos val[/mask]
! –tos symbol
匹配tos字段
udp
–sport|dport port[:port]
当指定-p udp时使用
目标扩展
CONNMARK
–set-xmark value[/mask]
DNAT [nat,PREROUTING,OUTPUT]
–to-destination [ip][:port]
修改目的ip
MARK
–set-xmark value[/mask]
–set-mark value[/mask]
MASQUERADE [nat,POSTROUTING]
–to-ports port
修改源ip地址, 主要用于主机ip会变化的情况。一般使用SNAT
REDIRECT [nat,PREROUTING,OUTPUT]
–to-ports port[-port]
重定向到本机地址如127.0.0.1
REJECT [INPUT, FORWARD and OUTPUT]
–reject-with type
type -> [icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited]
类似于DROP,但是会像请求方返回一个应答而不是不相应
SNAT [nat, POSTROUTING, INPUT]
–to-source [ipaddr[-ipaddr]][:port[-port]]
TOS [mangle]
–set-tos value[/mask]
–set-tos symbol
设置tos字段
TRACE
标记连接,之后每条匹配的rule都会被log