Loading

iptables的原理以及CentOS7下的使用

​ 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链转发出去的。如图:

img

iptables结构

​ 实际上,iptables的结构为iptables => Tables => Chains => Rules.简单来讲,iptables由不同的表组成,而表Tables由不同的链Chains组成,链Chinas由规则Rules组成。

img

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(dst\destination) 目的地址(可用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
posted @ 2020-06-15 16:00  Ellisonzhang  阅读(534)  评论(0编辑  收藏  举报