基本概念
- 表/table: 内置了3个表 nat/mangle/filter, 默认是对filter表做操作, 每个表里有多个链条, 在不同场景下不同链条生效
- nat: 网络地址转换
- mangle: 数据表进行标记
- filter: 过滤包
- raw: 少见 不介绍
- 链/chain: chain上挂了很多规则, 一条一条地执行过去, 表包含某些链
- FORWARD: 非本地生成且目标非本地的包 mangle/nat
- INPUT: 目的地是本地的包, mangle/filter
- OUTPUT: 本地生成的包, raw/mangle/nat/filter
- PREROUTING: 可存在于 raw/mangle/nat
- POSTROUTING: managle/nat
比较重要的是filter和nat.
对于一个给定的chain, 如果它同时出现在多个table里, 那么按如下的顺序执行:
raw -> mangle -> nat -> filter
table+chain 其实只是用于分类数据包的处理阶段而已.
iptables 对已经建立的连接也是有效的
相关命令
cat /proc/sys/net/ipv4/ip_forward
为1则表示启动ip路由功能
查询路由表
route -n
自定义链
自定义链可以用于更细粒度的分类, 否则你的不同用途的规则都会放在默认的链里, 不好管理.
建立自定义链之后, 可以想往常一样向里面添加规则.
那自定义链怎样才能生效呢?
答案是, 需要在默认链里配置规则, 一旦满足这些规则就将处理流程转到自定义链里.
有点一些httpserver配置路由时的 SubRoute() 的味道了
-X 删除自定义链
参数
- -t: 指定一个表, 如果不指定默认是filter
- -A/—append
: 追加规则到指定chain - -D/—delete
: 从指定chain删除规则, index是规则序号 - -I/—insert: 在指定位置插入一条规则
- -R: 修改指定序号的规则
- -P/—polocy
: 设置目标chain在条件没匹配下的默认action - -F/—flush [
]: 清空指定的链条的所有规则 - -n: 使用数字形式, 而不对ip做名称反解析
- -v: verbose
- -L: 列出配置
- —line/—line-number: 打印序号
- -x: 显示精确数值, 而不是人可读的数值
- -m: 使用扩展模块
匹配(match)
- -p/—protocol: 匹配协议 tcp/udp/icmp,all(匹配所有), 加!感叹号可以取反
- -s/—source: 匹配源IP, 简单IP 掩码形式 感叹号取反 可以用逗号隔开表示多个
- -d/—destination: 类似source
- -i: 匹配入网卡
- -o: 匹配出网卡
- —sport: 源端口, 22 23:25 !22
- —dport: 目标端口
- —sports/—dports 指定多个离散的端口 22,24,26 依赖-m multiport, 还能支持 “23,25:30”
iptables -t nat -A PREROUTING
扩展模块
tcp
—tcp-flags 匹配TCP的标记位
multiport
iprange: 用于支持一段连续的ip
-m iprange --src-range 192.168.1.1-192.168.1.10--dst-range
time: 某些时间生效
-m time --timestart 09:00:00 --timestop 18:00:00-m time --weekdays 6,7-m time --monthdays 6,7
可以组合使用
connlimit: 限制单个ip连接到服务端的并发量
设置上线为2个-m connlimit --connlimit-above 2 -j REJECT还能配合掩码使用-m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
limit: 限流
-m limit 10/minute--limit-burst=5 底层用的是令牌桶算法 初始化桶是满的
state: 跟踪tcp的状态
可以实现 “只允许回包”, 不允许主动建联
https://www.zsythink.net/archives/1597
目标(target)
-j: 行为
- DROP: 默默丢弃, 不做任何处理
- ACCEPT: 通过
- REJECT: 明确拒绝掉, 会返回错误信息
- RETURN: 停止表里包含该规则的链(相当于break出去)
- DNAT: 修改目标地址
- SNAT: 修改源地址
- MASQUERADE: SANT的一种特殊形式
- REDIRECT: 在本机做端口映射
- LOG: 记录日志
链条里的规则按顺序执行, 一旦发生匹配ACCEPT/DROP/REJECT就直接break了
例子
将发往 192.168.31.175:80 的 TCP 请求转给 172.23.187.206:80
sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.31.175 --dport 80 -j DNAT --to-destination 172.23.187.206:80
禁止ping 1.2.4.8
sudo iptables -t filter -A OUTPUT -p icmp -d 1.2.4.8 -j REJECT
列出nat表的所有路由规则
sudo iptables -t nat -nvL
#删除路由规则sudo iptables -t nat -D OUTPUT 1
iptables -t nat -A PREROUTING -p tcp -d 172.23.184.229 --dport 8088 -j DNAT --to 172.23.187.206:80iptables -t nat -A POSTROUTING -p tcp -d 172.23.187.206 --dport 80 -j SNAT --to 172.23.184.229:8088
snat
iptables -t nat -A POSTROUTING -p tcp -d 172.23.187.0/24 -j SNAT --to 172.23.184.229
dnat
iptables -t nat -Fiptables -t nat -nvL --lineiptables -t nat -A PREROUTING -p tcp -d 172.23.184.229 --dport 8088 -j DNAT --to 172.23.187.206:80iptables -t nat -A POSTROUTING -p tcp -d 172.23.187.206 --dport 80 -j SNAT --to 172.23.184.229iptables -t nat -R PREROUTING 1 -p tcp -d 172.23.184.229 --dport 8088 -j DNAT --to 172.23.183.234:80
https://www.zsythink.net/archives/1764
参考资料
其他
- xtables
- iptables
- nftables
- ufw
