Netfilter是什么?
Netfilter是Linux的第三代防火墙,因其比之前的两种防火墙ipfwadm及ipchains出色而被Linux组织作为默认的防火墙。Netfilter是自由软件,但在各方面均不逊于商业版的防火墙。
Netfilter与Linux的关系
Netfilter与Linux是两个相互独立的组织,在Linux 2.4早期的版本,并没有包含Netfilter的功能,到后期的版本,才收录了Netfilter的功能。
Netfilter工作的位置
Netfilter以模块的形式存在于linux中,当网卡有数据包传入传出时,出入的数据包都会经由Netfilter穿过。所以Netfilter作为防火墙,能够起到数据包拦截的作用
Netfilter的命令结构
Netfilter要针对数据包进行过滤,就必须要人为制定一些规则,这些规则指示什么样的数据包可以放行,什么样的数据包是危险的,应该丢弃掉,这些规则越来越多之后,就会对其进行分类存储在内存块中,内存就被分为四个表(Table),分别是filter、nat、mangle及raw表,这也是目前Netfilter机制所提供的四大功能。
表 | 链 | 描述 |
---|---|---|
filter | INPUT FORWARD OUTPUT |
filter是Netfilter中最重要的机制,其任务是执行数据包的过滤操作,也就是起到防火墙的作用 |
nat | PREROUTING POSTROUTING OUTPUT |
nat(Network Address Translation, NAT)也是防火墙上一个不可或缺的重要机制,比较通俗的方式来说,其功能就是IP分享器 |
mangle | PREROUTING INPUT FORWARD POSTROUTING |
通过mangle机制来修改经过防火墙内数据包的内容 |
raw | PREROUTING OUTPUT |
负责加快数据包穿过防火墙机制的速度,由此提高防火墙的性能 |
Netfilter的filter机制
filter对数据包的分类如下:
- INPUT类型:网络上其他主机发送给本机进程的数据包就是INPUT类型的数据包
- OUTPUT类型:本机进程所生成的数据包即为OUTPUT类型数据包
- FORWARD类型:数据包对本机而言只是路过而已,那么这就属于FORWARD类型
filter表结构图如下
filter机制的结构图如下:
规则的匹配方式
每条链上都有N条被制定的规则,这些规则该如何匹配呢?first match即优先匹配采用的方式为从INPUT链中的rule-1逐一向下匹配,如果rule-1指明要丢弃数据包,则数据包马上被丢弃,不再执行后面的规则,相反,如果rule-1指明允许数据包进来,则数据包立即进入到本机程序的位置,当前,不管后面的规则内容是什么也都不再重要,这就是优先匹配
不过万一该数据包的特征从INPUT链的rule-1匹配到rule-6均没有匹配成功,该数据包是丢弃还是放行?这就涉及到默认策略(Default Policy)的问题了,请注意,不管链中有多少条规则,默认策略永远在每个链的最底端,而且每个链的默认策略各自独立。linux的默认策略的默认状态是ACCEPT
Netfilter与iptables的关系
Netfilter所需要的规则是存放在内存中的,但是我们如何对这些规则进行添加、删除、修改及查询等操作呢,这个时候必须要有一个针对规则的编辑工具提供给网络管理人员,这个工具就是iptables
iptables工具使用方法
iptables命令可以划分为两个部分,一个是“iptables命令参数”,另一个则是“规则语法”
iptables命令参数
- iptables的命令结构
iptables -t TABLE -操作方式 规则条件 |
---|
语法 | 说明 |
---|---|
-t TABLE | 内置filter、nat、mangle及raw四个表,即Netfilter的四大功能。-t参数的含义是选择我们要操作的功能,如果没有输入,默认则是filter表 |
-操作方式 | 当我们选择好所要使用的表之后,接下来要决定如何操作这个表,在iptables工具中有很多不同的操作方式,在此仅列出必须了解的操作方式,如下: -L: 将所选择的表内容列出 -A: 在指定的链中添加新规则 -F: 将所选择的表内容清除掉 -P: 设置某个链的默认策略 |
规则条件 | 实例规则: -p tcp -j ACCEPT -p udp -j ACCEPT -p icmp -j ACCEPT |
iptables规则语法
- 接口的匹配参数
- 上层协议(upper layer protocol)的匹配参数
- 匹配来源/目的的IP地址
- 匹配来源/目的的端口:使用此参数时,必须指明传输层协议是tcp还是udp,不能单独使用
- 处理方式
使用iptables机制来构建简单的单机防火墙
本节将以下图为例来构建一个简单的单机防火墙。
我们再192.168.0.1主机上分别启用SSH、TELNET、SMTP、WEB以及POP3五项服务。本实例的需求如下:
- 网络上的任何主机都能正常访问192.168.0.1主机上的SSH及TELNET以外的服务。
- 网络上只有192.168.0.200这台主机可正常访问192.168.0.1主机上的所有服务
有了需求后,我们将这些需求转换成iptables看得懂的语法,而在转换成iptables语法时,务必谨记防火墙的原则:先拒绝所有连接,再逐一开放对外提供的服务
单机版防火墙的规则列表:
No. | Commands | Notes |
---|---|---|
1 | iptables -P INPUT DROP | 拒绝所有连接。默认策略最后执行 |
2 | iptables -A INPUT -p tcp -d 192.168.0.1 --dport 25 -j ACCEPT | 放开任何主机对SMTP服务的访问 |
3 | iptables -A INPUT -p tcp -d 192.168.0.1 --dport 80 -j ACCEPT | 放开任何主机对WEB服务的访问 |
4 | iptables -A INPUT -p tcp -d 192.168.0.1 --dport 110 -j ACCEPT | 放开任何主机对POP3服务的访问 |
5 | iptables -A INPUT -p tcp -s 192.168.0.200 -d 192.168.0.1 --dport 22 -j ACCEPT | 只允许192.168.0.200访问SSH |
6 | iptables -A INPUT -p tcp -s 192.168.0.200 -d 192.168.0.1 --dport 23 -j ACCEPT | 只允许192.168.0.200访问TELNET |
Netfilter/iptables的连接跟踪
根据上面的单机防火墙规则,我们让外部所有的主机均能够成功访问SMTP/WEB/POP3服务,只允许192.168.0.200主机访问SSH/TELNET服务。看起来比较完美,但是当单机防火墙作为SSH客户端时,去访问外部主机时可能会失败。因为单机防火墙虽然没有在OUTPUT上设置限制规则,可以让端口号为12345的SSH客户端程序发出连接请求,但当SSH服务器回复数据报时,会因为INPUT链的规则限制(不允许其他主机访问SSH/TELNET)而遭遇拦截。
Netfilter/iptables的连接跟踪功能就可以解决此问题。这个功能有内核xt_state.ko模块所提供。
这个模块在iptables的使用叫做state,称为state模块。state模块定义了数据包的连接状态。分别为ESTABLISHED、NEW、RELATED、INVALID
-
ESTABLISHED: 只要数据包能够成功穿过防火墙,那么之后的所有数据包(包括反向的所有数据包),其状态都会是ESTABLISHED.
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 语法