防火墙基本概述:

#在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理方式。

对于接触Linux较早的人员对Iptables比较熟悉,但由于Iptables的规则比较的麻烦,并且对网络有一定要求,所以学习成本较高。但firewalld的学习对网络并没有那么高的要求,相对iptables来说要简单不少,所以建议刚接触CentOS7系统的人员直接学习Firewalld。

image-20230619193614514

#需要注意的是:如果开启防火墙工具,并且没有配置任何允许的规则,那么从外部访问防火墙设备默认会被阻止,但是如果直接从防火墙内部往外部流出的流量默认会被允许。

firewalld 只能做和IP/Port相关的限制,web相关的限制无法实现。

防火墙使用规则

#入站规则:
1. 只允许特定IP地址或IP地址范围的流量进入本地网络。
2. 只允许特定端口或端口范围的流量进入本地网络。
3. 只允许特定协议(如TCP、UDP)的流量进入本地网络。
4. 阻止已知的恶意IP地址或IP地址范围的流量进入本地网络。
5. 根据流量的内容进行特定筛选,如黑名单或白名单规则。
#出站规则:
1. 只允许特定IP地址或IP地址范围的流量离开本地网络。
2. 只允许特定端口或端口范围的流量离开本地网络。
3. 只允许特定协议(如TCP、UDP)的流量离开本地网络。
4. 阻止本地网络中的敏感数据或机密数据通过防火墙外传。
5. 根据流量的内容进行特定筛选,如黑名单或白名单规则。
#注意:防火墙默认全部拒绝

防火墙的操作

image-20230619195705697

区域选项 默认规则策略
trusted: 允许所有的数据流入流出
home:拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal:等同于home区域
work:拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量
public:拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
external:拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz:拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block:拒绝流入的流量,除非与流出的流量相
drop:拒绝流入的流量,除非与流出的流量相关

防火墙基本指令参数

参数 作用
zone区域相关指令
--get-default-zone 获取默认的区域名称
--set-default--zone=<区域名称> 设置默认得到区域,使其永久生效
--get-active-zones 显示当前正在使用的区域与网卡名称
--get-zones 显示总共可用的区域
--get-zone= 新增区域
services服务相关命令
--get-services 列出服务列表中所有可管理的服务
--add-service= 设置默认区域允许该填加服务的流量
--remove-service= 设置默认区域不允许该删除服务的流量
Port端口相关指令
--add-port=<端口号/协议> 设置默认区域允许该填加端口的流量
--remove-port=<端口号/协议 置默认区域不允许该删除端口的流量
Interface网站相关指令
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
其他相关指令
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--reload 让“永久生效”的配置规则立即生效,并覆盖当前的哦诶之规则

防火墙基本操作

# 获取当前的默认区域
[root@m01 ~]# firewall-cmd --get-default-zone
public
# 设置默认的区域
[root@m01 ~]# firewall-cmd --set-default-zone=drop
success      //表示成功
[root@m01 ~]# firewall-cmd --get-default-zone
drop
# 查看所有的可用区域
[root@m01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 新增区域
[root@m01 ~]# firewall-cmd --new-zone=wyd --permanent
success
[root@m01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
#(看不到新增区域是因为没有重新加载)
## 重新加载
[root@m01 ~]# firewall-cmd --reload
success
## 重新查看所有区域即可查看
[root@m01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work wyd
# 查看支持的服务名
[root@m01 ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin
bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condorcollector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm
dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication
freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http
https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin
kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls
managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3
nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole
pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp
pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba sambaclient sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync
squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftpclient tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https
xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
## 添加服务入站规则
[root@m01 ~]# firewall-cmd --add-service=https
success
# 添加https服务允许入站 是临时生效 重启防火墙后会失效
[root@m01 ~]# firewall-cmd --add-service=http
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client https
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
# 添加https服务允梅入栈 永久生效 但是必须要重启防火墙才可以生效
[root@m01 ~]# firewall-cmd --add-service=https --permanent
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
[root@m01 ~]# firewall-cmd --reload
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client http https
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
# 删除服务临时生效
[root@m01 ~]# firewall-cmd --remove-service=http
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client https
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
[root@m01 ~]# firewall-cmd --reload
success
[root@m01 ~]# firewall-cmd --list-all (查看)
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client http https
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
# 删除服务永久生效
[root@m01 ~]# firewall-cmd --remove-service=https --permanent
success
[root@m01 ~]# firewall-cmd --reload
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
# 放行6379端口 永久生效
[root@m01 ~]# firewall-cmd --add-port=6379/tcp --permanent
success
[root@m01 ~]# firewall-cmd --reload
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client
    ports: 6379/tcp
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
# 删除端口入站规则
[root@m01 ~]# firewall-cmd --remove-port=6379/tcp --permanent
success
[root@m01 ~]# firewall-cmd --reload
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client
    ports: 22/tcp
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
## 开启范围端口
firewall-cmd --add-port=6379/tcp --permanent

防火墙怎么添加网卡

# 防火墙添加网卡
# 增加eth0网卡到drop区域
firewall-cmd --add-interface=eth0 --zone=drop
# 查看
[root@m01 ~]# firewall-cmd --list-all --zone=drop
drop (active)
    target: DROP
    icmp-block-inversion: no
    interfaces: eth0
    sources:
    services:
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:

查看相关命令

# 查看当前默认区域的所有规则
firewall-cmd --list-all
[root@m01 ~]# firewall-cmd --list-all --zone=drop
drop (active)
    target: DROP
    icmp-block-inversion: no
    interfaces: eth0
    sources:
    services:
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
[root@m01 ~]# firewall-cmd --list-all --zone=trusted
trusted
    target: ACCEPT
    icmp-block-inversion: no
    interfaces:
    sources:
    services:
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
# 重新加载防火墙
[root@m01 ~]# firewall-cmd --reload     //配置解读
success
    public(actice) # 当前使用的区域
    target: default # 当前默认区域
    icmp-block-inversion: no # icmp模块没有开启
    interfaces: # 当前区域监听的网卡
    sources: # 来源
    services: ssh dhcpv6-client # 允许访问的服务
    ports: 22/tcp 1-7000/tcp # 允许访问的端口
    protocols: # 允许访问的协议
    masquerade: no # IP伪装 (只有内网IP地址的机器可以通过IP伪装上网)
    forward-ports: # 端口转发 端口映射80 172.16.1.51:8080
    source-ports: # 来源端口 来源谁
    icmp-blocks: # icmp快
    rich rules: # 富规则

案例

使用firewalld各个区域规则结合配置,调整默认public区域拒绝所有流量,但如果来源IP是10.0.0.0/24网段则允许

# 移除public区域的所有允许放行的规则
firewall-cmd --remove-service=ssh --remove-service=dhcpv6-client
# 将源IP网段加入到trusted区域中
firewall-cmd --add-source=10.0.0.0/24 -zone=trusted
[root@m01 ~]# firewall-cmd --list-all --zone=trusted
trusted (active)
    target: ACCEPT
    icmp-block-inversion: no
    interfaces:
    sources: 10.0.0.0/24
    services:
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:

查询public区域是否允许请求SSH HTTPS协议的流量

[root@m01 ~]# firewall-cmd --zone=public --query-service=https
no
# 添加https
[root@m01 ~]# firewall-cmd --add-service=https
[root@m01 ~]# firewall-cmd --zone=public --query-service=https
yes

防火墙放行自定义

#所有在防火墙里可放行的服务,都是有一个结尾为.xxml的文件为基础
ll /usr/lib/firewalld/services/
#添加需要的服务,如sersync
vim /usr/lib/firewalld/services/sersync.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>resync</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="874"/>
</service>
# 重新加载防火墙
firewall-cmd --reload
#添加
[root@m01 ~]# firewall-cmd --add-service=sersync
success
[root@m01 ~]# firewall-cmd --list-all
public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client sersync
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:

firewall做端口转发

web02 10.0.0.8:8888 -----> web01 10.0.0.7:80

# 端口转发公式
firewalld-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<
协议>:toport=<目标端口号>:toaddr=<目标IP地址>

- `firewall-cmd`: 这是一个用于管理firewalld防火墙配置的命令行工具。
- `--permanent`: 这是一个选项,表示所做的修改将永久生效,即在防火墙重新启动后仍然有效。
- `--zone=public`: 这是一个选项,指定要应用修改的区域是public区域。
- `--add-forward=port=8888:proto=tcp:toport=80:toaddr=10.0.0.7`: 这是添加一个端口转发规则的命令。
- `port=8888`: 指定要进行转发的源端口为8888。
- `proto=tcp`: 指定要进行转发的协议为TCP。
- `toport=80`: 指定转发后的目标端口为80。
- `toaddr=10.0.0.7`: 指定转发后的目标地址为10.0.0.7。
# web01
安装nginx
# nginx配置文件
server{
listen 80;
        server_name _;
    root /code;
    index index.html;
}
# web02
firewall-cmd --permanent --zone=public --add-forward-port=port=8888:proto=tcp:toport=80:toaddr=10.0.0.7
# 重新加载
firewall-cmd --reload
# 开启IP伪装
firewall-cmd --add-masquerade
# 浏览器访问
10.0.0.8:8888

防火墙富语言规则策略

firewalld中的富语言规则表示更细致,更详细的防火墙策略配置,他可以针对系统服务、端口号、原地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有的防火墙策略中也是最高的

# 针对ipv4 让他加载到ipv4
rule [family="ipv4|ipv6"]
# 来源的IP 10.0.0.0/255.255.255.0
source address="address[/mask]" [invert="True"]
# 就是服务名
service name="service name"
# 指定端口 指定协议 tcp/udp
port port="port value" protocol="tcp|udp"
# 指定协议
protocol value="protocol value"
# 做端口转发
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
# accept 前面的规则都允许放心
# drop 前面的规则都不允许放行
# reject 能看到端口但是rejecj你能看到我开了端口,但是就是不给你连
accept | reject [type="reject type"] | drop
----------------------------------------------------------------------------------------------------
#1、比如允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问22端口
xshell能不能连上服务器 不能
172.16.1.0 能连服务器 不能访问网站
[root@web02 ~]# firewall-cmd --remove-service=ssh --remove-service=dhcpv6-client --permanent
success
[root@web02 ~]# firewall-cmd --reload
success
#语法:
新增: firewall-cmd --add-rich-rule='规则'
删除: firewall-cmd --remove-rich-rule='规则'
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address='10.0.0.1' service name=http accept'
success
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address='172.16.1.0/24' service name=ssh accept'
success
#验证
telnet 10.0.0.8 80
ssh 172.16.1.8
#富语言规则相关命令
--add-rich-rule='<RULE>' #在指定的区域添加一条富语言规则
--remove-rich-rule='<RULE>' #在指定的区删除一条富语言规则
--query-rich-rule='<RULE>' #找到规则返回0,找不到返回1
--list-rich-rules #列出指定区里的所有富语言规则
----------------------------------------------------------------------------------------------------
#.2、默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop'

#3、使用firewalld,允许所有人能访问http,https服务,但只有10.0.0.1主机可以访问ssh服务
[root@m01 ~]# firewall-cmd --remove-service=ssh
[root@m01 ~]# firewall-cmd --add-service={http,https}
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=ssh accept'

#4、当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.7的22端口
[root@m01 ~]# firewall-cmd --add-masquerade
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.7"'

#.5、查看设定的规则,如果没有添加--permanent参数则重启firewalld会失效。富规则按先后顺序匹配,按先匹配到的规则生效
[root@m01 ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.0.0.1" service name="http" accept
rule family="ipv4" source address="172.16.1.0/24" service name="ssh" drop
rule family="ipv4" source address="10.0.0.1" service name="ssh" accept
rule family="ipv4" source address="10.0.0.1" forward-port port="5555"
protocol="tcp" to-port="22" to-addr="172.16.1.9"

关闭外网通过防火墙上网

环境:m01 10.0.0.61 客户端:web03 172.16.1.8

###外网服务器上
#1.启动防火墙
[root@m01 ~]# systemctl start firewalld
# 防火墙开启IP伪装
[root@m01 ~]# firewall-cmd --add-masquerade --permanent
[root@m01 ~]# firewall-cmd --reload
#2.开启内核转发
[root@m01 ~]# vim /etc/sysctl.conf
 net.ipv4.ip_forward = 1
#3.完成后,使其生效
[root@m01 ~]# sysctl -p
#4.开启流量转发
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/255.255.255.0 -j SNAT --to 10.0.0.61
#5.开启IP伪装
[root@m01 ~]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

###内网客户端服务器上
#1.编辑eth1网卡,添加网关
[root@web03 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61                    
#2.配置DNS
[root@web03 ~]# cat /etc/resolv.conf
nameserver 223.5.5.5
#3.关闭eth0;重启eth1
[root@web03 ~]# ifdown eth0
[root@web03 ~]# ifdown eth1
[root@web03 ~]# ifup eth1
#4.查看网关
[root@web03 ~]# route -n
172.16.1.61
#5.检测网络
[root@web03 ~]# ping www.baidu.com
0