跳到主要内容

iptables

netfilter:hook 回调框架.

iptables:防火墙配置软件, 底层使用 netfilter。

  1. PRE_ROUTING 路由查找之前
  2. LOCAL_IN 目标地址是本机
  3. FORWARD 目的地是其他网络节点
  4. LOCAL_OUT
  5. POST_ROUTING

nftables, eBPF

INPUT

OUTPUT

FORWARD

tables

Filter table (默认)

  • input 进入防火墙
  • output 出防火墙
  • forward 转发到其他网络(通过本机路由的数据包)

NAT table

  • PREROUTING 在路由前修改数据包。(进入系统之后,路由之前) DNAT(目标网络地址转换)
  • POSTROUTING 在路由之后修改数据包。(数据包离开系统时)SNAT(源网络地址转换)
  • OUTPUT 防火墙本地生成数据包的 NAT 转换

Manage table

修改 tcp 报文的头部

  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING

不常用的 tables

  • raw table
  • security table

高级 NAT 配置

伪装源IP (SNAT)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

对网卡 eth0 出去的流量的 源 IP 进行伪装。

MasqueradingSNAT 的更智能的形式。(会将源 ip 改为出口网卡的有效IP)

端口转发

将访问本机 8080 端口的请求转发到 192.168.1.100:80

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

-t nat 指定 nat 表

-A PREROUTING 指定 PREROUTING 链

-p tcp --dport 8080 触发条件

-j DNAT 要执行的动作

--to-destination 192.168.1.100:80 将目标地址改为 192.168.1.100:80

图解

alt text

这个图片中有三条线路

  1. network -> prerouting(nat) -> routing -> input -> host(app)
  2. host(app) -> output(filter,nat) -> postrouting(nat) -> network
  3. network -> routing -> forward -> postrouting -> network

从 routing 处会分叉

  1. 目标地址是本机上的应用,会转到 INPUT
  2. 目标地址非本机,会转到 FORWARD。 (本机作为中转)