缘由

最近看到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 的文档以获取更多详细信息和示例。

ubuntu 防火墙命令整理

1、防火墙状态及规则

1.1、查看防火墙状态:firewall-cmd --state

[root@localhost ~]# firewall-cmd --state
running
[root@localhost ~]#

1.2、查看防火墙:firewall-cmd --list-all

[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http
ports: 999/tcp
protocols:

# ...

1.3、更新防火墙规则:firewall-cmd --reload

[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]#

2、端口

2.1、临时增加(reload之后消失):不需要reload

[root@localhost ~]# firewall-cmd --add-port=999/tcp
success

2.2、永久增加:reload后生效

[root@localhost ~]# firewall-cmd --permanent --add-port=999/tcp
success

2.3、临时删除端口:reload后消失

[root@localhost ~]# firewall-cmd --remove-port=999/tcp
success

2.4、永久删除端口:reload后生效

[root@localhost ~]# firewall-cmd --permanent --remove-port=999/tcp
success

2.5、查询端口

[root@localhost ~]# firewall-cmd --query-port=999/tcp
yes
[root@localhost ~]#

2.6、查看所有放行的端口:

firewall-cmd --list-ports

3、IP

3.1、防火墙添加允许访问的IP

注:添加允许访问的IP后,需要reload才能生效

[root@localhost logs]# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="10.45.2.35" accept' --permanent
success
[root@localhost logs]# firewall-cmd  --reload
success

4、服务

4.1、防火墙服务的状态

[root@localhost ~]# systemctl status firewalld.service

4.2、启动/关闭防火墙

[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl start firewalld.service

4.3、获取所有支持的服务

[root@localhost ~]# firewall-cmd --get-services

4.4、增加服务(临时增加)

[root@localhost ~]# firewall-cmd --add-service=https
success

4.5、删除服务(临时删除)

[root@localhost ~]# firewall-cmd --query-service=https
yes

4.6、查询服务

[root@localhost ~]# firewall-cmd --query-service=https
yes
[root@localhost ~]#

4.7、增加服务(永久)

[root@localhost bin]# firewall-cmd --permanent --add-service=http
success

4.8、删除服务(永久)

[root@localhost bin]# firewall-cmd --permanent --remove-service=ssh
success
Last modification:March 9, 2024
如果觉得我的文章对你有用,请帮忙点一下上面的广告