我的linux学习之路(第十一节)
< 返回列表时间: 2020-03-08来源:OSCHINA
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
( 一) iptables 与Firewalld 防火墙
防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制。在RHEL7系统中,firewalld防火墙取代了iptables防火墙。iptables与firewalld都不是真正的防火墙,而是一种服务,是用来定义防火墙策略的防火墙管理工具。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。

1.1 、iptables
iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下: 在进行路由选择前处理数据包(PREROUTING); 即SNAT源地址转换 。 处理流入的数据包(INPUT); WAN à LAN 。 处理流出的数据包(OUTPUT); LAN à WAN 。 处理转发的数据包(FORWARD); 在进行路由选择后处理数据包(POSTROUTING); 即DNAT目的地址转换 。
ACCEPT( 允许流量通过)、REJECT(告诉对方拒绝流量通过)、LOG(记录日志信息)、DROP(不告诉对方拒绝流量通过)。其中,DROP(不告诉对方拒绝流量通过)直接将流量丢弃而且不响应;REJECT(告诉对方拒绝流量通过)则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。
iptables 是一款基于 命令 行的防火墙策略管理工具。iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。
iptables 中常用的参数以及作用:
参数 作用
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链的 末尾 加入新规则
-I num 在规则链的 头部 加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如TCP、UDP、ICMP
--dport num --sport num
匹配目标端口号,格式: --dport num 或--dport= num 匹配来源端口号,格式: --sport num 或--sport= num

[root @linuxprobe ~]# iptables -L
// 查看规则链
[root @linuxprobe ~]# iptables -F
// 清空规则链
[root @linuxprobe ~]# iptables -P INPUT DROP
// 设置INPUT规则链的默认策略为拒绝DROP,其它拒绝的策略动作使用REJECT。使用-P参数后不再使用-j参数。
[root @linuxprobe ~]# iptables -I INPUT -p icmp -j ACCEPT
// 向INPUT规则链中添加允许ICMP流量进入的策略规则
[root @linuxprobe ~]# iptables -D INPUT 2
// 删除INPUT规则链中的策略(策略编号2)
[root@linuxprobe ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport=22 -j ACCEPT
[root@linuxprobe ~]# iptables -I INPUT -p tcp --dport=22 -j REJECT
// 将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量。
--dport 后面可用=号跟端口号,也可用空格跟端口号。

[root@linuxprobe ~]# iptables -I INPUT -s 192.168.20.0/24 -d 192.168.10.10 -p tcp --dport=80 -j REJECT
// 向INPUT规则链中添加拒绝192.168.20.0/24子网访问192.168.10.10的80端口(Web服务)的策略规则。
[root@linuxprobe ~]# iptables -A INPUT -p tcp --dport=1000:2000 -j REJECT
[root@linuxprobe ~]# iptables -A INPUT -p udp --dport=1000:2000 -j REJECT
// 向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则。如果要限制某个端口的全部流量则需要配置匹配TCP和UDP的流量。
注意:iptables命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略 永久生效 , 还要执行保存命令:[root@linuxprobe ~]# service iptables save

1.2 、firewalld
RHEL7 系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。
firewall-cmd 是firewalld防火墙配置管理工具的CLI(命令行界面)版本。
firewall-config 是firewalld防火墙配置管理工具的GUI(图形用户界面)版本。
区域(zone)是firewalld预先准备的防火墙策略集合(或策略模板)。用户可以根据场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
firewalld 中常用的区域名称及策略规则 ( 匹配从本机外部INPUT进入网卡的流量) : public :默认当前正在使用的区域。 注:public、DMZ、external、internal 区域只允许选中的服务通过。 trusted :默认允许所有流入的流量(没有开放任何服务 )。 drop :默认拒绝所有流入的流量(任何流入网络的包都被丢弃,不作出任何响应,只允许流出的网络连接。即使开放了某些服务(比如http),这些服务的数据也是不允许通过)。
说明:默认情况下是允许所有类型的ICMP通过 。

1.2.1 、firewalld防火墙配置管理工具CLI(命令行界面):firewall-cmd
firewall-cmd 命令中使用的参数以及作用:
参数 作用
--get-default-zone 查询默认的区域名称
--set-default-zone=< 区域名称> 设置默认的区域,使其永久生效
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--add-source= 将源自此IP或子网的流量导向指定的区域
--remove-source= 不再将源自此IP或子网的流量导向某个指定区域
--add-interface=< 网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=< 网卡名称> 将某个网卡与区域进行关联,与“--zone= 区域 ”结合使用。
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
--add-service=< 服务名> 设置默认区域允许该服务的流量
--add-port=< 端口号/协议> 设置默认区域允许该端口的流量
--remove-service=< 服务名> 设置默认区域不再允许该服务的流量
--remove-port=< 端口号/协议> 设置默认区域不再允许该端口的流量
--reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
--panic-on --panic-off
开启应急状况模式 关闭应急状况模式

firewalld 配置的防火墙策略默认为 运行时(Runtime)模式 ,又称为 当前生效模式 ,而且随着 系统的重启会失效 。如果想让配置策略一直存在,就需要使用 永久(Permanent)模式 了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效,参 需要系统重启之后才能自动永久生效 。让配置的策略 立即生效 ,需要手动执行 firewall-cmd --reload 命令。
// 执行 yum install firewalld命令进行安装
// 启动 :systemctl start firewalld
// 关闭:systemctl stop firewalld
// 查看状态:systemctl status firewalld
// 查看状态:firewall-cmd --state
// 开机启用:systemctl enable firewalld
// 开机禁用:systemctl disable firewalld
//firewalld 的默认区域配置文件位置在 /etc/firewalld/zones/ 下的.xml文件中 。
[root@linuxprobe ~]# firewall-cmd --state
running
// 查看firewall的运行状态
[root@linuxprobe ~]# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sun 2020-03-08 11:20:14 CST; 22min ago
Main PID: 1034 (firewalld)
CGroup: /system.slice/firewalld.service
└─1034 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Mar 08 11:20:13 linuxprobe.com systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 08 11:20:14 linuxprobe.com systemd[1]: Started firewalld - dynamic firewall daemon.
// 查看firewall服务状态

===========================================================
[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
// 设置firewalld服务默认所使用的区域。
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
// 查看firewalld服务默认所使用的区域。
===========================================================
[root@linuxprobe ~]# firewall-cmd --set-default-zone=trusted
success
// 设置firewalld服务当前所使用的区域为trusted。
[root@linuxprobe ~]# firewall-cmd --get-default-zone
trusted
//trusted 区域设置成功。


===========================================================
[root@linuxprobe ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@linuxprobe ~]# firewall-cmd --get-services
amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@linuxprobe ~]# firewall-cmd --get-active-zones
public
interfaces: eno16777736
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-source=192.168.20.0/24
Success

[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-source=192.168.20.0/24
success
===========================================================
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777736
external
// 查询eno16777738网卡在firewalld服务中的区域。
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --change-interface=eno16777736
success
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777736
external
[root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777736
public
// 把firewalld服务中eno16777736网卡的默认区域external修改为public,需要在系统重启后生效。分别查看当前与永久模式下的区域名称。

===========================================================
[root@linuxprobe ~]# firewall-cmd --panic-on
[root@linuxprobe ~]# firewall-cmd --panic-off
// 启动或关闭firewalld防火墙服务的应急状况模式,阻断一切 进出流量 的网络连接(当远程控制服务器时请慎用)。
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=http
Success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https
success
// 把firewalld服务中请求http和https协议的流量设置为永久允许。
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http
no
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
no
// 未立即生效前 查询public区域是否允许请求 http 和https协议 的流量。
[root@linuxprobe ~]# firewall-cmd --reload
Success
// 立即生效
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http
Yes
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
yes
// 立即生效前 查询public区域是否允许请求 http 和https协议 的流量。

===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@linuxprobe ~]# firewall-cmd --reload
Success
// 把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效。
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-port=8080-8090/tcp
success
[root@linuxprobe ~]# firewall-cmd --reload
success
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports
8080-8090/tcp
// 把在firewalld服务中访问8080至8090端口的流量策略设置为允许,且立即生效。

===========================================================
端口转发(访问端口A时转发到端口B)配置:
命令格式:firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
[root@linuxprobe ~]# firewall-cmd --permanent --zone= public --add-forward-port=port= 888 :proto= tcp :toport= 22 :toaddr= 192.168.10.10
success
[root@linuxprobe ~]# firewall-cmd --reload
success
// 把原本访问192.168.10.10主机888端口的流量转发到22端口,要求当前和长期均有效,并立即生效。
在客户端使用ssh命令尝试访问192.168.10.10主机的888端口:
[root@linuxprobe ~]#ssh -p 888 192.168.10.10
===========================================================
firewalld 富规则(优先级在所有的防火墙策略中是最高的):
firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务/端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" destination address="192.168.10.10" service name="ssh" accept log level=warning audit"
success
[root@linuxprobe ~]# firewall-cmd --reload
success
// 在firewalld服务中配置一条富规则,使其允许192.168.10.0/24网段的所有用户访问192.168.10.10主机的ssh服务(22端口),同时记录告警日志并审计。

中英文对比
1.2.2 、firewalld防火墙配置管理工具GUI(图形用户界面):firewall-config
[root@linuxprobe ~]# firewall-config

① : 选择运行时(Runtime)模式或永久(Permanent)模式配置。 如要使配置的策略立即生效,可通过option菜单中的Reload Firewalld实现。
② :可选的策略集合区域(策略或区域模板)列表。
③ :常用的系统服务列表, 可在永久(Permanent)模式下自定义服务(先定义名称,在名称中再添加端口和协议)。
④ :当前正在使用的区域, 可通过option菜单中的Change Default Zone进行修改。
⑤ :管理 ( 选择为允许、不选为拒绝) 当前使用区域被选中的服务。与 ⑫ 对应。
⑥ :管理 ( 自定义) 当前被选中区域中的端口。
⑦ :开启或关闭 SNAT( 源地址转换) 协议技术。

⑧ :设置端口转发策略, 即客户端访问外部虚拟端口A转发到内部真实端口B 。
⑨ :控制请求icmp服务的流量。
⑩ :管理防火墙的富规则。 如:服务或端口、协议、端口转发、SNAT源地址转换,ACCEPT允许或REJECT拒绝的动作,源和目标地址,是否记录日志及日志的级别,是否审计。
⑪ :管理网卡设备。 把网卡与区域(策略)进行绑定。
⑫ :被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与该服务相关的流量。与 ⑤ 对应。
⑬ :firewall-config工具的运行状态。默认区域( 可通过option菜单中的Change Default Zone进行修改 ),应急状况模式(Panic Mode)是否启用(enabled或disabled)。
热门排行