得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

iptables 开放入站端口并持久化

在 Debian 系统中,可以使用 iptables 管理入站防火墙规则,并通过 iptables-persistent / netfilter-persistent 将规则持久化,避免系统重启后丢失。

本文以开放 TCP 443 入站端口为例,分别记录命令行添加规则和直接编辑 /etc/iptables/rules.v4 两种方式。

方案一:用 iptables 命令添加,再保存

1. 先看当前 INPUT 规则

1
sudo iptables -L INPUT -n -v --line-numbers

或者:

1
sudo iptables -S INPUT

假设已经有:

1
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

2. 添加 443 规则

如果采用状态防火墙风格:

1
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

不过要注意:如果后面已经有 DROP / REJECT,不能简单 -A 到最后。

例如当前是:

1
2
3
1  RELATED,ESTABLISHED ACCEPT
2 SSH 22 ACCEPT
3 DROP

那应该插到 DROP 前面,例如:

1
sudo iptables -I INPUT 3 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

检查:

1
sudo iptables -L INPUT -n -v --line-numbers

3. 保存到 rules.v4

1
sudo netfilter-persistent save

它会把当前 IPv4 规则保存到:

1
/etc/iptables/rules.v4

但它也会出发 IPv6 规则的保存,只是由于本文命令行用的是 iptables 而不是 ip6tables,所以仅新增 IPv4 规则

4. 确认保存结果

1
sudo grep 443 /etc/iptables/rules.v4

应该能看到类似:

1
-A INPUT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

注意 iptables-save 输出里可能自动出现:

1
-m tcp

方案二:直接编辑 /etc/iptables/rules.v4

这种方式不先改当前内核规则,而是直接修改持久化配置。

1. 备份

建议先:

1
sudo cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak

2. 编辑

1
sudo nano /etc/iptables/rules.v4

假设原来:

1
2
3
4
5
6
7
8
9
10
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

COMMIT

加入:

1
-A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

结果:

1
2
3
4
5
6
7
8
9
10
11
12
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

COMMIT

3. 检查语法

这个步骤很推荐:

1
sudo iptables-restore --test /etc/iptables/rules.v4

没有输出通常就是通过。

4. 应用规则

可以直接:

1
sudo iptables-restore < /etc/iptables/rules.v4

或者让 netfilter-persistent 加载:

1
sudo netfilter-persistent reload

5. 验证

1
sudo iptables -L INPUT -n -v --line-numbers

或者:

1
sudo iptables -S INPUT

两种方法的区别

命令方式:

1
2
3
4
5
6
7
8
9
iptables 命令

立即修改当前内核规则

确认没有问题

netfilter-persistent save

写入 rules.v4

这种方式更推荐,尤其是在远程 SSH 服务器上,因为可以先确认规则有效,再固化

直接编辑方式:

1
2
3
4
5
6
7
编辑 rules.v4

iptables-restore --test

iptables-restore / reload

立即替换当前规则

更适合规则比较多、想整体整理配置的时候。

be slow to promise and quick to perform.