Set
--match set [options]
--match set [options]
--match
可以简写为-m
。常用的options
[!] --match-set <set> src
源地址在
<set>
中,前面加!
表示“源地址不在<set>
中”[!] --match-set <set> dst
目的地址在
<set>
中,前面加!
表示“目的地址不在<set>
中”
<set>
的值可以通过命令ipset list <set>
查看
示例
在k8s集群中,我们有时希望Pod能够访问外网,而Pod本身的IP又是一个内部IP,此时我们就需要做SNAT。但是,我们又想Pod访问Pod时,不做SNAT。假设Pod的地址段为172.26.0.0/16
。那么我们可以如下进行手动设置
首先创建一个名字为pod-cidr
、类型为hash:net
的set
$ ipset create pod-cidr hash:net
然后添加172.26.0.0/16
这个net
到pod-cidr
中
$ ipset add pod-cidr 172.26.0.0/16
查看pod-cidr
的详情,发现已经添加了一个条目
$ ipset list pod-cidr
Name: pod-cidr
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 408
References: 0
Number of entries: 1
Members:
172.26.0.0/16
接下来我们在POSTROUTING
中添加一条规则,使Pod到外网的包要做SNAT、Pod到Pod的包不做SNAT
$ iptables -t nat -I POSTROUTING -m set --match-set pod-cidr src -m set ! --match-set pod-cidr dst -j MASQUERADE
查看刚刚添加的规则
$ iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 match-set pod-cidr src ! match-set pod-cidr dst
Reference
Last updated
Was this helpful?