一些基本操作

在配置 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