简介
Linux 系统在内核中提供了对报文数据包过滤和修改的官方项目名为 Netfilter,它指的是 Linux 内核中的一个框架,它可以用于在不同阶段将某些钩子函数(hook)作用域网络协议栈。Netfilter 本身并不对数据包进行过滤,它只是允许可以过滤数据包或修改数据包的函数挂接到内核网络协议栈中的适当位置。这些函数是可以自定义的。
iptables 是用户层的工具,它提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。Linux 系统中并不止有 iptables 能够生成防火墙规则,其他的工具如 firewalld 等也能实现类似的功能。
iptables 策略是由一组有序的规则建立的,它告诉内核应该如何处理某些类别的数据包。每一个 iptables 规则应用于一个表中的一个链。一个 iptables 链就是一个规则集,这些规则按序与包含某种特征的数据包进行比较匹配。
table 和 chain
iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
chain(从图里面看出chain作用域)
- INPUT(路由表后目的地为本机)、OUTPUT (由本机产生,向外转发)主要针对经过local的包
- PREROUTING (数据包进入路由表之前),POSTROUTING(发送到网卡接口之前) 针对外来路由包)PREROUTING只能改dst,POSTROUTING只能改src
- FORWARDING(通过路由表后,目的地不为本机)
表的处理优先级:raw>mangle>nat>filter。
iptables 默认有 4 个表
- filter 默认表 包含内置chain
- INPUT (针对发往local socket的包)
- FORWARD (for packets being routed through the box)
- OUTPUT (针对本地产生的包)
- nat 表(包是从新连接进来的时候会被查询,地址映射,端口映射)
- PREROUTING (进来的时候改包)
- INPUT
- OUTPUT
- POSTROUTING (出去的时候改包)
-
mangle (用于特定包修改) kernel 2.4.17 之前只有PREROUTING 和 OUTPUT 到 kernel 2.4.18 INPUT FORWARD POSTROUTING
-
raw 有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
一个数据包到达时,是怎么依次穿过各个链和表的
规则
每个 iptables 规则都包含一组匹配和一个目标动作,后者定义了复合规则的数据包应该采取什么处理行为。iptables 匹配指定是数据包必须匹配的条件,只有当数据包满足所有的匹配条件时,iptables 才能根据规则的目标所指定的动作来处理该数据包。
规则管理
参数 | 作用 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
规则约束
参数 | 作用 |
---|---|
-s, –source address/[mask][,… | 匹配来源地址 IP/MASK,加叹号 “!” 表示除这个 IP 外 |
-d | 匹配目标地址 |
-i 网卡名称 | 匹配从这块网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如 TCP、UDP、ICMP |
–dport num | 匹配目标端口号 |
–sport port[:port] | 匹配来源端口号 100:200 表示端口范围 |
sports port[,port:port,port…] | 匹配多个源端口[范围] |
规则动作 -j 参数
操作名 | 功能 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给任何回应信息 |
QUEUE | 将数据包移交到用户空间 |
RETURN | 停止执行当前链中的后续规则,并返回到调用链(The Calling Chain)中 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应的信息 |
DNAT | 进行目标地址转换 |
SNAT | 源地址转换,解决内网用户用同一个公网地址上网的问题 |
MASQUERADE | 是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上 |
REDIRECT | 在本机做端口映射 |
LOG | 记录日志信息,除记录外不对数据包做任何其他操作,仍然匹配下一条规则 |
常用命令
debug 是否命中规则
1 |
|
开启路由转发
1 |
|
规则保存恢复
1 |
|
例子
121 通过165 访问243
端口转发
121访问165转发到243
10.81.24.121 | 10.81.24.165 | 10.81.24.243 |
---|---|---|
iptables -t nat -I PREROUTING -p tcp –dport 10000 -j DNAT –to-destination 10.81.24.243:22 | ||
iptables -t nat -I POSTROUTING -p tcp -d 10.81.24.243 –dport 22 -j SNAT –to-source 10.81.24.165 | ||
- 把发到165:10000的包dst改成243:22,再把改好的包的src改成165的
IP双向路由转发
121直接访问243,感知不到165的转发
10.81.24.121 fa:16:3e:66:96:63 | 10.81.24.165 fa:16:3e:7e:f0:bf | 10.81.24.243 fa:16:3e:f1:b5:da |
---|---|---|
iptables -t nat -I OUTPUT -d 10.81.24.243 -j DNAT –to-destination 10.81.24.165 | iptables -t nat -I PREROUTING -s 10.81.24.121 -j DNAT –to-destination 10.81.24.243 | |
iptables -t nat -I POSTROUTING -s 10.81.24.121 -j SNAT –to-source 10.81.24.165 | ||
iptables -t nat -I PREROUTING -s 10.81.24.243 -j DNAT –to-destination 10.81.24.121 | iptables -t nat -I OUTPUT -d 10.81.24.121 -j DNAT –to-destination 10.81.24.165 | |
iptables -t nat -I POSTROUTING -s 10.81.24.243 -j SNAT –to-source 10.81.24.165 |
121ping243的过程
更多列子
1 |
|
防火墙(firewall)
1 |
|
firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。
firewalld跟iptables比起来至少有两大好处:
-
firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
-
firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。