本片包含以下内容:
Iptables
Netfilter/Iptables 框架
Netfilter 是 Linux 2.4.x 引入的一个子系统,它作为一个通用的、抽象的框架,为每种网络协议都提供一整套的 hook 函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。Netfilter 的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理。
Netfilter 采用的关键技术:
- 连线跟踪(Connection Tracking):是包过滤、地址转换的基础,它作为一个独立的模块运行。在协议栈低层截取数据包,将当前数据包及其状态信息与历史数据包及其状态信息进行比较,从而得到当前数据包的控制信息,根据这些信息决定对网络数据包的操作,达到保护网络的目的。
- 包过滤(Packet Filtering):检查通过的每个数据包的头部,然后根据规则处理
- 地址转换(NAT):网络地址转换分为源 NAT(SNAT)、目的 NAT(DNAT)和端口转换(PNAT)。SNAT 修改数据包的源 IP,DNAT 修改数据包的目的 IP。SNAT 在数据包送出之前的最后一刻做好转换工作,DNAT 在数据包进入后立刻完成转换。
- 包处理(Packet Mangling):可以设置或改变数据包的服务类型(TOS),改变包的生存期(TTL),在包中设置标志值,利用该标志值可以进行带宽限制和分类查询。
资料摘自百度百科-netfilter
Netfilter 为 IPv4 定义了 5 个 hook 函数,这些 hook 函数会在数据报流过协议栈的 5 个关键点被调用。
NF_IP_PRE_ROUTING
:刚刚进入网络层的数据包通过此点(已完成版本号,校验和等检测), 目的地址转换在此点进行NF_IP_LOCAL_IN
:经路由查找后,送往本机的数据包通过此检查点,INPUT 包过滤在此点进行NF_IP_FORWARD
:要转发的包通过此检测点,FORWARD 包过滤在此点进行NF_IP_POST_ROUTING
:所有马上要通过网络设备出去的包通过此检测点,内置的源地址转换 SNAT 功能(包括地址伪装)在此点进行NF_IP_LOCAL_OUT
:本机进程发出的包通过此检测点,OUTPUT 包过滤在此点进行
Netfilter 所有的过滤规则都以模块存放在/usr/lib/modules/$(uname -r)/kernel/net/netfilter/
目录中。在 Linux 内核版本 2.6 前,netfilter 分为IPv4
版和IPv6
版,分别存放在/usr/lib/modules/$(uname -r)/kernel/net/ipv4
和/usr/lib/modules/$(uname -r)/kernel/net/ipv6
中,Linux2.6 后进行了整合,使得 Netfilter 更加简单高效。
iptables 规则
iptables 是一个工具,位于用户空间,用于插入,修改,删除数据包过滤表的规则。
iptables 分为三部分:
表:分为四张表
raw 表:是否对该数据包进行状态跟踪
mangle 表:为数据包设置标记,修改数据包(TOS,TTL,MARK)
nat 表:修改数据包中源、目的 IP 地址或端口
filter 表:过滤数据包(对数据包)
顺序:raw -> mangle -> nat -> filter
链:分为五条链
在路由选择前处理数据包(PREROUTING)
处理流入的数据包(这条规则起到保证内网不被侵犯的关键作用)(INPUT)
处理流出的数据包(OUTPUT)
处理转发的数据包(FORWARD)
在路由选择后处理数据包(POSTROUTING)
链顺序:
- 入站:prerouting -> input
- 出站:output -> postrouting
- 转发:prerouting -> forward -> postrouting
规则:规则被分组在链中,规则被添加到相应的链中,链被添加在表中。规则表默认是允许,则规则链就是被禁止的规则。若规则表是禁止的,则规则链就是被允许的规则
完整包过滤流程:
- 包到达网络接口
- 进入 raw 表的 prerouting 链(在连接跟踪前处理数据包)
- 连接跟踪(若要做)
- 进入 mangle 表的 prerouting 链,修改数据包
- 进入 nat 表的 prerouting 链,做 DNAT(目标地址转换,改变数据包目的地址使包能到达内网某服务器),但不做过滤
- 路由判断
- 若是要转发:进入mangle 表 forward 链,然后进入filter 表的 forward 链过滤,进入mangle 表的 postrouting 链,进入nat 表的 postrouting 链,做SNAT,但不过滤,然后数据包离开本机。
- 若是发给本地的:进入mangle 表的 input 链,进入filter 表的 input 链,对数据包过滤,然后交给本地程序,处理完后先判断路由,进入raw 表的 output 链,连接跟踪对包的处理,进入mangle 表的 output 链,可修改数据包但不过滤,进入nat 表的 output 链,做 NAT,然后路由,进入filter 表的 output 链,可过滤包,进入mangle 表的 postrouiting 链,进入nat 表的 postrouting 链,做SNAT 但不过滤,包离开本机。
iptables 应用
iptables 有八种匹配后的触发动作:
- ACCEPT:允许通过
- DROP:丢弃
- REJECT:拒绝
- LOG:记录日志(syslog)
- DNAT:目的地址转换
- SNAT:源地址转换
- MASQUERADE:地址欺骗
- REDIRECT:重定向
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型(上面八种)] |
Selinux
firewalld
RHEL7 中 firewalld 取代了 iptables。firewalld 将所有网络流量都分类汇集到 zones,然后通过 zones 管理防火墙规则。
firewalld 匹配规则:
- 数据包进入系统,首先检查源 IP 地址和网卡接口,若与某个 zone 匹配,则按照该 zone 的规则过滤。每个 zone 都有开启或关闭的服务和端口列表,数据包根据列表决定是否放行。如果数据包不与任何定义的 zone 匹配,则进入默认 zone,默认 zone 的名称为
public
。firewalld 提供以下默认 zone:home/drop/work/internal/block/public/trusted/dmz/external
,在 fedora 中,还会默认提供FedoraWorkstation
和FedoraServer
两个 zone。
firewall 命令:
firewall-cmd |