Lesson 9 防火墙 iptables 和 firewalld
防火墙
firewalld iptables:防火墙的工具,用于修改防火墙防御策略。
netfilter :真正实施策略的防火墙主题。
iptables
安装
[root@server ~]# dnf install iptables-nft-services -y
开启iptables服务前要关闭防火墙 两个只能存在一个(iptables 与 firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,即只是一种服务,而真正使用规则干活的是内核的netfilter,当前Linux 系统中存在多个防火墙管理工具,旨在方便运维人员管理 Linux 系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。)(Euler中默认使用的是firewalld,且与iptables之间有冲突,如果需要使用 iptables 需要先停止firewalld再进行安装: )
# 查看过滤表详情 (完整的写法 iptables -t filter -nxvL --line-numbers)n显示源 x取消单位 v详细信息 L写在最后列出所有规则
[root@server ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
....# -n 显示源 -v 详细信息 -x 自动转换为KB\MB等单位 -L写在最后列出所有规则 --line 增加行号# num:规则的编号(行号)
# pkts:数据包的数量
# bytes:数据包的字节数
# target:动作(放行、拒绝)
# port:端口
# in:入站的网卡
# out:出站网卡
# 添加插入 -A -I
# 如果要在列表中末尾添加新规则使用 -A
[root@server ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@server ~]# iptables -nL --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
....
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80Chain FORWARD (policy ACCEPT)
....# 插入一条规则 允许任意ip 访问80端口
[root@Server ~]# iptables (-t filter)-I INPUT 5 -p tcp --dport 80 -j ACCEPT# 实现以上命令后 无需关闭防火墙即可访问 nginx 默认发布目录
# 删除一条策略 -D 表名 -行号
# 删除一条策略
[root@Server ~]# iptables -D INPUT 6
[root@Server ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
# 修改一条规则 -R
# 修改一条规则
[root@Server ~]# iptables -R INPUT 6 -p all -j ACCEPT
[root@Server ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
# -F 清空表中所有规则(内存中)(F:flush是“冲洗、冲掉”的意思)
# -F 清空表中所有规则(内存中)
[root@Server ~]# iptables -F
[root@Server ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destinationChain FORWARD (policy ACCEPT)
num target prot opt source destinationChain OUTPUT (policy ACCEPT)
num target prot opt source destination
# 保存设置(将自定义的规则保存到配置文件中),否则重启系统后恢复默认设置
[root@server ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
# 保存设置,否则重启系统后恢复默认设置
# 注意:不能使用systemctl save iptables 命令# 查看
[root@server ~]# vim /etc/sysconfig/iptables
# iptables的规则配置文件保存在 /etc/sysconfig/iptables
# 如果要将自定义的规则保存到配置文件中 调用一下命令
[root@Server ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
练习
# 不允许ssh远程登录
[root@Server ~]# iptables -R INPUT 4 -p tcp --dport 22 -j REJECT
[root@Server ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0# 允许172.25.254.200使用ssh远程登录
[root@Server ~]# iptables -A INPUT -s 172.25.254.200 -p tcp --dport 22 -j ACCEPT
[root@Server ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 172.25.254.200 0.0.0.0/0 tcp dpt:22Chain FORWARD (policy ACCEPT)
num target prot opt source destinationChain OUTPUT (policy ACCEPT)
num target prot opt source destination
# 拒绝所有其他ip登录
[root@Server ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
[root@Server ~]# Read from remote host 172.25.254.100: Operation timed out
Connection to 172.25.254.100 closed.
client_loop: send disconnect: Broken pipe# 允许非172.25.254.200的ip登录
[root@Server ~]# iptables -A INPUT -s 172.25.254.200 -p tcp --dport 22 -j REJECT
[root@Server ~]# iptables -A INPUT ! -s 172.25.254.200 -p tcp --dport 22 -j ACCEPT
[root@Server ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- !172.25.254.200 0.0.0.0/0 tcp dpt:22
firewalld
firewalld 配置文件
/etc/firewalld:配置文件主区(用户配置文件,可以自行修改)
/lib/firewalld:预先定义好服务文件(系统配置文件,尽量不要修改)
firewalld的zone
根据信任级别分成9个默认zone
区域 | 默认策略规则 |
---|---|
trusted(信任区域) | 允许所有的传入流量 |
home (家庭区域) | 允许与SSH、MDNS(多播DNS)、IPP客户端、samba-客户端、DHCPv6客户端、cockpit(服务器管理工具)服务匹配的流量传入,其余拒绝 |
internal (内部区域) | 默认值时与homel区域相同 |
work(工作区域) | 允许 与SSH、DHCPv6客户端、cockpit服务匹配的流量传入,其余拒绝、 |
public (公共区域) | 允许与SSH或DHCPv6客户端、cockpit服务匹配的流量传入,其余拒绝 (是默认区域) |
external(外部区域) | 允许与SSH服务匹配的流量传入,其余拒绝 |
dmz (隔离区域) | 也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用,允许与SSH服务匹配的流量传入,其余拒绝 |
block (阻塞区域) | 拒绝所有传入流量,返回icmp-host-prohibited消息 |
drop (丢去区域) | 丢弃所有传入流量,且没有任何回复,类似DROP |
# 查看防火墙状态
[root@Server ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: enp0s5sources:services: cockpit dhcpv6-client sshports:protocols:forward: yesmasquerade: noforward-ports:source-ports:icmp-blocks:rich rules:
# 获取防火墙的区域信息
[root@Server ~]# firewall-cmd --get-default-zone
public
# 查看系统中有哪些防御区域
[root@Server ~]# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
# 设置防火墙的区域
[root@Server ~]# firewall-cmd --set-default-zone=dmz
success
[root@Server ~]# firewall-cmd --list-all
dmz (active)target: defaulticmp-block-inversion: nointerfaces: enp0s5sources:services: sshports:protocols:forward: yesmasquerade: noforward-ports:source-ports:icmp-blocks:rich rules:
服务文件保存的目录
# /lib/firewalld/zones
# 制作自定义的服务 # 需重启火墙获取新增服务文件
[root@Server services]# cp http.xml nginx.xml
[root@Server services]# vim nginx.xml
....
<?xml version="1.0" encoding="utf-8"?>
<service><short>Nginx</short><description>this is a russian httpd</description><port protocol="tcp" port="80"/><port protocol="tcp" port="443"/><port protocol="tcp" port="7777"/>
</service>
....
# 添加自定义的服务
[root@Server services]# firewall-cmd --add-service=nginx
success
练习
# 添加ip规则
[root@Server services]# firewall-cmd --add-source=172.25.254.200 --zone=dmz
success
# 移除ip规则
[root@Server services]# firewall-cmd --remove-source=172.25.254.200
success
[root@Server services]# firewall-cmd --get-active-zones
publicinterfaces: enp0s5
# 移除网卡
[root@Server services]# firewall-cmd --remove-interface=enp0s5
success
# 添加网卡到指定区域
[root@Server services]# firewall-cmd --add-interface=enp0s5 --zone=dmz
success
# 修改网卡到指定区域
[root@Server services]# firewall-cmd --change-interface=enp0s5 --zone=public
success# 添加允许端口
[root@Server services]# firewall-cmd --add-port=7777/tcp
success# 移除允许端口
[root@Server services]# firewall-cmd --remove-port=7777/tcp
success