Iptables 一生逃不掉的东西

Posted on 11月 13, 2024

IP 报文

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Ip报文

Iptables常用字段

  • Source Address: 源IP地址
  • Destination Address: 目的IP地址
  • Time to Live(TTL): 生存时间 可经过的最多路由数,每经过一个路由就会减1
  • Protocol: 下层协议 TCP/UDP/ICMP/其他 指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理
  • Type of Service(TOS): 服务类型

IPtables 的五个Hook点

->进入网卡
    -> **PREROUTING(PRE_ROUTING)**:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
        ->进入路由决策
            -> 本机接收
                -> **INPUT(LOCAL_IN)**: 经过路由判断后,目标地址是本机的接收数据包到达此hook触发
            -> 转发
                -> **FORWARD(FORWARD)**: 经过路由判断后,目标地址不是本机地址的数据包到达此hook触发点

-> 本机发送
    -> 路由决策
        -> **OUTPUT(LOCAL_OUT)**: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点

-> 转发 or 本机发送
    -> **POSTROUTING(POST_ROUTING)**: 本机产生准备发出的包或者转发的包,在经过路由判断后到达此hook触发点

alt text

五表五链

在IPtables中实际有五张表常用的有三张表,而五链则是针对每个表的五个hook点的处理逻辑。每张表有固定的链

五表

filter表

过滤

  • INPUT:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
  • OUTPUT: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点
  • FORWARD: 经过路由判断后,目标地址不是本机地址的数据包到达此hook触发

nat表

网络地址转换

  • PREROUTING:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
  • POSTROUTING: 本机产生准备发出的包或者转发的包,在经过路由判断后到达此hook触发点
  • OUTPUT: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点

mangle表

包处理 篡改包

五张链都有

  • INPUT:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
  • PREROUTING:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
  • POSTROUTING: 本机产生准备发出的包或者转发的包,在经过路由判断后到达此hook触发点
  • FORWARD: 经过路由判断后,目标地址不是本机地址的数据包到达此hook触发
  • OUTPUT: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点

raw表(不常用)

security表(不常用)

五链

在Iptables中 Hook点以chain的形式出现,而每条链又是由一条或多条规则组成

Iptables 基础使用

修改链的动作

iptables -P FORWARD DROP # 将FORWARD链的默认动作设置为DROP(丢弃)

向链中追加规则

# iptables -A 链 MATCH条件 -j 动作    
#Match和动作是可选的但是不能同时为空 
#只有match没有动作时不会有任何效果 可以进行流量统计
#只有动作没有match默认对所有包生效
iptables -A FORWARD -s 237.84.2.178 -j DROP # 将FORWARD链的动作设置为DROP(丢弃)

删除规则

# 使用策略原文删除
iptables -D FORWARD -s 237.84.2.178 -j DROP 
# 使用序号删除
iptables -D FORWARD -F 1 # 删除FORWARD链的第一个规则 iptables策略序号从1开始 当1被删除后2就变成1

插入规则

iptables -I FORWARD 1 -s 237.84.2.178 -j DROP # 加入成为FORWARD链的第一个规则 

列出规则

iptables -L FORWARD # 列出FORWARD链的所有规则
iptables -L # 列出当前表的所有链规则

Match条件

Match 多个条件永远是且的关系 A AND B AND C AND D AND E 不是所有的match条件 在任何链中都可以使用

match 条件

  • -i: 指定输入接口 网卡
  • -o: 指定输出接口 网卡
  • -s: 指定源地址 IP/CIDR
  • -d: 指定目的地址 IP/CIDR
  • -p: 指定协议

动作

  • -j
    • DROP: 丢弃
    • ACCEPT: 允许
    • 自定义链: 自定义链作为动作使用
  • -g: 跳转到自定义链 goto 此时不会回到原来的链中 结束后默认执行原来链最后的动作

新建链

自定义链作为动作使用

iptables -N mychain # 新建名为mychain的链

当自定义链中的命中动作为 return 时 会返回到原来的链中 会回到最初的第一个链中
自定义链策略执行完也会返回到原来的链中 因为自定义链是没有默认动作的

扩展Iptables

match 扩展模块

target 扩展模块

SNAT 源地址转换 nat表 POSTROUTING

iptables -t nat -A POST_ROUTING -o eth0 -j SNAT --to 要转换源IP

DNAT 目的地址转换 nat表 PREROUTING 内网映射 负载均衡

内网映射

iptables -t nat -A PREROUTING -i eth0 -j DNAT -p tcp -m tcp --dport 要转换的目的端口 --to 要转换的目的IP

负载均衡 statistics

iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 \
         -m statistic --mode random --probability 0.33            \
         -j DNAT --to-destination 10.0.0.2:1234

iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 \
         -m statistic --mode random --probability 0.5             \
         -j DNAT --to-destination 10.0.0.3:1234

iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 \
         -j DNAT --to-destination 10.0.0.4:1234

请注意,这里定义了 3 个不同的概率,而不是到处都是 0.33。原因是规则是按顺序执行的。

以 0.33 的概率,第一条规则将在 33% 的时间内执行,在 66% 的时间内被跳过。

概率为 0.5 时,第二条规则将在 50% 的时间内执行,50% 的时间内跳过。但是,由于此规则位于第一条规则之后,因此只有 66% 的时间内会执行它。因此,此规则将仅应用于 (50%*66%=33%) 的请求。

由于只有 33% 的流量到达最后一条规则,因此必须始终应用该规则。

MASQUERADE 不需要知道转换到哪个源IP 因为源IP可能是随机的 比如动态公网IP

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

附录

参考文章

金枪鱼之夜:坏人的 iptables 小讲堂

IP 报文格式

iptables与netfilter

将 IPTables 转变为 TCP 负载均衡器,既有趣又有利可图

版权信息

本文原载于 not only security,复制请保留原文出处。

comments powered by Disqus