Linux配置防火墙iptables的相关命令及教程

iptables命令

iptables准确来讲并不是防火墙,真正的防火墙是运行于系统内核中的netfilter,而iptables仅仅是操作netfilter的一个工具,其所负责的主要功能便是与用户交互,获取到用户的要求,并转化成netfilter可以接受的信息。

链的概念

当客户端访问服务器的WEB服务时,客户端是起点,WEB服务所监听的套接字(IP地址和端口)是终点。当WEB服务需要响应客户端请求时,WEB服务所监听的IP与端口变成了起点,客户端变成了终点。

如果想要防火墙能够达到防火的目的,就需要在内核中的netfilter框架里设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是就出现了INPUT关卡和OUTPUT关卡。如果客户端发来的报文访问的目标地址不是本机,而是其他服务器,这个时候就会用到PREROUTING关卡、FORWARD关卡和POSTROUTING关卡。这些关卡在iptables中被称之为链。

简要说明:INPUT链、OUTPUT链主要用在“主机防火墙”中,即主要针对服务器本机惊醒保护的防火墙。FORWARD链、PREROUTING链、POSTROUTING链多用在“网络型防火墙”中,例如使用Linux防火墙作为网关服务器在公司与Inetnet之间进行安全控制。

链的详细说明:

INPUT链表示当收到访问防火墙本机地址的数据包(入站)时应用的规则。
OUTPUT链表示当防火墙本机向外发送数据包(出站)时应用的规则。
FORWARD链表示当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时应用的规则。
PREROUTING链表示在对数据包做路由选择之前应用的规则。
POSTROUTING链表示在对数据包做路由选择之后应用的规则。

表的概念

每个经过这个关卡的报文,都要将这条链上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。但是每个链上的规则可能不止一个,所以把具有相同功能规则的集合叫做表,通过规则表管理规则。

默认的iptables规则表有:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。

规则表应用优先级:seC++urity,raw,mangle,nat,filter。

各条规则的应用顺序:链内部的过滤遵循“匹配即停止”的原则,如果对比完整个链也没有找到和数据包匹配的规则,则会按照链的默认策略进行处理。

包过滤流程

安装

CentOS的版本7中,默认没有安装iptables工具,所以需要手动安装:

执行以下命令进行安装:

回车即可

yum install -y iptables-services

执行回车 如图:

安装iptables过程

安装完毕

启动服务

使用管理服务的systemctl命令,启动并查看iptables服务:

依次执行

systemctl status iptables
systemctl start iptables
systemctl status iptables

使用IPtables基本语法:

iptables [指定表] [选项] [条件] -j [策略]

指定表说明

-t 表名:用来指定操作的表,有filter、nat、mangle或raw,默认使用filter

选项说明

查看的选项:

  • -L 链名:查看指定表指定链的规则,不指定链则查看指定表的所有规则。

  • -v:查看详细信息。

  • -n:以数字格式显示主机地址和端口号。

  • -x:显示计数器的精确值。

  • --line-numbers:查看规则时,显示其在链上的编号。

管理规则的选项:

  • -A 链名:添加新规则于指定链的尾部。

  • -I 链名 数字:添加新规则于指定链的指定位置,默认为首部。

  • -R 链名 数字:替换指定的规则为新的规则。

  • -D 链名 数字:根据规则编号删除规则。

管理链的选项:

  • -N 链名:新建一个自定义的规则链。

  • -X 链名:删除指定表指定自定义链的规则,不指定链则删除指定表的所有自定义链的规则。

  • -F 链名:清空指定表指定链的规则,不指定链则清空指定表的所有规则。

  • -E 原链名 新链名:重命名链。

  • -Z:清空链及链中默认规则的计数器。 6 -P 链名 策略, 设置链路的默认策略。

条件说明

  • -s IP地址:匹配源地址,这里不能指定主机名称,必须是IP。主要有3种,IP、IP/MASK、0.0.0.0/0.0.0.0。地址可以取反,加一个“!”表示除了哪个IP之外。

  • -d IP地址:匹配目标地址,规则同-s。

  • --sport 端口号-端口号:指定源端口,不能指定多个非连续端口,只能指定单个端口。

  • --dport 端口号-端口号:指定目标端口,规则同--sport。

  • -i 网卡:从指定网卡流入的数据,流入一般用在INPUT和PREROUTING上。

  • -o 网卡:从指定网卡流出的数据,流出一般在OUTPUT和POSTROUTING上。

  • -p 协议:匹配协议,这里的协议通常有3种,TCP、UDP、ICMP。

  • -m 端口号,端口号:表示启用多端口扩展。

策略说明

  • ACCEPT:接收数据包。

  • DROP:丢弃数据包。

  • REJECT:被拒绝时,提示被拒绝的原因。

  • REDIRECT:将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务。

  • SNAT:源地址转换。

  • DNAT:目的地址转换。

  • MASQUERADE:IP伪装。

  • LOG:日志功能。

保存配置

service iptables save

使用举例

查看规则:

[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
584 45376 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 4 packets, 464 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]#

添加规则:

[root@localhost ~]# iptables -A INPUT -m state --state NEW -p tcp --dport 3306 -j ACCEPT
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
754 57856 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:3306

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 4 packets, 592 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]#

删除规则:

[root@localhost ~]# iptables -D INPUT 6
[root@localhost ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
807 61588 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 19 packets, 2004 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]#

firewalld命令

在CentOS系统的版本7中,firewalld防火墙取代了iptables防火墙,作为系统中netfilter内核模块的管理工具。firewalld使用了daemon和service替代了iptables的service部分,其底层还是使用iptables的command作为防火墙规则管理入口。

同iptables比较

firewalld跟iptables比起来至少有两大好处:

1)firewalld支持动态更新规则。使用iptables时,每一个单独的更改都需要清空旧的规则并重新读取所有规则,这种方式被称为静态防火墙件。而使用firewalld修改规则后,不需要重新加载所有规则,只需要将变更部分保存并更新到运行中的iptables即可,这种方式被称为动态防火墙。

2)firewalld使用区域和服务而不是链式规则。即使不明白“五张表五条链”,而且对TCP/IP协议也不理解也可以实现大部分功能,在使用上要比iptables人性化很多。

配置方式

firewalld的配置方法主要有三种:图形化工具、命令行工具、配置文件。

配置文件

firewalld的配置文件有两个存储位置:

1 /etc/firewalld/:用于用户创建和自定义配置文件,覆盖默认配置。2 /usr/lib/firewalld/:用于默认和备用配置。

firewalld的配置文件结构非常简单,主要包含两个文件和三个目录:

  • 文件firewalld.conf是主配置文件,只有5个配置项:

  • 1)DefaultZone表示使用的zone。默认值为public。

  • 2)MinimalMark表示标记的最小值。默认值为100。

  • 3)CleanupOnExit表示当退出firewalld后是否清除防火墙规则。默认值为yes。

  • 4)Lockdown表示是否可以通过lockdown-whitelist.xml文件操作firewalld。默认值为no。

  • 5)IPv6_rpfilter用来判断所接受到的包是否是伪造的。默认值为yes。
    文件lockdown-whitelist.xml规定了当Lockdown为yes的时候,哪些程序可以对firewalld进行操作。

  • 文件direct.xml使用类似iptables的语法来进行规则的增删,如果用到direct就会有这个文件。

  • 目录zones用来保存zone配置文件。

  • 目录services用来保存service配置文件。

  • 目录icmptypes用来保存和icmp类型相关的配置文件。

区域(zone)说明

所谓的区域就是一个信赖等级,某一等级下对应有一套规则集。划分方法包括:网络接口、IP地址、端口号等等。

一般情况下,会有如下的这些默认区域:

  • drop:丢弃所有进入的数据包。

  • block:拒绝所有进入的数据包。

  • public:只接受部分选定的数据包。

  • external:应用在NAT设定时的对外网络。

  • dmz:非军事区。

  • work:使用在公司环境。

  • home:使用在家庭环境。

  • internal:应用在NAT设定时的对内网络。

  • trusted:接受所有的数据包。

查看用户配置目录里的zone配置文件:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
0

查看public.xml配置文件的内容:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
1

可以看到配置文件中仅开放了 dhcpv6-client 服务和 ssh 服务。

服务(service)说明

iptables时代习惯使用端口号来匹配规则,但是如果某一个服务的端口号改变了,那就要同时更改iptables的规则,十分不方便,同时也不方便阅读理解。

service配置文件使用服务名来命名,比如ssh的配置文件是ssh.xml,可以通过修改配置文件的内容来实现对规则的修改。

查看ssh.xml配置文件的内容:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
2

名词解释

target:策略,当区域在处理包的时候,如果没有显式指明策略,则使用区域的target表示的策略。有四个可选值:default(不处理并返回上一级)、ACCEPT(通过)、%%REJECT%%(拒绝并回复)、DROP(丢弃不回复),默认为default。

service:服务。

port:端口,使用port可以不通过service而直接对端口进行设置。

interface:接口,可以理解为网卡。

source:源地址,可以是ip地址也可以是ip地址段。

icmp-block:icmp报文阻塞,可以按照icmp类型进行设置。

masquerade:ip地址伪装,也就是按照源网卡地址进行NAT转发。

forward-port:端口转发。

rule:自定义规则。

匹配zone

对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

1)source,请求报文的源地址。

2)interface,接收请求的网卡。

3)firewalld.conf中配置的默认zone。

基本语法

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
3

可选配置说明

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
4

选项说明

查看和更改状态:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
5

使用应急模式:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
6

查看和操作区域:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
7

查看区域配置:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
8

反向查询区域:

filter表是iptables的默认表,用于过滤包,如果没有自定义表,那么就默认使用filter表。
nat表用于网络地址转换。
mangle表用于指定如何处理数据包,它能修改数据标记位。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,用于处理异常。
security表用于强制访问控制(MAC)的网络规则,在CentOS中没有该表。
9

操作区域绑定的地址:

yum install -y iptables-services0

操作区域开放的接口:

yum install -y iptables-services1

配置区域的策略:

yum install -y iptables-services2

配置区域的服务:

yum install -y iptables-services3

配置区域的端口:

yum install -y iptables-services4

配置区域的端口转发:

yum install -y iptables-services5

配置区域按照icmp类型进行阻塞:

yum install -y iptables-services6

配置地址转换:

yum install -y iptables-services7

通过rich规则配置区域:

yum install -y iptables-services8