iptables-netfilter机制

114 阅读10分钟

参考链接

http://kuring.me/post/iptables/

https://morris131.blog.csdn.net/article/details/134303456

iptables概述

通过iptables,可以对本机提供的网络服务 (FTP、WEB、EMAIL、DB...) 进行保护,通过规则进行过滤。

iptables并不是真正的防火墙,可以理解为一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个框架的名字叫netfilter

netfilter位于内核空间,而iptables其实是一个命令行工具,位于用户空间。

netfilter子系统的作用就是linux内核里挡在网卡用户进程之间的一道防火墙

netfilter/iptables组成Linux平台下的包过滤防火墙。可以完成封包过滤、封包重定向和网络地址转换 (NAT) 等防火墙功能。

其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables目录下。

iptables基础

iptables是按照规则来办事的,规则 (rules)其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”规则存储在内核空间的信息包过滤表中。

这些规则分别指定了源地址、目的地址、传输协议 (如TCP、UDPICMP)和服务类型(如HTTP、FTP和SMTP)等。

当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行 (accept) 、拒绝 (reject)和丢弃(drop)等。

配置防火墙的主要工作就是添加修改和删除这些规则。

链的概念

当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了“链”,所以,我们把每一个“关卡”想象成如下图中的模样

image-20231213184312185.png

这样来说,把他们称为“链”更为合适,每个经过这个“关卡”的报文,都要跟这条”链”上的规则进行匹配,如果有符合条件的规则,则执行规则对应的动作。

防火墙要达到防火的目的,需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的都被阻拦。

在iptables中,这些关卡称为链。之所以称为链,是因为防火墙的作用在于对经过每一个关卡的报文匹配规则,然后执行动作,而这个关卡上可能不止一条规则,当我们把多条规则串在一个链条上时,就形成了链。

五条规则链:

  • PREROUTING(路由前)
  • INPUT(数据包流入口)
  • FORWARD(转发管卡)
  • OUTPUT(数据包出口)
  • POSTROUTING(路由后)

当一个网络包进入一台机器的时候,首先拿下 MAC 头看看,是不是我的。如果是,则拿下 IP 头来。得到目标 IP 之后呢,就开始进行路由判断。在路由判断之前,这个节点我们称为 PREROUTING。如果发现 IP 是我的,包就应该是我的,就发给上面的传输层,这个节点叫作 INPUT。如果发现 IP 不是我的,就需要转发出去,这个节点称为 FORWARD。如果是我的,上层处理完毕完毕后,一般会返回一个处理结果,这个处理结果会发出去,这个节点称为 OUTPUT,无论是 FORWARD 还是 OUTPUT,都是路由判断之后发生的,最后一个节点是 POSTROUTING。

到本机某进程的报文:PREROUTING->INPUT

由本机转发的报文:PREROUTING-> FORWARD -> POSTROUTING

由本机的某进程发出报文 (通常为响应报文):OUTPUT-> POSTROUTING

image-20240119101730197.png

表的概念

如果对每个“链”上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,能把实现相同功能的规则放在一起

把具有相同功能的规则的集合叫做“表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围

  • filter表:负责过滤功能,防火墙,对应的内核模块为iptables_filter,无法对数据包进行修改
  • nat表:networkaddress translation,网络地址转换功能,对应的内核模块为iptable_nat
  • mangle表:主要用于对指定数据包进行更改,拆解报文,做出修改,并重新封装的功能,对应的内核模块为iptable_mangle
  • raw表:确定是否对该数据包进行状态跟踪,对应的内核模块为iptable_raw

filter表

aha@ubuntu20:~$ sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain DOCKER (1 references)
target     prot opt source               destination 
​
...

nat表

aha@ubuntu20:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
​
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere            !localhost/8          ADDRTYPE match dst-type LOCAL
​
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        anywhere            
​
Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere  

mangle表

aha@ubuntu20:~$ sudo iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
​
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

raw表

aha@ubuntu20:~$ sudo iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

表与链的关系

由于每条链所处位置不同,需要发挥的功能不同,包含的规则也不同。因此某些链并不会包含某些规则。

preroutinginputforwordoutputpostrouting
rawYY
mangleYYYYY
filterYYY
natYYYY

数据包经过一条链时,会将当前链的所有规则都匹配一遍,匹配的时候会根据匹配规则依次执行。

iptables定义的4张表执行的优先级为:raw > mangle > nat > filter

其实表只是一种组织方式,真正起作用的还是根据五条链来看

image-20231213192235941.png

规则

根据指定的匹配条件来匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。

防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下从前到后进行过滤的。

防火墙如果根据设置的规则匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。

如果数据包在所有规则中没有匹配到明确的规则是阻止还是通过,从而会向下进行匹配直到匹配默认规则后,得到明确的默认规则,从而得出确认是阻止还是通过。

防火墙的默认规则是对应链里的所有规则执行完以后才会执行的(最后执行的规则)。

匹配条件

iptables可以根据不同的匹配条件来过滤网络数据包。iptables的匹配条件可以分为通用匹配条件扩展匹配条件两种。

  • 通用匹配条件

    • -p:指定协议类型,如TCP、UDP、ICMP等。
    • -s:指定源IP地址或地址段。
    • -d:指定目标IP地址或地址段。
    • –sport:指定源端口号。
    • –dport:指定目标端口号。
    • -i:指定数据包进入的网络接口。
    • -o:指定数据包输出的网络接口。
  • 扩展匹配条件:除了通用匹配条件其余可用于匹配的条件称为扩展配条件,这些扩展匹配条件在netfilter中以模块的形式存在,如果想使用这些条件,则需要依赖对应的拓展模块。

    • –mac-source:指定源MAC地址。
    • –mac-destination:指定目标MAC地址。
    • –state:指定连接状态,如NEW、ESTABLISHED、RELATED等。
    • –tcp-flags:指定TCP标志位。
    • –icmp-type:指定ICMP类型。
    • –limit:限制匹配规则的匹配次数。
    • –comment:为匹配规则添加注释。

处理动作

iptables规则的处理动作是指对匹配到的数据包所采取的操作。

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息。。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
  • DNAT:目标地址转换
  • REDIRECT:在本机做端口映射。
  • LOG:在/var/log/mesages文件中记录日志信息,然后将数据包传递给下一条规则。即除了记录外不对数据包做任何其他操作,仍然让下一条规则进行匹配

iptable常用操作

iptables安装

sudo apt-get update
sudo apt-get install iptables
iptables --version

查询

iptables 查询默认的表为filter,默认会列出表中所有链的规则

  • -t 用于指定要操作的表,支持raw mangle filter nat,省略-t选项,默认使用filter表
  • -L 列出rule
  • -v 可查看更详细的信息
  • -n 规则中以ip地址的形式进行显示
  • –line-number 显示规则的编号
  • -x 包的计数以精确数字显示

iptables -t filter -L:从表的角度查询规则,用于查看filter表中的所有规则

iptables -L INPUT: 从链的角度查询规则,用于查看INPUT链中的所有规则

iptables -vL INPUT: 从链的角度查询规则,用于查看INPUT链中的所有规则,可查看更详细信息,包含了规则的匹配信息

iptables -nvL:以精确数字显示

修改

  • -F: 清空规则
  • -I: 表示插入规则
  • -A: 表示以追加的方式插入规则
  • --dport: 目的端口
  • --sport: 源端口
  • -s: 源ip
  • -d: 目的ip
  • --match-set:匹配ipset

iptables -F INPUT:清空filter表中的INPUT链中的所有规则。

删除

  • -D: 删除规则,iptables -D 链名 规则编号,其中规则编号可以通过--line-number查看到。
  • -F: 清空规则,iptables -F 链名 -t 表名
  • -X: 删除链 iptables -X 链名 -t 表名

trace

需要先开启trace功能

modporbe nf_log_ipv4
sysctl net.netfilter.nf_log.2

sysctl 是一个用于在 Linux 和 Unix 系统上查看、设置内核参数的命令。它通过 /proc/sys/ 目录下的文件来进行参数的读取和修改。

要开启icmp协议的追踪,执行如下的命令

iptables -t raw -A OUTPUT -p icmp -m comment --comment "TRACE" -j TRACE
iptables -t raw -A PREROUTING -p icmp -m comment --comment "TRACE" -j TRACE

可以通过如下的命令看到插入的iptabels规则

iptables -t raw -nvL --line-number

追踪日志最终会在/var/log/message或者/var/log/kern下看到,示例

Feb  6 11:22:04 c43k09006.cloud.k09.am17 kernel: TRACE: raw:PREROUTING:policy:3 IN=docker0 OUT= PHYSIN=bond0.9 MAC=02:42:30:fb:43:94:5c:c9:99:de:c4:8b:08:00 SRC=10.45.8.10 DST=10.45.4.99 LEN=84 TOS=0x00 PREC=0x00 TTL=62 ID=25550 DF PROTO=ICMP TYPE=0 CODE=0 ID=24191 SEQ=2

含义:“TRACE: tablename:chainname:type:rulenum “ where type can be “rule” for plain rule, “return” for implicit rule at the end of a user defined chain and “policy” for the policy of the built in chains.

环境清理,删除刚刚创建的规则即可,其中1为规则的编号

# 可以通过此来查询之前创建的规则编号
iptables -t raw -nvL --line-number
# 删除规则
iptables -t raw -D PREROUTING 1
iptables -t raw -D OUTPUT 1