聊聊IPTABLES/NETFILTER

Posted by Mathew on 2016-08-27

Netfilter.org is home to the software of the packet filtering framework inside the Linux 2.4.x and later kernel series. Software commonly associated with netfilter.org is iptables.

Software inside this framework enables packet filtering, network address [and port] translation (NA[P]T) and other packet mangling. It is the re-designed and heavily improved successor of the previous Linux 2.2.x ipchains and Linux 2.0.x ipfwadm systems.

netfilter is a set of hooks inside the Linux kernel that allows kernel modules to register callback functions with the network stack. A registered callback function is then called back for every packet that traverses the respective hook within the network stack.

iptables is a generic table structure for the definition of rulesets. Each rule within an IP table consists of a number of classifiers (iptables matches) and one connected action (iptables target).

If you want more , please click netfilter.org

防火墙的分类

从特点分类防火墙

(1) 软件防火墙:软件防火墙需要运行在特定的计算机上,而且需要计算机的操作系统的支持。

(2) 硬件防火墙:硬件防火墙其实就是一个普通pc机的架构,然后上面跑有专门的操作系统

(3) 芯片级的防火墙,这种防火墙基于专门的硬件平台,没有操作系统,专有的ASIC芯片使它们比其他类的防火墙速度更快,处理能力极强,性能更高,但是价格却及其昂贵。

从技术分类防火墙

(1) 包过滤型防火墙,这类的防火墙主要是工作在网络层,也就是我们所说的 三层防火墙 ,根据事先设定好的规则进行检查,检查结果根据事先设定好的处理机制进行处理。

(2) 应用层防火墙,它是工作在TCP/IP模型中的最高层应用层,也就是我们说的七层防火墙,相比较来说速度要慢一点。

(3) 状态监视器,状态监视作为防火墙其安全性为最佳,但配置比较复杂,且网络速度较慢。

目前市场上比较常见的是3、4层的防火墙,也叫 网络防火墙 ,还有7层的防火墙,其实就是代理层的网关。

对于TCP/IP的七层模型来讲,我们知道的第三层是网络层,三层的防火墙会在这层对 源地址和目标地址进行检测 。但是对于七层的防火墙,不关你是源端口还是目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。 所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市场上通常的防火墙方案,都是两者结合的。

IPTABLES的历史以及工作原理

IPTABLES历史

iptables的前身叫做 ipfirewall (内核1.x时代),这是一个坐着从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能及其有限(它需要将所有的规则都放进内核当中,这样规则才能运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,共同发挥作用,而现在,它叫做iptables,iptables是一个便于我们写规则的工具,真正起作用的是内核中的Netfilter一个框架。Netfilter内置了5个hook函数,当一个数据包经由此机器时,经过这5个hook函数的其中某个才能进入用户空间,或者转发出去。

IPTABLES工作原理及策略

工作原理

当数据包到达目标主机时,经过PREROUTING链,经路由之后决定是否转发,不转发则进入INPUT链,到达用户空间。进程对外通信时,经由OUTPUT链出去,路由之后到达POSTROUTING链,经网卡出去。当一数据包经过PREROUTING链发现其不是到达本主机,那么数据包经过FORWARD链,到达POSTROUTING链转发出去。本机进程对发送数据时,经由OUTPUT链路由之后进入POSTROUTING链出去。iptables匹配规则时,是自上而下匹配的,匹配到第一条规则时即跳出,否则一直往下匹配,没有则使用默认规则。

五个hook函数分别是PREROUTING,INPUT,OUTPUT,POSTROUTING,FORWARD,我们把这我i个钩子函数称为链,Netfilter实现了几个功能,raw,mangle,nat,filter。我们一般把这几个功能称为表,表之间有优先级关系,从低到高为filter——nat——mangle——raw,表与链之间的对应关系,具体如下表:

TABLE CHAIN
filter INPUT FORWARD OUTPUT
nat PREROUTING(DNAT) POSTROUTING(SNAT) OUTPUT
mangle PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw PREROUTING OUTPUT

iptables规则建立时候,首先要确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件。

策略
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。 所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而赌,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中,定义数据包允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能则是nar选项。为了让这些功能交替工作,我们制定了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。

下面是一些简单的例子

  • 过滤掉经过计算机的垃圾报文和攻击报文
  • 端口转发:外网PC通过端口转发可以访问内网PC
  • 限制特殊站点的访问
  • 限制特定流量的流出

IPTABLES和NETFILTER简介

Linux使用一个信息包过滤系统来实现防火墙的功能,即iptables/netfilter过滤系统。
iptables和netfilter是Linux防火墙过滤系统分别在用户空间和内核空间的表现形式。

iptables:Linux防火墙的“用户态”,用户管理防火墙的命令工具。
netfilter:Linux防火墙的“内核态”,内核中的包过滤防火墙功能体系。

iptables功能强大,可以用于对防火墙规则的增、删、查、改。防火墙规则是以表的形式存储的,而这些表集成在内核中。

IPTABLES的表和链

  1. filter表
    filter表主要是过滤数据包的,IPTABLES几乎所有的数据包过滤都在此表中实现的,filter表也是IPTABLES默认的表,此表中包含三个链如下:
    • INPUT链
      • 过滤所有的目标地址是本机的数据包
    • OUTPUT链
      • 过滤所有从本机出去的数据包
    • FORWARD链
      • 过滤所有从本机路过的数据包
  2. nat表
    nat表主要适用于做网络地址转换的(NAT),在IPTABLES中可以做SNAT(源地址转换),DNAT(目标地址转换).nat表中包含的两个链如下:
    • PREROUTING链
      • 在数据包到达防火墙的时候改变目标地址DNAT应用于此链
    • OUTPUT链
      • 可以改变本地产生的数据包的目标地址
    • POSTROUTING链
      • 子啊数据包离开防火墙的时候改变源地址,SNAT应用于此链
  3. mangle表
    mangle表主要是修改数据包头部信息的,此表中包含以下5条链
    • PREROUTING链
      • 在数据包进入防火墙之后,也称为路由前
    • POSTROUTNG链
      • 在数据包确定目标地址后,也称为路由后
    • OUTPUT链
      • 从本机出去的数据包,路由前
    • INPUT链
      • 数据包进入本季后,路由后
    • FORWARD链
      • 第一次路由判断之后,最后一次路由判断之前改变数据包

报文流向

1
2
3
流入本机:PREROUTING --> INPUT ==> 用户空间进程
流出主机:用户空间进程 ==> OUTPUT --> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING

数据包过滤匹配流程

IPTABLES的几个状态

IPTABLES的状态跟踪连接有4种,分别是 NEW,ESTABLISHED,RELATED,INVAILD,除了从本机出去的数据包有NAT表的OUTPUT链处理外,其他所有的状态跟踪都在NAT表中的PREROUTING链中处理,下面来说4种状态是什么?

  1. NEW状态
    NEW状态的数据包说明这个数据包是收到的第一个数据包
  2. ESTABLISHED状态
    只要发送并接到应答,一个数据包的状态就从NEW状态变为ESTABLISHED状态,而且该状态会急需匹配这个连接后继续数据包。
  3. RELATED状态
    当一个数据包的状态处于ESTABLISHED状态的连接有关系的时候,就会被认为是RELATED,也就是说一个链接想要是RELATED状态,首先要有一个ESTABLISHED的连接。
  4. INVALID状态
    不能被识别属于哪个连接状态或没有任何关系的状态,一本这种数据包要被拒绝的。

IPTABLES的命令及使用

iptables在CentOS或RHEL系统上默认安装的,IPTABLES的命令选项主要分为这么几大类,规则管理,链管理,默认规则管理,查看,匹配规则,处理动作等。

  1. 规则管理
1
2
3
4
iptables -A           添加一条新规则
iptables -I 插入一条新规则 -I 后面加以数字表示插入到哪行
iptables -D 删除一条新规则 -D 后面加一数字表示删除哪行
iptables -R 替换一条新规则 -R 后面加一数字表示替换哪行
  1. 链管理
1
2
3
4
iptables -F		  清空链中的所有规则
iptables -N 新建一个链
iptables -X 删除一个自定义链,删除之前要保证次链是空的,而且没有被引用
iptables -E 重命名链
  1. 默认规则管理
1
iptables -P 		  设置默认规则
  1. 查看
1
2
3
4
5
iptabels -L 	  查看规则 -L 还有几个子选项如下
iptables -L -n 以数字的显示方式显示
iptables -L -v 显示详细信息
iptables -L -x 显示精确信息
iptables -L --line-numbers 显示行号
  1. 条件匹配
    • 基本匹配
      条件匹配也可以使用!取反
1
2
3
4
5
-s           源地址
-d 目标地址
-p 协议{tcp|udp|icmp}
-i 从哪个网络接口进入,比如 -i eth0
-o 从哪个网络接口出去,比如 -o eth0
- 扩展匹配
	- 隐含扩展匹配
1
2
-p {tcp|udp} --sport   指定源端口号
-p {tcp|udp} --dport 指定目标端口号
	- 显示扩展匹配
1
2
3
4
5
-m state        --state            匹配状态的
-m multiport --source-port 端口匹配,指定一组端口
-m limit --limit 3/minute 每三分钟一次
-m string --string --algo bm|kmp --string "xxx" 匹配字符串
-m time --timestart 8:00 --timestop 12:00
  1. 处理动作
1
2
3
4
5
6
7
8
-j  ACCEPT     允许
-j REJECT 拒绝
-j DROP 拒绝并提示信息
-j SNAT 源地址转换
-j DNAT 目标地址转换
-j RERIRECT 重定向
-j MASQUERAED 地址伪装
-j LOG --log-prefix “说明信息,自己随便定义” 记录日志