一些基本操作

在配置 Linux 防火墙规则之前需要先了解一些常用的操作命令,这些命令有助于我们了解服务器当前端口的使用情况,我们在进行防火墙规则配置或者是在日常使用和维护的时候这些命令被使用频率也比较高,所以写在前面。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看服务器网络占用情况
sudo nethogs -a

# 查看正在被监听的端口
sudo netstat -ntlp

# 扫描一定范围内所有已放行的端口
sudo nmap -p 1-65535 localhost

# 查看当前系统上正在使用(或监听)端口 80 的进程,没有输出则表示端口未被占用
sudo lsof -i:80

# 关闭 PID 为 8422 的进程
kill -9 8422

使用 ufw(ufw 是一个简化的防火墙管理工具)

启用 ufw 或允许开机自启(执行前建议先配置好所需的规则)

1
sudo ufw enable

停止 ufw 或禁止开机自启

1
sudo ufw disable

查看防火墙状态

1
sudo ufw status

如果没有安装,可以通过以下命令来安装

1
2
3
sudo apt update

sudo apt install ufw

检查某一端口是否开启

1
sudo ufw status | grep <端口号>

如果输出中包含相关信息,说明该端口被允许。

查看 ufw 所有规则

1
2
3
4
5
# 不显示序号
sudo ufw status verbose

# 显示序号
sudo ufw status numbered

删除 ufw 某条规则

1
2
3
4
5
# 删除第一条规则,这里的 1 就是上一步以带序号的方式查看规则时所对应的序号
sudo ufw delete 1

# 删除允许 789 端口使用 tcp 协议这条规则
sudo ufw delete allow 789/tcp

设置默认的入站流量规则为拒绝

1
sudo ufw default deny incoming

设置默认的入站流量规则为允许

1
sudo ufw default allow incoming

ufw 开启端口

1
2
sudo ufw allow <端口号1>,<端口号2>,<端口号3>/tcp # 可以选择放行 tcp 或 udp
sudo ufw allow <端口号1>,<端口号2>,<端口号3> # 同时放行 tcp 和 udp

ufw 关闭端口

1
2
3
4
5
# 关闭单个端口
sudo ufw deny <端口号>/tcp

# 阻止从 3300 到 3400 一系列端口使用 tcp 协议
sudo ufw deny 3300:3400/tcp

ufw 允许某 IP 地址的连接

1
2
3
4
5
# 允许指定 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 地址的连接

1
2
3
4
5
# 阻止指定 IP 连接到本机
sudo ufw deny from 8.8.8.8

# 阻止指定 IP 连接到本机的 3333 端口
sudo ufw deny from 8.8.8.8 to any port 3333

重新加载 ufw 规则

1
sudo ufw reload

重置 ufw 防火墙(慎用)

1
2
# 重置 ufw 防火墙,删除所有规则
sudo ufw reset

更多 ufw 用法: Debian/Ubuntu 系统中安装和配置 UFW -简单的防火墙

使用 nftables

启动 nftables 服务

1
sudo systemctl start nftables

停止 nftables 服务

1
sudo systemctl stop nftables

重新启动 nftables 服务

1
sudo systemctl restart nftables

查看 nftables 服务状态

1
sudo systemctl status nftables

查看 nftables 规则

1
sudo nft list tables

如果没有安装 nftables,可以通过以下命令安装

1
2
3
sudo apt update

sudo apt install nftables

nftables 开启端口示例

1
2
3
4
5
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 关闭端口示例

1
2
3
4
5
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的配置文件中。

1
sudo nft list ruleset > /etc/nftables.conf # 将当前的规则集输出到 /etc/nftables.conf 文件中。在系统启动时,nftables 将会读取这个文件并加载规则

设置 nftables 开机自启

1
sudo systemctl enable nftables

关闭 nftables 开机自启

1
sudo systemctl disable nftables

使用 iptables

查看当前 iptables 规则

1
sudo iptables -L

查看 ptables 详细信息

1
sudo iptables -L -v

如果 iptables 规则比较复杂,你可能需要查看更详细的信息

1
sudo iptables -S

如果没有安装 iptables,可以通过以下命令安装

1
2
3
sudo apt update

sudo apt install iptables

重新加载 iptables 规则并使其立即生效

1
sudo systemctl restart iptables

停止 iptables 服务

1
sudo systemctl stop iptables

使用 firewalld

查看 firewalld 状态

1
sudo firewall-cmd --state

查看防火墙规则

1
sudo firewall-cmd --list-all

如果没有安装 firewalld,可以通过以下命令安装

1
2
3
sudo apt update

sudo apt install firewalld

查看某个特定端口是否放行

1
sudo firewall-cmd --query-port=80/tcp

开启 80 端口

1
2
3
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent

sudo firewall-cmd --reload

检查 Firewalld 状态

1
sudo systemctl status firewalld

停止 Firewalld

1
sudo systemctl stop firewalld

向防火墙添加允许 HTTP 和 HTTPS 流量的规则,并重新加载防火墙配置

1
2
3
4
5
sudo firewall-cmd --add-service=http --permanent

sudo firewall-cmd --add-service=https --permanent

sudo firewall-cmd --reload