关于firewalld没有开启22端口但22端口可以被访问的问题

本文最后更新于 2024年5月16日。

缘由

最近看到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连接。这里不再展开叙述。

结论

防火墙既可以通过端口也可以通过服务来控制访问。

补充

实际上,不仅是上面提到的两种方式,常用的方式说明如下:

  1. 通过端口和服务:可以使用 firewalld 控制特定端口或服务的访问权限。你可以允许或拒绝对特定端口或预定义服务的访问。例如,允许 SSH 访问的命令如下所示:

    firewall-cmd --zone=public --add-service=ssh
    

    或者,允许特定端口的访问,例如允许端口 8080 的命令如下:

    firewall-cmd --zone=public --add-port=8080/tcp
    
  2. 通过 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
    
  3. 通过网络接口:你可以使用 firewalld 控制特定网络接口的访问权限。这对于限制特定接口的入站或出站流量很有用。以下是一个将规则应用于特定接口的示例:

    firewall-cmd --zone=public --add-interface=eth0
    
  4. 通过富规则(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 命令重新加载配置,使更改生效。

  1. 服务和端口组:除了单独指定端口,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 添加到该端口组中。

  2. 包过滤:Firewalld 允许你根据特定的网络数据包属性进行过滤和控制。你可以使用 --add-filter 参数来指定过滤规则。例如,以下命令将允许 ICMP Echo 请求通过:

    firewall-cmd --zone=public --add-filter=icmp_echo_request
    

    你还可以根据其他网络数据包属性进行过滤,如源/目标 MAC 地址、IP 协议、TTL 等。

  3. 地址转换: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过滤

防火墙可以根据URL地址对网络流量进行过滤,例如禁止访问某些URL地址。

应用程序控制

防火墙可以控制网络上各种应用程序的访问,例如限制某些应用程序的访问权限。

端口和协议控制

防火墙可以控制端口和协议的访问权限,例如只允许特定的端口和协议访问网络。

VPN访问控制

防火墙可以控制VPN用户的访问权限,只允许授权的用户访问网络。