缘由
最近看到vps有上万条登陆失败记录,感觉很危险,想设置一下防火墙。但是看到防火墙没有开启22端口,就好奇既然没有开启为什么能访问。
分析问题
一查才知道是防火墙开启的是ssh
服务。
查询记录如下,虽然port
项目下没有22
端口,但是在services
下有ssh
服务。所以firewalld
是允许了ssh
服务通过防火墙,而ssh
服务默认是22
端口,所以能正常使用ssh
。
可以通过单独的命令查询防火墙开启的服务
firewall-cmd --list-services
操作记录如下:
[host]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports: 80/tcp 443/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[host]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
[host]#
其他验证
注意:除非你有其他方式设置ssh访问权限,否则不要尝试下面内容,否则可能连不上vps了。
关闭ssh服务验证
如果我在防火墙上关闭ssh服务,理论上应该就无法连接ssh了,下面进行验证。
1、关闭ssh服务
firewall-cmd --remove-service=ssh --permanent
2、随后重新加载配置文件
firewall-cmd --reload
执行 firewall-cmd reload
命令可以重新加载 firewalld 的配置文件,使新的规则生效。这个命令会重新加载防火墙配置,但不会中断当前的连接。在重新加载配置后,防火墙将使用更新后的规则进行进一步的连接处理。
操作记录如下:
[host]# firewall-cmd --remove-service=ssh --permanent
success
[host]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
[host]# firewall-cmd --reload
success
[host]# firewall-cmd --list-services
cockpit dhcpv6-client
[host]#
3、现在就连接不上ssh服务了。
我用了两种验证方式,分别是telnet工具和使用vscode进行ssh连接。这里不再展开叙述。
开启端口白名单验证
如果我在防火墙上开启端口白名单,理论上应该就可以连接ssh了,下面进行验证。
1、我通过管理面板添加白名单
2、查询如下,可以看出已经对固定的ip放行了
[host]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="223.104.38.72" port port="22" protocol="tcp" accept
rule family="ipv4" source address="117.136.38.62" port port="22" protocol="tcp" accept
3、现在可以正常连接了。
我用了两种验证方式,分别是telnet工具和使用vscode进行ssh连接。这里不再展开叙述。
结论
防火墙既可以通过端口也可以通过服务来控制访问。
补充
实际上,不仅是上面提到的两种方式,常用的方式说明如下:
-
通过端口和服务:可以使用 firewalld 控制特定端口或服务的访问权限。你可以允许或拒绝对特定端口或预定义服务的访问。例如,允许 SSH 访问的命令如下所示:
firewall-cmd --zone=public --add-service=ssh
或者,允许特定端口的访问,例如允许端口 8080 的命令如下:
firewall-cmd --zone=public --add-port=8080/tcp
-
通过 IP 地址或 IP 范围:你可以使用 firewalld 控制特定 IP 地址或 IP 范围的访问。可以允许或拒绝对特定 IP 地址的访问。以下是一个允许特定 IP 地址访问的示例:
firewall-cmd --zone=public --add-source=192.168.1.100
或者,允许特定 IP 范围的访问,例如允许 192.168.1.0/24 网络的命令如下:
firewall-cmd --zone=public --add-source=192.168.1.0/24
-
通过网络接口:你可以使用 firewalld 控制特定网络接口的访问权限。这对于限制特定接口的入站或出站流量很有用。以下是一个将规则应用于特定接口的示例:
firewall-cmd --zone=public --add-interface=eth0
-
通过富规则(Rich Rules):Firewalld 还支持使用富规则来定义更复杂和灵活的访问控制。通过富规则,你可以基于多个条件(例如端口、IP、协议等)定义高级规则。以下是一个添加富规则的示例:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
这些只是 firewalld 提供的一些常见方法,用于控制访问权限。你可以根据自己的需求和具体情况选择适当的方法来配置 firewalld。记得在修改规则后,使用 firewall-cmd --reload
命令重新加载配置,使更改生效。
-
服务和端口组:除了单独指定端口,Firewalld 还支持定义服务和端口组。服务是一组预定义的端口集合,可以通过名称来引用。端口组是用户自定义的端口集合,方便管理和重复使用。你可以使用这些服务和端口组来简化规则的配置。以下是一些示例:
-
允许 HTTP 服务访问:
firewall-cmd --zone=public --add-service=http
-
允许自定义的端口组访问:
firewall-cmd --zone=public --add-port=7000-8000/tcp
-
创建自定义的端口组:
firewall-cmd --permanent --new-portgroup=myports
firewall-cmd --permanent --port=8080/tcp --port=9000-9500/tcp --add-portgroup=myports
上述命令创建了名为 "myports" 的自定义端口组,并将端口 8080 和 9000-9500 添加到该端口组中。
-
包过滤:Firewalld 允许你根据特定的网络数据包属性进行过滤和控制。你可以使用 --add-filter
参数来指定过滤规则。例如,以下命令将允许 ICMP Echo 请求通过:
firewall-cmd --zone=public --add-filter=icmp_echo_request
你还可以根据其他网络数据包属性进行过滤,如源/目标 MAC 地址、IP 协议、TTL 等。
-
地址转换:Firewalld 支持地址转换功能,包括源地址转换(Source NAT)和目标地址转换(Destination NAT)。地址转换允许修改网络数据包的源或目标地址,以便实现网络地址重写。这对于在网络中进行 IP 地址映射或隐藏内部网络拓扑结构非常有用。
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
上述命令将接收到的 TCP 流量从公共端口 80 转发到内部地址 192.168.1.100 上的端口 8080。
Firewalld 提供了广泛的功能和选项,以满足不同的网络安全需求。你可以根据具体场景和需求选择适合的方法和配置选项。可以参考 Firewalld 的文档以获取更多详细信息和示例。
防火墙可以通过以下方式实现访问控制:
IP地址过滤
防火墙可以根据IP地址对网络流量进行过滤和控制,例如只允许特定的IP地址访问网络。
用户认证
防火墙可以对用户进行认证,只允许经过认证的用户访问网络。
URL过滤
防火墙可以