iptables 的报文匹配方法
iptables 规则的意思就是,对满足什么什么条件的报文,做怎样怎样的处理。第一步就是撰写报文的匹配规则,然后设置处理动作。这里收集 iptables 提供的报文匹配方法。
基本匹配
man iptables
的 PARAMETERS 中列出可以在规则中使用的参数:
-4, --ipv4
-6, --ipv6
[!] -p, --protocol protocol
[!] -s, --source address[/mask][,...]
[!] -d, --destination address[/mask][,...]
[!] -i, --in-interface name
[!] -o, --out-interface name
[!] -f, --fragment # 匹配分片报文
# This means that the rule only refers to second and
# further IPv4 fragments of fragmented packets.
支持的协议
-p 后面的 protocol 可以是数字表示的协议号,可以是下面的字符串(0 和 "all" 表示匹配所有协议),或者 /etc/protocols 中列出的协议名:
tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all
$ cat /etc/protocols
# /etc/protocols:
# $Id: protocols,v 1.11 2011/05/03 14:45:40 ovasik Exp $
#
# Internet (IP) protocols
#
# from: @(#)protocols 5.1 (Berkeley) 4/17/89
#
# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).
# Last IANA update included dated 2011-05-03
#
# See also http://www.iana.org/assignments/protocol-numbers
ip 0 IP # internet protocol, pseudo protocol number
hopopt 0 HOPOPT # hop-by-hop options for ipv6
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # internet group management
...省略...
扩展匹配
基本匹配的规则比较简单,只有协议、源地址、目的地址、接收网卡、发送网卡和分片报文,这几种匹配是远远不够的,iptables 的 -m 参数可以指定扩展模块,实现更复杂、更精细的匹配:
-m, --match match
iptables 提供的扩展模块非常多,种类和用法可以在 man iptables-extensions
中看到。
扩展模块分为 MATCH EXTENSIONS 和 TARGET EXTENSIONS 两类,前者用于报文匹配,后者用于报文处理。
下面是 MATCH EXTENSIONS 列表:
addrtype
ah (IPv6-specific)
ah (IPv4-specific)
bpf
cgroup
cluster
comment
connbytes
connlabel
connlimit
connmark
conntrack
cpu
dccp
devgroup
dscp
dst (IPv6-specific)
ecn
esp
eui64 (IPv6-specific)
frag (IPv6-specific)
hashlimit
hbh (IPv6-specific)
helper
hl (IPv6-specific)
icmp (IPv4-specific)
icmp6 (IPv6-specific)
iprange
ipv6header (IPv6-specific)
ipvs
length
limit
mac
mark
mh (IPv6-specific)
multiport
nfacct
osf
owner
physdev
pkttype
policy
quota
rateest
realm (IPv4-specific)
recent
rpfilter
rt (IPv6-specific)
sctp
set
socket
state
statistic
string
tcp
tcpmss
time
tos
ttl (IPv4-specific)
u32
udp
unclean (IPv4-specific)
匹配特定用户的报文
istio 中用下面的方法,对应用户 1337 启动的 envoy 进程创建的报文单独处理:
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN
使用用户名也可以:
iptables -t nat -A LOCAL_PROXY -m owner --uid-owner nginx -j RETURN