多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### **语法** ``` -m set [options] ``` `-m`可以简写为`--match`。常用的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** * http://ipset.netfilter.org/iptables-extensions.man.html