一:Netfilter

Netfilter是是集成到Linux内核协议栈中的一套防火墙系统。它有4种类型,包括filter、nat、mangle、raw,具体是哪一种表,取决于数据包的处理方式。4种类型如下表所示:

表类型

说明

包含的链接

filter

显示所有区域及其配置信息的列表

INPUT、FORWARD、OUTPUT

nat

显示默认区域

PREROTING、OUTPUT、POSTROTING

mangle

将默认区域更改为指定区域

PREROTING、OUTPUT(2.4.18版本之后新增INPUT、FORWARD、POSTROTING)、

raw

执行命令指定区域

PREROUTING、OUTPUT

每个表都有不同类型的链接,称为规则集。链接种类的选择取决于数据包的访问点。链接类型及说明如下表所示。

链接类型

说明

INPUT

应用于传入数据包到本地主机的链接

OUTPUT

应用于从本地主机输出数据包的链接

FORWARD

应用于通过本地主机转发数据包的链接

PREROUTING

在路由决定之前应用的链接

POSTORUTING

在路由决定之后应用的链接

要转发的数据包(FORWARD)数据包,必须将内核参数net.ipv4.ip_forward的值设为1.用户可以为链接指定规则,在规则种也可以使用“指定地址以外的地址”这种“否定”方式。可以为链接种设置的规则指定字段有:协议、源地址、目标地址、源端口、目标端口、TCP标志、接收端口、传输接口和状态。数据包与链接中设置的规则匹配时的处理方法有目标指定,可以指定的目标根据表和链接不同而不同。主要目标如下表所示:

指令和设置值

指令和设定值

指令和设定值

说明

ACCEPT

全部

全部

权限

REJECT

全部

INPUT、OUTPUT、FOEWARD

拒绝,返回ICMP错误信息

DROP

全部

全部

丢弃,不返回ICMP错误信息

DNAT

nat

PREROUTING、OUTPUT

重写目标地址

SNAT

nat

POSTROUTING

重写源地址

MASQUEERADE

nat

POSTROUTING

重写源地址,动态地址设置

LOG

全部

全部

记录日志,继续转到下一条规则而不结束

用户定义链

全部

全部

-

Netfilter可以让用户完全控制防火墙配置和信息包过滤,也就是说我们可以制定自己的规则来满足需求。

二:iptables和Netfilter的关系

iptables是应用层,其实质是一个定义规则的配置工具,而核心的数据包拦截和转发是Netfilter负责的。iptables命令可以指定一个表和一个链接,并且可以在链接中设置一个或多个规则。Netfilter顺序地将链表中设置的多个规则应用于数据包来执行过滤。如果规则匹配,则该规则中设置的目标(ACCEPT、REJECT、DROP等)进行处理,如果规则不匹配,则进行下一个规则,对于不符合任何规则的分组,都适用于链接默认策略(ACCEPT、DROP)。

格式:iptables [-t 表 ]  {子命令}  链接规则 -j 目标

iptables命令的子命令如下表所示。

子命令

说明

-append -A

追加到现有规则的末尾

--insert -I

指定要添加到现有规则开头的规则编号时,将其插入到指定编号处

--list -L

显示规则,如果指定了链接,则显示该链接规则,如果未指定链接,则显示所有链接的规则

--delete -D

删除指定链接的规则

--policy -P

指定链接的默认策略,指定ACCEPT或DROP

规则匹配条件说明如下表所示。

指定项目

指定匹配条件选项

说明

协议

[!]-p 、--protocal协议

指定top、udp、icmp、all

源地址

[!]-s、--source源地址

指定源地址,如果未指定则指定所有地址

目标地址

[!]-d、--destination

指定目标地址。如果未指定则指定所有地址

源端口

[!]--sport 端口号 -m multiport

PREROUTING、OUTPUT

[!]--source-ports、--sports端口

指定源端口,如果未指定则指定所有端口

INPUT、FOTWARD、OUTPUT

目标端口

[!]--dport 端口号 -m mutiport

PREROUTING、OUTPUT、POSTROUTING

[!]destination-ports、--spors端口

指定目标端口或所有端口(如果未指定)

PREROUTING、OUTPUT(2.4.18版本之后,新增INPUT、FORWARD、POSTROUTING)

TCP标志

[!]--tcp-flags 参数1 参数2

PREROUTING、OUTPUT

[!]--syn

--tcp-flags指定参数1评估的标志,以逗号分隔,参数·2设置

PREROUTING、OUTPUT

接收接口

[!]-i、--in-interface网络接口

可以在INPUT、FORWARD、PREROUTING中指定

传输接口

[!]-o、--out-interface网络接口

可以在OUTPUT、FORWARD、POSTROUTING中指定

状态

[!]--state

连接跟踪机制可以确定连接状态

CentOS中单独设置iptables命令的方法如下:

  • 安装iptables.service软件包:yum install iptables.service。
  • 禁用firewalld.service:systemctl disable firewalld.
  • 启用iptables.service:systemctl enable iptables。
  • 重启系统:systemctl reboot。
  • Ubuntu系统单独设置iptables命令的方法如下。
  • 安装iptables.service软件包:apt install iptables-persistent。
  • 禁用ufw: ufw disable。
  • 重启系统:systemctl reboot。

以Ubuntu系统为例,设置iptables规则,如下图所示。指定22端口号表示允许项目的端口22号发送分组;指定80端口表示接收人允许端口的数据包到80号,指定iptables -P INPUT DROP命令将默认策略设置为丢弃,拒绝22和80以外的数据包,使用iptbales -L命令指定-v选项可以显示详细的设置状态。

通过以下的命令,如果可以看到允许接收来自ssh和http的数据包,说明之前设置的iptables规则已成功。

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP 
iptables -L -v

                              Netfilter和iptables的实现机制(Linux)_端口号

在CentOS7以后,系统使用firewalld服务替代了iptables服务,但是依然可以使用iptables来管理内核的Netfilter。其实iptables服务和firewalld服务都是真正的防火墙。,只是用来定义防火墙规则的管理工具,将定义好的规则交由内核中的Netfilter(网络过滤器)来读取,从而实现真正的防火墙功能。