Iptables 认识笔记

54 阅读4分钟

linux iptables是由两个组件组成:Netfilter和Iptables组成:

Netfilter

Netfilter称为内核空间,是linux内核的一部分,用于拦截和操作数据的一套框架。框架内容包括三部分:

  1. 为网路协议(ipv4/ipv6)定义几个hook函数
  2. 内核模块都可以注册hook函数。注册且到了该网络协议节点时,系统会调用注册的hook函数
  3. 处理时,数据包会传入用户空间去进行处理(这里不会来回切换用户/内核态嘛?)

共有五个节点

  • NF_IP_PRE_ROUTING,在报文作路由以前执行;
  • NF_IP_FORWARD,在报文转向另一个NIC以前执行;(转发处理前)
  • NF_IP_POST_ROUTING,在报文流出以前执行;(转发处理后)
  • NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;(流入本地后)
  • NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。(本地要发送的数据流出前)

流程图: image.png

Iptables用户空间工具

iptable是一种工具,也称用户空间。它使得插入/修改/删除表中规则变得容易。

Table 表

filter表

该表的作用主要用于包过滤。它在LOCAL_IN,FORWARD,LOCAL_OUT三处HOOK函数进行了注册。

Nat表

该表的作用主要用于地址转换。它在PRE_ROUTING,POST_ROUTING两处HOOK函数进行了注册。k8s中的kube-proxy就是基于此表做的k8s的基础原理

Mangle表

该表的作用是进行数据包内容的修改。它在Netfilter的所有5个HOOK函数进行了注册。

Chain 链

Chain链是实现hook函数调用的实现方式,

tablechain
FilterINPUT
FilterFORWARD
FilterOUTPUT
NatPREROUTING
NatOUTPUT
NatPOSTOUTING
ManglePREROUTING
MangleINPUT
MangleOUTPUT
MangleFORWARD
ManglePOSTOUTING

 链INPUT=HOOK函数 LOCALIN

 链OUTPUT=HOOK函数 LOCALOUT

 链PREROUTING=HOOK函数 PREROUTING

 链POSTROUTING=HOOK函数 POSTROUTING

 链 FORWARD=HOOK函数 FORWARD

Target 目标

链的每个规则都会有一个目标,目标决定了该规则对数据包如何处理。

常用目标:

ACCEPT:允许

DROP:拒绝

REJECT:同DROP一样,不过它会向发送方返回个错误信息

iptables命令

常用命令

  • iptables -P INPUT DROP :设置 INPUT 链默认策略为 DORP 其他链

  • ~:显示详细信息

  • iptables -A INPUT -p tcp -d 192.168.175.7 --dport 22 -j ACCEPT 放行目标 ip 为 192.168.175.7 协议为 tcp 22 端口的入站流量

  • iptables -A INPUT -d 192.168.175.7 -p icmp -j ACCEPT 放行目标 ip 为 192.168.175.7 的 icmp 协议流量

  • iptables -t filter -A OUTPUT -p tcp -s 192.168.175.7 -j ACCEPT 放行源 ip 为 192.168.175.7 的出站流量

  • iptables -A INPUT -p icmp -d 192.168.175.7 --icmp-type 0 -j ACCEPT 放行 icmp 的 echo reply 入站流量

  • iptables -L -n --line-num :查看链上的规则不反解并显示规则编号

  • iptables -D INPUT 1:删除 INPUT 链上的第一条规则

  • iptables -R INPUT 2 -d 192.168.175.7 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT

  • iptables -R INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

  • iptables -A INPUT –p icmp -m limit –limit 10/second -j ACCEPT

  • -t table:

    filter,nat,mangle,raw(省略时为 filter)

  • 链管理

    -F:flush,清空规则链,省略链表示清空指定表上的所有的链(不指定链则默认为 filter)

    -N:new,创建自定义规则链

    -X:drop,删除用户自定义的空的规则链

    -Z:zero,置零规则计数器

    -P:policy,为指定链设置默认策略,对 filter 表中的链而言,默认策略通常有 ACCEPT,DROP,REJECT;

    -E:rename,重命名自定义链,引用计数不为 0 的自定义链无法改名,也无法删除

    • L:显示规则
  • 规则管理:

    -A:append,将新规则追加于指定链的尾部

    -I:insert,将新规则插入指定链的指定位置

    -D:delete,删除指定链上的指定规则,有两种指定方式(1)指定匹配条件(2)指定规则的编号

    -R:replace,替换指定链上的指定规则

  • 查看

    -L:list,列出指定链上所有规则

    ​ -n:numberic,以数字格式显示地址和端口号,不反解

    ​ -v:verbose,显示详细信息

    ​ --line-numbers:显示规则编号

    ​ -x:exactly:显示计数器计数结果的精确值

  • 目标

    -j TARGET:jump 至指定的 TARGET

    ​ ACCEPT:接受

    ​ REJECT:拒绝

    ​ DROP:丢弃

    ​ RETURN:返回调用链

    ​ REDIRECT:端口重定向

    ​ LOG:记录日志

    ​ MARK:做防火墙标记

    ​ SNAT: 源地址转化

    ​ DNAT:目标地址转换

    ​ MASQUERADE:地址伪装

    ​ ….

    ​ 自定义链:由自定义链上的规则进行匹配检查

  • 基本匹配:

    1. [!] -s,--src,--source IP | Netaddr :检查报文中的源 IP 地址是否符合此处指明的地址范围
    2. [!] -d,--dst,--destination IP | Netaddr: 检查报文中源 IP 地址是否符合此处指定的地址范围
    3. [!] -p,--protocol {tcp|udp|icmp} : 检查报文中的协议,即 IP 首部中的 protocols 所标识的协议
    4. [!] -i,--in-interface INTERFACE:数据报文的流入接口,仅能用于 PREROUTING,INPUT 及 FORWARD 链上
    5. [!] -o,--out-interface INTERFACE:数据报文的流出接口,仅能用于 FORWARD,OUTPUT 及 POSTROUTING 上

参考和引用