[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
- 常用命令
- 用户与用户组
- 创建用户与用户组
- 快速脚本
- umask
- Yum源
- 基础Yum源
- Epel源
- 制作Yum源
- 同步Yum源
- 为Yum源配置代理
- 下载RPM及依赖
- 系统与内核
- 获取内核的rpm包
- 升级内核
- Iptables
- 基本语法
- 匹配条件
- 基础匹配条件
- 扩展匹配条件
- Addrtype
- Set
- TCP
- Mark
- Multiport
- 目标
- 基本目标
- 扩展目标
- DNAT
- LOG
- CT
- NOTRACK
- MARK
- IP set
- 连接追踪
- 初识连接追踪
- 连接追踪详解
- NAT
- 思路与参考汇总
- 数据结构
- FAQ
- Keepalived
- 单网卡多VIP
- 安装Keepalived
- 双网卡绑VIP
- 别名VIP和辅助VIP
- LVS
- 安装LVS
- Ipvsadm命令
- 磁盘与分区
- 基础知识
- 创建分区
- 格式化与挂载
- Fstab
- LVM
- LVM扩容
- Swap分区
- Tmpfs
- 网络相关
- 重命名网卡
- resolv.conf
- Tcpdump
- nslookup与dig
- ifcg-xxx
- 主机名
- 软件安装
- NFS
- Squid
- Redsocks
- Shadowsocks
- 时钟同步
- Chrony
- FTP
- 文件句柄
- 简介
- 设置文件句柄
- 其他
- SSH密钥登录
- 进程组-会话-终端
- X11转发
- 环境变量
- 常见问题
- 系统进程数
- 系统调用
- 系统调用FAQ
- 用户程序如何进行系统调用