基本概念

  • 表/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 对已经建立的连接也是有效的

相关命令

  1. cat /proc/sys/net/ipv4/ip_forward

为1则表示启动ip路由功能

查询路由表

  1. 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”
  1. iptables -t nat -A PREROUTING

扩展模块

tcp
—tcp-flags 匹配TCP的标记位

multiport

iprange: 用于支持一段连续的ip

  1. -m iprange --src-range 192.168.1.1-192.168.1.10
  2. --dst-range

time: 某些时间生效

  1. -m time --timestart 09:00:00 --timestop 18:00:00
  2. -m time --weekdays 6,7
  3. -m time --monthdays 6,7

可以组合使用

connlimit: 限制单个ip连接到服务端的并发量

  1. 设置上线为2
  2. -m connlimit --connlimit-above 2 -j REJECT
  3. 还能配合掩码使用
  4. -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT

limit: 限流

  1. -m limit 10/minute
  2. --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

  1. 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

  1. sudo iptables -t filter -A OUTPUT -p icmp -d 1.2.4.8 -j REJECT

列出nat表的所有路由规则

  1. sudo iptables -t nat -nvL
  1. #删除路由规则
  2. sudo iptables -t nat -D OUTPUT 1

  1. iptables -t nat -A PREROUTING -p tcp -d 172.23.184.229 --dport 8088 -j DNAT --to 172.23.187.206:80
  2. iptables -t nat -A POSTROUTING -p tcp -d 172.23.187.206 --dport 80 -j SNAT --to 172.23.184.229:8088

snat

  1. iptables -t nat -A POSTROUTING -p tcp -d 172.23.187.0/24 -j SNAT --to 172.23.184.229

dnat

  1. iptables -t nat -F
  2. iptables -t nat -nvL --line
  3. iptables -t nat -A PREROUTING -p tcp -d 172.23.184.229 --dport 8088 -j DNAT --to 172.23.187.206:80
  4. iptables -t nat -A POSTROUTING -p tcp -d 172.23.187.206 --dport 80 -j SNAT --to 172.23.184.229
  5. iptables -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

参考资料

  1. https://www.zsythink.net/archives/1199

其他

  1. xtables
  2. iptables
  3. nftables
  4. ufw

windows上的路由表