Netfilter/firewalld以下简称firewalld)是unix/linux CentOS 7.0版本自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙管理工具。
它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台非常低硬件配置服务器上运行的非常好,提供近400人的上网服务丝毫不逊色企业级专业路由器防火墙。
Netfilter一个系统的内核模块,通过netfilter内核控制硬件设备,firewalld相当于是一个控制软件。
主要是网络层,针对IP数据包
体现在对包内的IP地址、端口/服务,等信息的处理上
指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于"内核态/内核空间的防火墙功能体系"
指的是用来管理linux防火墙的命令程序,属于用户态/用户空间的防火墙管理体系。
firewalld属于应用层,属于一个定义规则的配置工具,核心的数据包响应和处理,包括拦截和转发等操作属于netfilter来控制,netfilter属于linux系统核心层内部的一个数据包处理模块。
为包过滤机制的实现提供规则,通过各种不同的规则告诉netfilter对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理。
1.检查数据来源的源地址:
若源地址关联到特定的区域,则执行该区域所制定的规则
若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所制定的规则
举例:
如将drop区域设置为默认区域,则默认所有流量均不可放行,因为drop区域默认动作为DROP,而其中无任何IP、端口等配置,因此无法访问该服务器。
此时在其他区域如work添加源地址、访问协议并定义work区域动作为允许/非拒绝,则源地址在work中的主机将可以访问work中定义的协议,即使此时服务器的网卡默认区域为drop,也可访问。
若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则
2.当客户端访问网关服务器本身时,网关服务器的入口区域规则是生效的
3.当客户端通过网关服务器访问其他服务器时,网关服务器的入口区域规则不生效
4.在开启firewalld情况下并实现网关服务器转发流量到其他服务器,那么需要通过IP地址伪装或者端口转发实现
地址伪装:NAT,内网访问外网
- PAT,外网访问内网
当客户端访问公网IP:202.100.108.100:8080时,能跳转到192.168.2.20:80
在CentOS 7.0版本中有几种应用层的防火墙管理程序:firewalld、iptables、ebtables,默认使用firewalld;在CentOS 7版本之前默认使用的是iptables。
相对于传统的iptables防火墙管理工具,firewalld支持动态更新,并加入了区域zone的概念,相对于iptables来说,配置更加简单。
简单来说,区域就是firewalld预先准备了几套防火墙策略规则(策略模版),用户可以根据生产场景的不同而选择合适的策略合集,从而实现防火墙策略的快速切换使用。
firewalld能定义多组区域:
1.根据不同的环境选择不同的区域
2.根据不同的区域配置不同的访问规则。
在防火墙配置中,"区域"的相关配置选项的含义如下:
服务:
其实指的是该服务默认的端口,该服务关闭则表示该服务默认端口关闭
端口:
相关端口,端口需依赖所对应的服务,用法如:ssh服务被关闭,意味着TCP22被封,但ssh的端口被管理员改为222,那么在端口中开启222即可实现访问服务器ssh服务,虽然此时的服务ssh是被关闭的。
协议:
指的是比较广范围的服务或端口,如TCP、UDP、ICMP等,相当于是一个组策略。开启了TCP,意味着所有TCP流量均可通过。
源端口:
添加访问者的端口,该端口可是一个,也可是一个范围,一般不需要使用,因为源端口一般都是发起请求端的随机端口。
IP地址伪装:
NAT,一般用于内网用户通过NAT访问外网,只能用于IPv4
端口转发:
PAT,更加细致的NAT,通过IP+端口实现转换,用于外网访问内网较多
ICMP过滤器:
一般用于是否回应ping请求
在防火墙配置中,"服务"的相关配置选项的含义如下:
目标地址:发起请求者要访问的目标地址,添加进的IP则是允许的IP,该配置为空时表示允许所有。
其他选项卡与"区域"中的功能一致。
firewall-config图形工具
firewall-cmd命令行工具
/etc/firewalld/中的配置文件
firewall-cmd是firewalld防火墙自带的字符管理工具,可以用来设置firewalld防火墙的各种规则,需要注意的是firewalld防火墙规则分为两种状态,一种是runtime(正在运行生效的状态),在runtime状态添加新的防火墙规则,这些规则会立即生效,但是重新加载防火墙配置或者重启系统后这些规则将会失效;一种是permanent(永久生效的状态),在permanent状态添加新的防火墙规则,这些规则不会马上生效,需要重新加载防火墙配置或者重启系统后生效。
在使用firewall-cmd命令管理防火墙时,需要添加为永久生效的规则需要在配置规则时添加--permanent选项(否则所有命令都是作用于runtime,运行时配置),如果让永久生效规则立即覆盖当前规则生效使用,还需要使用firewall-cmd --reload命令重新加载防火墙配置。
- --runtime-to-permanent 将当前运行的防火墙配置策略保存为永久生效
# yum install firewalld //即安装firewalld管理工具,使用命令为firewall-cmd
# firewall-config //在图形化界面下该命令可以实现打开firewalld图形配置界面
# systemctl start firewalld //启用防火墙
# systemctl enable firewalld //设置防火墙开机自启
# systemctl status firewalld //查看防火墙当前是否已经启用
# firewall-cmd --state //查看防火墙当前是否已经启用
# systemctl stop firewalld //关闭防火墙
# systemctl disable firewalld //关闭防火墙的开机自启
如果想要更高效的配置妥当防火墙,那么就一定要学习字符管理工具firewall-cmd命令,命令参数有:
参数 作用
--get-default-zone 查询默认的区域名称。
--set-default-zone=<区域名称> 设置 默认的区域,永久生效。
--get-zones 显示可用的区域。
--get-services 显示预先定义的服务。
--get-active-zones 显示当前正在使用的区域与网卡名称。
--get-zone-of-interface=<interface> 显示指定接口绑定的区域
--get-icmptypes //查看默认定义的ICMP类型
--add-source=192.168.1.100 --zone=drop 将来源于此IP或子网的流量导向指定的区域。
--remove-source= 不再将此IP或子网的流量导向某个指定区域。注意:删除时不需要指定区域,因为一个IP地址只能属于一个区域;
--add-interface=ens33 将来自于该网卡的所有流量都导向到默认区域。
--change-interface=<网卡名称> 将某个网卡与区域做关联。
--zone=<zone> --remove-interface=<interface> 为指定的区域删除绑定的网络接口 //被删除后,接口将会回到默认区域;
--list-all 显示当前区域的网卡配置参数,资源,端口以及服务等信息。
--list-all-zones 显示所有区域的网卡配置参数,资源,端口以及服务等信息。
[--zone=<zone>] --list-all 显示所有指定区域的所有规则,不指定区域时表示默认区域
--add-service=<服务名> 设置默认区域允许该服务的流量。
--add-port=<端口号/协议> 允许默认区域允许该端口的流量。
--remove-service=<服务名> 设置默认区域不再允许该服务的流量。
--remove-port=<端口号/协议> 允许默认区域不再允许该端口的流量。
--reload 让"永久生效"的配置规则立即生效,覆盖当前的。
--runtime-to-permanent 将当前运行的防火墙配置策略保存为永久生效
特别需要注意的是firewalld服务有两份规则策略配置记录,必需要能够区分:
Runtime:当前正在生效的。
Permanent:永久生效的。
--add
--add-port=8080-8081/tcp //允许范围端口流量通过
--add-protocol=icmp //允许默认区域的icmp流量通过
--add-icmp-block=echo-request //禁止ICMP流量通过
--remove
--add-icmp-block-inversion 定义为白名单
--remove-icmp-block-inversion 定义为黑名单
--remove-icmp-block=echo-request //允许ICMP流量通过
--zone
# # --zone=drop --add-interface=ens32 为指定接口绑定区域
# # --zone=drop --change-interface=ens32 为指定的区域更改绑定的网络接口
# # --permanent --zone=drop --change-interface=ens32 为指定的区域更改绑定的网络接口,永久生效
# # --zone=drop --remove-interface=ens32 为指定的区域删除绑定的网络接口
# # --zone=drop --add-source=192.168.1.12 //设置来源地址作用在drop区域上
# # --zone=drop --query-service=ssh //查询drop区域是否允许ssh服务通过
# # --zone=drop --add-service=ssh //设置drop区域允许ssh服务通过
# # --zone=drop --remove-service=ssh //设置drop区域拒绝ssh服务通过
# # --zone=drop --add-port=22/tcp //开放TCP22端口
# # --zone=drop --remove-port=22/tcp //关闭TCP22端口
# # --zone=drop --add-port=8080-8081/tcp //开放TCP8080-8081
# # --zone=drop --list-ports //查询drop区域开放了哪些端口
# # --zone=drop --add-protocol=icmp //设置drop区域允许icmp协议通过
# # --zone=drop --remove-protocol=icmp //拒绝icmp协议通过
# # --zone=drop --list-protocols //查询drop区域开放了哪些协议
将原本访问本机888端口的流量转发到本机22端口:
# firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22
将原本访问本机888端口的流量转发到ip为192.168.2.208的主机的22端口,需要开启masquerade地址伪装
# firewall-cmd --zone=drop --add-masquerade
# firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.2.208
--query
# # firewall-cmd --query-service=ssh //查询默认区域是否允许ssh协议
--list
# # firewall-cmd --list-all //显示当前区域的网卡配置参数,资源,端口以及服务等信息。
# # firewall-cmd --list-all-zones //显示所有区域的网卡配置参数,资源,端口以及服务等信息。
# # firewall-cmd --list-protocols //显示默认区域开放的协议
# # firewall-cmd --list-ports //显示默认区域开放的端口
[--zone=<zone>] --list-all //显示所有指定区域的所有规则,不指定区域时表示默认区域
查看指定区域的设置:
# firewall-cmd --zone=trusted --list-all
trusted (active)
Target:目标
icmp-block-inversion:ICMP协议类型黑白名单开关(yes/no),为yes表示在icmp-blocks列表中的任何ICMP类型都将被允许,为no时表示在icmp-blocks中的将被拒绝。
Interfaces:关联的网卡接口
sources:来源,可以是IP地址,也可以是mac地址
services:允许的服务
ports:允许的目标端口,即本地开放的端口
protocols:允许通过的协议
masquerade:是否允许伪装(yes/no),可改写来源IP地址及mac地址
forward-ports:允许转发的端口
source-ports:允许的来源端口
icmp-blocks:可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,这些ICMP类型被允许,yes且为空则表示所有icmp都不能通过。
rich rules:富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。
对于每一个 zone 都有一个默认的行为(target),来处理流入的流量。每个 target 会有四个选项:default, ACCEPT, REJECT 和 DROP.
ACCEPT 除了被明确写好的规则,会接受所有流入的数据包。
REJECT 除了被明确写好允许的规则,会拒绝所有流入的数据包, 会给发起连接的机器回复被拒绝的消息。
DROP 除了被明确写好允许的规则,会拒绝所有流入的数据包, 不会给发起连接的机器回复任何消息。
定义target:
# firewall-cmd --zone=external --set-target=DROP --permanent
# firewall-cmd --reload //重载
注意:如当定义public区域默认target为DROP后,区域中又没定义允许icmp流量,此时无法ping通该服务器,如果能ping通可能是因为BUG,可等几分钟再ping。
打开路由转发:
# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 //值为0表示关闭转发,为1表示开启转发
# sysctl -p //刷新修改的文件
# cat /proc/sys/net/ipv4/ip_forward //查看是否已开启转发
1
后面的设置命令将全部使用运行时模式,即当前生效模式。因此不需要加--permanent
将来自ens33网卡的流量都作用到默认的drop区域:
# firewall-cmd --zone=drop -add-interface=ens33 //作用在指定区域
# firewall-cmd -add-interface=ens33 //作用在默认区域
# firewall-cmd -remove-interface=ens33 //禁止ens33网卡作用在默认区域
注:不指定--zone参数的话,将会对默认区域进行设置
启动关闭firewalld防火墙服务的应急状况模式,远程连接服务器时请慎用
# firewall-cmd --panic-on //拒绝所有流量,远程连接会立即断开,只有本地能登陆
# firewall-cmd --panic-off //取消应急模式,但需要重启firewalld后才可以远程ssh
# firewall-cmd --query-panic //查看是否为应急模式
设置一个来源地址作用在区域上面:
# firewall-cmd --zone=drop --add-source=192.168.1.12 //作用在指定区域
# firewall-cmd --add-source=192.168.1.12 //作用在默认区域
# firewall-cmd --remove-source=192.168.1.12 //取消源IP为192.168.1.12的包作用在默认区域
说明:凡是IP为192.168.1.12发来包将会使用drop区域设置的规则
对于一个接收到的请求具体使用哪个zone,firewalld是通过三种方式来判断的:
1、source,来源地址
2、Interface,接收请求的网卡
3、firewalld配置的默认区域(zone)
这三个方式的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去找,如果前两个都找不到才会使用第三个默认区域。
查询drop区域是否允许请求ssh和https服务的流量:
# firewall-cmd --zone=drop --query-service=ssh
# firewall-cmd --zone=drop --query-service=https
在drop区域开放https服务
# firewall-cmd --zone=drop --add-service=https
取消开放https服务,即禁止https服务
# firewall-cmd --zone=drop --remove-service=https
开放22端口
# firewall-cmd --zone=drop --add-port=22/tcp
取消开放22端口
# firewall-cmd --zone=drop --remove-port=22/tcp
开放8080和8081端口
# firewall-cmd --zone=drop --add-port=8080-8081/tcp
查询drop区域开放了哪些端口
# firewall-cmd --zone=drop --list-ports
允许icmp协议流量,即允许ping
# firewall-cmd --zone=drop --add-protocol=icmp
取消允许icmp协议的流量,即禁ping
# firewall-cmd --zone=drop --remove-protocol=icmp
查询drop区域开放了哪些协议
# firewall-cmd --zone=drop --list-protocols
将原本访问本机888端口的流量转发到本机22端口
# firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22
将原本访问本机888端口的流量转发到ip为192.168.2.208的主机的22端口,需要开启masquerade
# firewall-cmd --zone=drop --add-masquerade
# firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.2.208
测试端口转发功能是否生效
在客户端尝试访问192.168.2.210主机的888端口,连上去后发现实际连接的是192.168.2.208主机,测试正常。
1.只允许192.168.1.100访问服务器的80端口
设置默认区域为drop,将192.168.1.100加到其他区域,并设置其区域开放80端口。
2.只允许192.168.1.100访问服务器的任何服务
设置区域为drop区域,将192.168.1.100加入到trusted区域,默认该区域允许所有流量通过。
3.基于需求2,禁止192.168.1.100 ping 服务器
# --add-icmp-block=echo-request --zone=trusted
4.只拒绝192.168.1.100访问服务器的任何服务
设置默认区域为trusted,将192.168.1.100加入到drop区域。
实验案例:
两台web服务器、网关都安装httpd并启动用于测试firewalld防火墙
内网web服务器:
# yum install -y httpd
# echo "这是192.168.2.100内网web服务器" > /var/www/html/index.html
# systemctl start httpd
# yum install -y elinks
网关服务器:
# yum install -y httpd
# echo "这是网关服务器" > /var/www/html/index.html
# systemctl start httpd
# yum install -y elinks
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
外网web服务器:
# yum install -y httpd
# echo "这是192.168.3.100外网服务器" > /var/www/html/index.html
# systemctl start httpd
# yum install -y elinks
防火墙配置:
内网服务器:
# systemctl start firewalld
# firewall-cmd --set-default-zone=dmz
在内网服务器开启了防火墙并设置为DMZ区域后,默认只允许ssh、icmp通过流量通过。以下命令查看默认区域的规则定义:
# firewall-cmd --list-all
若要希望其他人访问内网服务器的web服务器,则可以执行以下规则配置:
# firewall-cmd --add-service=http //添加允许服务
# firewall-cmd --add-service=https
# firewall-cmd --remove-service=https //删除已允许的服务
# firewall-cmd --add-port=80/tcp //添加允许端口
# firewall-cmd --add-port=89/tcp
# firewall-cmd --remove-port=89/tcp //删除已允许端口
# firewall-cmd --list-all //查看当前服务器防火墙的默认状态
dmz (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: http ssh
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
通过以上设置后即可在其他主机中直接访问内网服务器的web应用。
如果不希望其他人以ping方式连接内网服务器,可通过规则禁止ping流量通过:
# firewall-cmd --add-icmp-block=echo-request “会有延迟”
# firewall-cmd --add-icmp-block=echo-reply //服务器本身发出去的报文回应的reply不会被禁止。
或者
# firewall-cmd --set-target=DROP --permanent
# firewall-cmd --reload //命令执行后将会把之前配置的临时生效规则清空。
# firewall-cmd --runtime-to-permanent //保存配置,需要保持配置再执行。
# firewall-cmd --list-all-zones //查看所有区域的配置信息
网关服务器配置:
# systemctl start firewalld
# firewall-cmd --set-default-zone=public
添加三个网卡到相关区域:
# firewall-cmd --change-interface=ens32 --zone=trusted
# firewall-cmd --change-interface=ens33 --zone=dmz
# firewall-cmd --change-interface=ens34
# firewall-cmd --remove-interface=ens34 //从某个区域中删除某个网卡
# firewall-cmd --change-interface=ens35 --zone=external
最后区域划分结果如下:
# firewall-cmd --get-active-zones
dmz
interfaces: ens33
external
interfaces: ens35
trusted
interfaces: ens32
通过以上对网关的配置后,要想从网关三个接口通过的流量就必须要遵循三个区域的规则,
内网区域为trusted,因此内网可以直接访问DMZ、外网(可使用IN_PC访问三台web服务器)
IN_PC在访问DMZ、网关时,对于服务器来说,来访者都是IN_PC的IP地址,但是IN_PC在访问外网WEB服务器时,来访者IP为网关服务器的外网接口IP地址,因为网关外网接口区域为external,默认开启了地址伪装。
# firewall-cmd --remove-masquerade --zone=external //关闭地址伪装,
# firewall-cmd --list-all --zone=external
再次访问外网WEB服务器,发现来访者IP为IN_PC的IP地址
# cat /etc/httpd/logs/access_log //OUT_WEB服务器中执行
关闭网关的外网区域地址伪装后,DMZ无法访问OUT区域(默认只有trusted区域可以不开启地址伪装访问其他区域。)
允许DMZ_WEB访问OUT_WEB:
网关的dmz区域连接至DMZ_WEB,而该区域默认未允许80/tcp流量通过,因此通过以下设置实现DMZ访问OUT:
firewall-cmd --add-masquerade --zone=external
而外网无法访问DMZ或内网其他服务,但是默认允许ICMP流量。因为外网访问网关时,网关的external区域没有定义禁止访问ICMP,且target为default,因此将会放行ICMP流量。
允许外网访问网关的web服务器:
# firewall-cmd --zone=external --add-port=80/tcp
由于区域的限制,外网区域无法直接通过external_web服务器IP地址访问到dmz_web服务器。
# firewall-cmd --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.2.100
额外的公网IP来实现NAT端口转发:
# firewall-cmd --zone=external --add-rich-rule='rule family=ipv4 destination address=192.168.3.11/32 forward-port port=8080 protocol=tcp to-port=80 to-addr=192.168.2.100'
以上的192.168.3.11/32需要在external区域的网卡中加入该IP地址,为:IPADDR1=192.168.3.11,不需要加子网掩码
设置OUT区域访问DMZ区域的ssh服务:
# firewall-cmd --zone=external --add-forward-port-port=2222:proto=tcp:port=22:toaddr=192.168.2.100
OUT_WEB服务器访问DMZ服务器:
# ssh root@192.168.3.10:2222
禁止dmz区域所有ping流量通过
# firewall-cmd --zone=dmz --add-rich-rule='rule protocol value=icmp drop'
删除地址伪装:
# firewall-cmd --remove-masquerade --zone=external
通过富规则实现指定网段的地址伪装:
# firewall-cmd --zone=external --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 masquerade'
IP地址伪装为源IP地址转换,也就是说对于被访问者查看到的来访者IP应该是转换之后的IP
端口转发为目标地址转换,也就是说,对于被访问者查看到的来访者IP应该是最开始发起访问的客户端IP,因为实现的是目标的地址转换,而不是源地址转换,因此源地址保持不变
富语言(rich language)
表达性配置语言,无需了解iptables语法
用于表达基本的允许/拒绝规则、配置记录(面向syslog和auditd)、端口转发、伪装和速率限制
富规则实验案例继续使用上一章节的拓扑图
富规则的设置,即rich rules
允许192.168.1.100主机的所有流量
firewall-cmd --zone=dmz --add-rich-rule="rule family="ipv4" source address="192.168.1.100" accept"
通过以上配置,就可以实现源地址为100的访问当前服务器所有服务或协议等,而不需要在
firewall中基础的service、port、source等开放权限
拒绝所有源地址ping当前主机:
# firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=0.0.0.0/0 protocol value='icmp' drop'
允许192.168.1.100主机的icmp协议,即允许192.168.1.100主机ping
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.100" protocol value="icmp" accept"
取消允许192.168.1.100主机的所有流量
firewall-cmd --zone=dmz --remove-rich-rule="rule family="ipv4" source address="192.168.1.100" accept"
允许192.168.1.100主机访问ssh服务
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.1.100" service name="ssh" accept"
在默认情况下
禁止192.168.1.100访问https服务,并返回错误信息
firewall-cmd --zone=dmz --add-rich-rule="rule family="ipv4" source address="192.168.1.100" service name="https" reject"
注:如果是drop的话是直接丢弃,会返回timeout(连接超时)
允许192.168.1.0/24网段的主机访问22端口
firewall-cmd --zone=dmz --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept"
每分钟允许2个新连接访问ftp服务
firewall-cmd --add-rich-rule="rule service name=ftp limit value=2/m accept"
允许新的ipv4和ipv6连接ftp,并使用日志和审核,每分钟允许访问一次
firewall-cmd --add-rich-rule="rule service name=ftp log limit value=1/m audit accept"
拒绝来自192.168.2.0/24网段的连接,10秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10
允许ipv6地址为2001:db8::/64子网的主机访问dns服务,并且每小时审核一次,300秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300
将来自192.168.2.0/24网段访问本机80端口的流量转发到本机的22端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22"
将来自192.168.2.0/24网段访问本地80端口的流量转发到192.168.2.208主机的22端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208"
伪装,将来自局域网192.168.2.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址
firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"
iptables防火墙:
规则表:
filter表:用于过滤;根据具体的规则要求如何处理数据包。对应的内核模块为:iptables_filter
包含的链:INPUT、FORWARD、OUTPUT
nat表:用于地址转换;用于修改数据包的IP地址、端口号等信息。对应的内核模块为:iptables_nat
包含的链:PREROUTING、OUTPUT、POSTROUTING
mangle表:用于修改数据包;修改数据包的服务类型、生存周期等,用于实现流量整形、策略路由等高级应用。对应的内核模块为:iptables_mangle
包含的链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw表:不再让iptables做数据包的连接跟踪处理,跳过其他表,提高性能。对应的内核模块为:iptables_raw
包含的链:OUTPUT、PREROUTING
规则链:
INPUT链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD链:当接收到需要通过防火墙中转发给其他地址的数据包(转发)时,应用此链中的规则。
PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。
POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。
注意:INOUT、OUTPU链主要用在"主机型防火墙"中,主要针对服务器本机进行保护的防火墙
而FORWARD、PREROUTING、POSTROUTING链多用在"网络型防火墙"中,如使用linux防火墙作为网关服务器等
应用顺序
当数据包到达防火墙时,关于表的应用顺序如下:
raw--->manlg--->nat--->filter
关于链的应用顺序:
入站:PREROUTING--->INPUT
出站:OUTPUT--->POSTROUTING
转发:PREROUTING--->FORWARD--->POSTROUTING
规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理
二、编写iptables规则
基本语法:
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
表名、链名用于指定表和链,未指定表名将默认使用filter表
管理选项表示规则的操作方式:插入、增加、删除、查看等
匹配条件用来指定要处理的数据包的特征,不符合条件的数据包将不会处理
控制类型指数据包的处理方式,如允许、拒绝、丢弃等
编写规则的几个注意事项
不指定表名时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写
#数据包的常见控制类型:
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
SNAT:源地址转换
DNAT:目标地址转换
LOG:记录日志信息,然后传给下一条规则继续匹配
#常用的管理选项:
-p:指定协议
添加新的规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
查看规则列表
-L:列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号
删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
设置默认策略
-P:为指定的链设置默认规则
详细语法:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
举例:
拒绝本机接受所有ICMP协议
# iptables -t filter -I INPUT -p icmp -j REJECT
拒绝本机接受所有udp协议
# iptables -t filter -I INPUT -p udp -j REJECT
允许本机接受所有tcp协议
# iptables -I INPUT 2 -p tcp -j ACCEPT
当使用-I选项进行插入时,新插入的规则最靠前,而使用-A进行插入时,插入的规则在最后
查看INPUT相关规则:
# iptables -nL INPUT --line-numbers
删除INPUT的某条规则:
# iptables -D INPUT 3 //删除序号为3的规则
清空所有与INPUT相关规则:
# iptables -F INPUT //删除默认表中的INPUT链中的所有规则
# iptables -F //表示清除filter表中的规则
# iptables -t nat -F //表示清除nat表中的规则
# iptables -t mangle -F //表示清除mangle表中的规则
设置默认策略
当找不到任何一条能够匹配的策略时,则执行默认策略。策略控制类型有两种:ACCEPT、DROP
设置将filter表中FORWARD链的默认策略设置为丢弃:
# iptables -t filter -P FORWARD DROP
设置将filter表中OUTPUT链的默认策略设置为允许:
# iptables -P OUTPUT ACCEPT
使用-F选项无法清空默认规则,若修改需使用-P重新定义
规则的匹配条件设置
通用匹配
1.协议匹配
将本机收到的ICMP协议数据包进行丢弃,除此之外的所有协议允许通过:
# iptables -I INPUT -p icmp -j DROP //拒绝icmp协议数据包进入
# iptables -A INPUT ! -p icmp -j ACCEPT //允许除icmp协议以外的数据包进入
2.地址匹配
通过-s指定源地址,-d指定目标地址进行匹配,如下设置拒绝转发IP与网段的规则:
# iptables -A FORWARD -s 192.168.1.2 -j DROP
# iptables -A FORWARD -s 192.168.2.0/24 -j DROP
禁止192.168.3.0/24网段主机进入及转发规则:
# iptables -A INPUT -s 192.168.3.0/24 -j DROP
# iptables -A FORWARD -d 192.168.3.0/24 -j DROP
3.网络接口匹配
-i 表示入站网卡,-o表示出站网卡
举例:若要丢弃从外网接口eth1访问本机且源地址为192.168.4.0/24的数据包:
# iptables -A INPUT -i eth1 -s 192.168.4.0/24 -j DROP
隐含匹配
1.端口匹配
--dport目标端口 --sport源端口 -s/-d指定ip
转发时ip地址是192.168.0.0网段且协议端口是udp的53端口的目标端口才转发
#iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
转发时目的ip是这个网段且源端口为53才能通过
#iptables -A FORWARD -d 192.168.0.0/24 -P udp --sport 53 -j ACCEPT
2.tcp标记匹配
开放tcp的20、21端口 冒号的意思是范围内
#iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
3.icmp类型匹配 8:请求 0:回显 3:不可达
# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp -j DROP
案例:
设置只允许打开本地22、80端口以及开启ping测试命令
清空所有入站规则:
# iptables -F INPUT
拒绝所有流量入站:
# iptables -P INPUT DROP
打开本地22号端口:
# iptables -I INPUT -p tcp --dport 22 -j ACCETP
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
打开本地icmp协议通过
# iptables -I INPUT -p icmp -j ACCEPT
显示匹配
1.多端口匹配
开启本机以下端口的入站连接
#iptbales -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
转发时目标主机开启这些端口才能转发
#iptables -A FORWARD -p tcp -m multiport --sport 25,80 -j ACCEPT
2.IP范围转发 --src/--dst转发源地址与目标地址
允许转发源为这个网段ip进行转发
#iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.1-192.168.1.10 -j ACCEPT
直接丢弃目的ip为这个网段的数据
#iptables -A FORWARD -p tcp -m iprange --dst-range 192.168.1.1-192.168.1.10 -j DROP
3.mac地址匹配 一般适用于内部网络
拒绝这个mac地址访问本机
#iptables -A INPUT -m mac --mac-source mac地址 -j REJECT
SNAT
客户机:192.168.1.1/24 gw:192.168.1.10
网关服务器:eth0:192.168.1.10/24
eth1:192.168.2.10/24
web服务器:eth1:192.168.2.20/24
开启路由转发
#vim /etc/sysctl.conf 0改为1
#sysctl -p 重新加载
nat表的POST。链加入路由后的192网段转发到1.1.1.1网段
#iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
DNAT
开启路由转发
外网的人访问到内网的ip192 需要添加本机外网1.1.1.1到内网192的策略
#iptables -t nat -A PREROUTING -i eth0 -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1
# iptables-save 显示出所有表的规则 或者-t 表名 只查看指定的表
# iptables-save > /root/a.txt 将iptables策略备份 或-t 表名 只备份指定的表
# iptables-restore < /root/a.txt 将备份的策略恢复到iptables中
实例:
清除已有iptables规则
iptables -F
清除所有规则,不会处理默认的规则
iptables -X
删除用户自定义的链
iptables -Z
链的计数器清零(数据包计数器与数据包字节计数器)
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
查看已添加的iptables规则
iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
若将linux主机作为网关设备使用,则需要打开路由转发
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 //修改参数为1
# sysctl -p //重新加载
或者临时设置:
# echo 1 > /proc/sys/net/ipv4/ip_forward
保存防火墙规则,永久生效:
# iptables-saev > /etc/sysconfig/iptables
# chkconfig iptables on