coder7475 2024-08-12
Linux 防火墙
所有现代 Linux 防火墙解决方案都使用 Netfilter 子系统。
Netfilter 是一个数据包过滤系统,用于控制进入服务器或通过服务器的网络流量的命运。
系统管理员使用用户空间接口工具 iptables 来设置规则,以管理传入的流量。
iptables 极其高效且高度可定制,但配置起来可能较为复杂。
开发者为此开发了多个前端工具,帮助用户在不编写冗长 iptables 规则的情况下控制防火墙。例如:ufw、firewalld 等。
ufw - Uncomplicated Firewall(简易防火墙)
- Debian 系发行版(如 Ubuntu、Linux Mint 等)的默认防火墙工具。
- 提供一种用户友好的方式来创建基于主机的 IPv4 或 IPv6 防火墙。
- ufw 默认初始状态为禁用。
启用或禁用 ufw
启用 ufw:
sudo ufw enable
禁用 ufw:
sudo ufw disable
查看状态
查看防火墙状态:
sudo ufw status
以编号格式显示:
sudo ufw status numbered
显示所有已添加的规则:
ufw show added
UFW 默认策略
理解 ufw 的默认策略对安全至关重要。
运行以下命令:
sudo ufw status verbose
输出示例:
# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
44 DENY IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
44 (v6) DENY IN Anywhere (v6)
输出解释:
- deny (incoming):确保在你显式添加允许规则之前,外部系统无法连接到你的机器。
- allow (outgoing):表示所有出站请求都被允许。此设置有助于正常运行
apt install、wget、ping等命令。但若要提高服务器安全性,建议将默认出站策略改为拒绝,然后仅允许特定 IP 或域名。 - disabled (routed):表示所有路由功能被禁用,转发被阻止。如果你的机器不是用作路由器,这是一个良好的默认设置。
在 Action 列中,除了 ALLOW IN 和 DENY IN,也存在 ALLOW OUT 和 DENY OUT。
重新加载防火墙以应用新规则
如果 UFW 已启用,修改规则后需要重新加载才能生效。
你可以通过先禁用再启用的方式重启 UFW:
sudo ufw disable && sudo ufw enable
或者直接重载规则:
sudo ufw reload
重置所有 ufw 规则
ufw reset
如何添加 ufw 规则
语法:
sudo ufw allow <端口>/<可选: 协议>
sudo ufw deny <端口>/<可选: 协议>
示例:
打开端口 22:
sudo ufw allow 22关闭已打开的端口 22:
sudo ufw deny 22允许 SSH 连接:
ufw allow ssh允许 HTTP 和 HTTPS:
sudo ufw allow http && sudo ufw allow https
使用编号格式添加规则
先查看带编号的规则列表:
sudo ufw status numbered
然后在指定位置插入规则(例如在第 1 条插入允许 80 端口):
sudo ufw insert 1 allow 80
删除规则
删除某条规则(例如删除 deny 22):
sudo ufw delete deny 22
检查当前正在运行的开放端口
如果尚未安装 net-tools,请先安装:
sudo apt install net-tools
显示当前所有正在监听的端口:
netstat -tulpn
进一步检查网络连接,可使用以下命令:
显示所有网络连接的详细信息:
netstat -anp列出打开的网络文件:
lsof -i显示套接字统计和网络连接(
ss是netstat的现代替代):ss显示所有 TCP 套接字:
ss -t显示所有 UDP 套接字:
ss -u显示所有监听中的套接字:
ss -l显示所有套接字:
ss -a显示套接字摘要统计:
ss -s显示使用套接字的进程:
ss -p以数字形式显示地址(而非主机名):
ss -n列出所有防火墙规则(含 IP 和端口号):
iptables -L -n查看系统 DNS 配置信息:
cat /etc/resolv.conf
允许特定主机访问
可以允许特定主机或网络访问某个端口。
示例:允许来自主机 192.168.0.2 的 SSH 访问本机任意 IP:
sudo ufw allow proto tcp from 192.168.0.2 to any port 22
允许整个子网访问 SSH:
sudo ufw allow proto tcp from 192.168.0.2/24 to any port 22
模拟添加规则(Dry Run)
若想预览添加规则的效果,可使用 --dry-run 选项:
sudo ufw --dry-run allow http
配置支持 IPv6
编辑配置文件(使用 nano 编辑器):
sudo nano /etc/default/ufw
将 IPV6 的值改为 yes:
IPV6=yes
ufw 应用程序集成
列出所有可用的应用程序配置文件:
sudo ufw app list
语法:
sudo ufw allow <应用程序名称>
sudo ufw deny <应用程序名称>
例如,允许 OpenSSH:
sudo ufw allow "OpenSSH"
给新手的特别提示
启用防火墙后,在未添加 SSH 允许规则前,切勿断开远程服务器连接!
否则你将无法再次登录自己的服务器。
UFW 日志记录(Logging)
检查日志是否启用:
sudo ufw status verbose
启用日志记录:
sudo ufw logging on
UFW 防火墙日志级别(共 5 级):
- off:禁用日志记录。
- low:记录与当前防火墙规则不匹配的被阻止数据包,以及显式标记为记录的规则日志。
- medium:除
low级别内容外,还包括无效数据包、新连接的日志,以及通过速率限制记录的日志。 - high:包含带速率限制和不带速率限制的数据包日志。
- full:与
high类似,但不进行速率限制。
更改日志级别
语法:
sudo ufw logging <日志级别>
例如,设为 medium 级别:
sudo ufw logging medium
⚠️ 注意:原文此处有笔误(写成了
logging_level),正确应为具体级别名称,如medium。
查看日志
查看完整日志:
sudo less /var/log/ufw.log实时查看日志最后 10 行(持续跟踪):
sudo tail -f /var/log/ufw.log