缘由
最近看到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