iptables用于创建过滤以及设置NAT规则,使用方便且功能强大,同时iptables适用性非常高,所有的Linux发行版本都可以使用,如果是第一次接触到iptables,会觉得很复杂。
iptables原理
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中被称为"链"。
但客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他"关卡",也就是其他"链",他们就是 "路由前"、"转发"、"路由后",他们的英文名是PREROUTING、FORWARD、POSTROUTING
也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。如图:
iptables结构
实际上,iptables的结构为iptables => Tables => Chains => Rules.简单来讲,iptables由不同的表组成,而表Tables由不同的链Chains组成,链Chinas由规则Rules组成。
iptables中有四个内建表,分别为Filter、NAT、Mangle、Raw:
- Filter表:负责过滤功能、防火墙
- NAT表:即network address translation 网络地址转换
- Mangle表:拆解报文、作出修改并重新封装
- Raw表:关闭NAT表上启用的链接追踪机制
iptables中有五个内建链,分别为PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,根据我的个人理解,在iptables中,表和链不是单纯的包含与被包含的关系,而应该是一种组合的关系,根据不同的链Chains和表Tables的组合,将产生不同的功能,换句话说,同一个类型的链Chains在不同的Tables中所能产生的功能是不同的。且不能随意的将链和表进行组合,每个表下只能使用规定好的几种链。
Filter表:
Filter表为iptables的默认表,存在三种内建链:
- INPUT链,处理来自外部的数据
- OUTPUT链,处理向外发送的数据
- FORWARD链,将数据转发到本机的其他网卡设备上
NAT表:
NAT表有三种内建链:
- PREROUTING链,处理达到本机且在路由转发之前的数据包,它会转换数据包中的目标IP地址,通常用于DNAT
- POSTROUTING链,处理即将离开本机的数据包,它会转换数据包的源IP地址,通常用于SNAT
- OUTPUT链,处理本机产生的数据包
Mangle表:
Mangle表主要功能为根据规则修改数据包的一些标志位,便于其他规则或程序利用这种标志对数据包进行过滤或策略路由。Mangle表具有五种内建链:
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
Raw表:
Raw表用于处理异常,存在两个内建链:
- PREROUTING
- OUTPUT
在平时的使用过程中,一般使用较多的都是NAT链
iptables语法
如果之前没有了解过iptables相关内容,第一次直接看到iptables的追加等规则会觉得语法非常复杂,但是如果理解iptables的一些规则参数之后会发现还是挺好用的。
查看表:
# iptables -t nat --list
-t nat:指定表为nat表,-t为指定表,可以省略,如果省略则默认为fliter表
--list:查看表种的规则
清空表:
# iptables -F
或
# iptables --flush
但在部分Liunx上,如果不使用 -t 指定表,默认清空fliter表种的规则。
保存表:
# service iptables save
或
# iptables-save
通过追加等方式新增的iptables规则在系统重启之后将会失效,需要使用保存命令才能将规则永久保存。
基本参数:
参数 | 描述 | 备注 |
---|---|---|
-p(protocol) | 协议类型,如tcp、udp、icmp等 | 默认为all,所有协议 |
-s(source) | 数据包源地址(可用ip、网络、主机名) | 默认所有地址 |
-d(dstdestination) | 目的地址(可用ip、网络、主机名) | |
-j | 执行目标,即当与规则匹配时,如何处理数据包 | |
-i(in-interface) | 输入接口、指定要处理来自哪个接口的数据包,如-i eth0指定了处理经由eth0网卡进入的数据包,! -i eth0 为eth0之外的接口,-i eth+ 为所有eth开口的接口进入的数据包 | 默认所有接口 |
-o(out-interface) | 输出接口,语法与-i相同 | 默认所有接口 |
扩展参数:
参数 | 描述 | 备注 |
---|---|---|
--sport | 源端口,针对-p tcp或-p udp,可以指定端口号或端口名称,如-sport 22和-sport ssh,建议使用端口号,也可以范围匹配如-sport 22:100 | 默认所有端口 |
--dport | 目的端口,针对-p tcp或-p udp,参数与-sport相同 | 默认所有端口 |
-–tcp-flags | TCP标志 针对-p tcp | |
-–icmp-type | ICMP类型 针对-p icmp |
实例展示:
例如:
该规则指定将经过5000端口的tcp协议请求转发到9000端口
# iptables -t nat -A PREROUTING -p tcp --dport 5000 -j REDIRECT --to-ports 9000
-t nat:指定表为nat表,如果不指定默认为fliter表
-A PREROUTING:指定要追加的链为PREROUTING链
-p tcp:指定监听的协议为tcp协议,如果不指定默认为all,即所有协议,但不建议使用all
--dport 5000:描述规则的扩展参数,表示目的地址为5000
-j REDIRECT:指的是执行目标为转发到9000端口
CentOS7使用iptables注意事项
CentOS7中以firewall代替了iptables作为防火墙来使用,所以默认的CentOS中没有iptables组件,可以先查看iptables的状态来确定是否存在iptables服务:
注意,不能根据追加链不报错来判断已经存在iptables,也不能通过查看iptables表不报错来判断iptables服务已存在
# service iptables status
如果存在将会显示iptables的状态,若不存在,则提示:
Unit iptables.service could not be found.
请先安装iptables组件:
# yum install iptables-services