参考链接
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)等。
配置防火墙的主要工作就是添加修改和删除这些规则。
链的概念
当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了“链”,所以,我们把每一个“关卡”想象成如下图中的模样
这样来说,把他们称为“链”更为合适,每个经过这个“关卡”的报文,都要跟这条”链”上的规则进行匹配,如果有符合条件的规则,则执行规则对应的动作。
防火墙要达到防火的目的,需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的都被阻拦。
在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
表的概念
如果对每个“链”上都放置了一串规则,但是这些规则有些很相似,比如,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
表与链的关系
由于每条链所处位置不同,需要发挥的功能不同,包含的规则也不同。因此某些链并不会包含某些规则。
| prerouting | input | forword | output | postrouting | |
|---|---|---|---|---|---|
| raw | Y | Y | |||
| mangle | Y | Y | Y | Y | Y |
| filter | Y | Y | Y | ||
| nat | Y | Y | Y | Y |
数据包经过一条链时,会将当前链的所有规则都匹配一遍,匹配的时候会根据匹配规则依次执行。
iptables定义的4张表执行的优先级为:raw > mangle > nat > filter
其实表只是一种组织方式,真正起作用的还是根据五条链来看
规则
根据指定的匹配条件来匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。
防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下从前到后进行过滤的。
防火墙如果根据设置的规则匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
如果数据包在所有规则中没有匹配到明确的规则是阻止还是通过,从而会向下进行匹配直到匹配默认规则后,得到明确的默认规则,从而得出确认是阻止还是通过。
防火墙的默认规则是对应链里的所有规则执行完以后才会执行的(最后执行的规则)。
匹配条件
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