一些基本操作
在配置 Linux 防火墙规则之前需要先了解一些常用的操作命令,这些命令有助于我们了解服务器当前端口的使用情况,我们在进行防火墙规则配置或者是在日常使用和维护的时候这些命令被使用频率也比较高,所以写在前面。
# 查看服务器网络占用情况
sudo nethogs -a
# 查看正在被监听的端口
sudo netstat -ntlp
# 扫描一定范围内所有已放行的端口
sudo nmap -p 1-65535 localhost
# 查看当前系统上正在使用(或监听)端口 80 的进程,没有输出则表示端口未被占用
sudo lsof -i:80
# 关闭 PID 为 8422 的进程
sudo kill -9 8422
使用 ufw(ufw 是一个简化的防火墙管理工具)
查看防火墙状态
sudo ufw status
如果没有安装,可以通过以下命令来安装
sudo apt update
sudo apt install ufw
启用 ufw 或允许开机自启(执行前建议先配置好所需的规则)
注意:如果你在远程位置连接你的服务器,在启用 UFW 防火墙之前,你必须显式允许进来的 SSH 连接。否则,你将失去对服务器的连接。
允许 22 端口
sudo ufw allow 22/tcp
启动 ufw
sudo ufw enable
停止 ufw 或禁止开机自启
sudo ufw disable
检查某一端口是否开启
sudo ufw status | grep <端口号>
如果输出中包含相关信息,说明该端口被允许。
查看 ufw 所有规则
# 不显示序号
sudo ufw status verbose
# 显示序号
sudo ufw status numbered
删除 ufw 某条规则
# 删除第一条规则,这里的 1 就是上一步以带序号的方式查看规则时所对应的序号
sudo ufw delete 1
# 删除允许 789 端口使用 tcp 协议这条规则
sudo ufw delete allow 789/tcp
设置默认的入站流量规则为拒绝
sudo ufw default deny incoming
设置默认的入站流量规则为允许
sudo ufw default allow incoming
将所有出站流量设置为允许
sudo ufw allow outgoing
ufw 开启端口
sudo ufw allow <端口号1>,<端口号2>,<端口号3>/tcp # 可以选择放行 tcp 或 udp
sudo ufw allow <端口号1>,<端口号2>,<端口号3> # 同时放行 tcp 和 udp
ufw 关闭端口
# 关闭单个端口
sudo ufw deny <端口号>/tcp
# 阻止从 3300 到 3400 一系列端口使用 tcp 协议
sudo ufw deny 3300:3400/tcp
ufw 允许某 IP 地址的连接
# 允许指定 IP 连接到本机
sudo ufw allow from 8.8.8.8
# 允许指定 IP 连接到本机的 3333 端口
sudo ufw allow from 8.8.8.8 to any port 3333
ufw 拒绝某 IP 地址的连接
# 阻止指定 IP 连接到本机
sudo ufw deny from 8.8.8.8
# 阻止指定 IP 连接到本机的 3333 端口
sudo ufw deny from 8.8.8.8 to any port 3333
重新加载 ufw 规则
sudo ufw reload
重置 ufw 防火墙(慎用)
# 重置 ufw 防火墙,删除所有规则
sudo ufw reset
更多 ufw 用法可以参考 Debian/Ubuntu 系统中安装和配置 UFW -简单的防火墙
使用 nftables
查看 nftables 服务状态
sudo systemctl status nftables
如果没有安装 nftables,可以通过以下命令安装
sudo apt update
sudo apt install nftables
查看 nftables 规则
sudo nft list tables
启动 nftables 服务
sudo systemctl start nftables
停止 nftables 服务
sudo systemctl stop nftables
重新启动 nftables 服务
sudo systemctl restart nftables
nftables 开启端口示例
sudo nft add table inet filter # 这里创建了一个名为 filter 的表格
sudo nft add chain inet filter input { type filter hook input priority 0 \; } # 在该表格上创建了一个名为 input 的链
sudo nft add rule inet filter input tcp dport <端口号> accept # 添加了一条规则以接受指定端口的 TCP 流量
nftables 关闭端口示例
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
sudo nft add rule inet filter input tcp dport <端口号> drop
保存配置
注意:上述的开启和关闭端口的规则是临时性的,它们在系统重启后将失效。如果想要让规则在系统重启后依然生效,则需要将规则保存到nftables的配置文件中。
sudo nft list ruleset > /etc/nftables.conf # 将当前的规则集输出到 /etc/nftables.conf 文件中。在系统启动时,nftables 将会读取这个文件并加载规则
设置 nftables 开机自启
sudo systemctl enable nftables
关闭 nftables 开机自启
sudo systemctl disable nftables
使用 iptables
查看当前 iptables 规则
sudo iptables -L
如果没有安装 iptables,可以通过以下命令安装
sudo apt update
sudo apt install iptables
查看 ptables 详细信息
sudo iptables -L -v
如果 iptables 规则比较复杂,你可能需要查看更详细的信息
sudo iptables -S
重新加载 iptables 规则并使其立即生效
sudo systemctl restart iptables
停止 iptables 服务
sudo systemctl stop iptables
使用 firewalld
检查 firewalld 运行状态
sudo firewall-cmd --state
如果没有安装 firewalld,可以通过以下命令安装
sudo apt update
sudo apt install firewalld
查看防火墙规则
sudo firewall-cmd --list-all
查看某个特定端口是否放行
sudo firewall-cmd --query-port=80/tcp
开启 80 端口
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload
查看 firewalld 详细信息
sudo systemctl status firewalld
停止 firewalld
sudo systemctl stop firewalld
向防火墙添加允许 HTTP 和 HTTPS 流量的规则,并重新加载防火墙配置
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload