Skip to content

Commit 9fe4bde

Browse files
committed
fix:修复持久化
1 parent b9b5505 commit 9fe4bde

4 files changed

Lines changed: 92 additions & 7 deletions

File tree

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,5 +152,9 @@ virtctl restart <vmname> -n kubevirt-vms
152152

153153
1. 虚拟机首次启动需要等待镜像下载导入(根据网速可能需要 5-20 分钟)
154154
2. 宿主机需要开启 KVM 嵌套虚拟化或直接使用裸金属服务器
155-
3. 端口转发通过 iptables 实现,重启后自动通过 systemd 服务恢复
155+
3. 端口转发通过 iptables/nftables 实现(支持IPv4 + IPv6双栈):
156+
- 使用 systemd 服务在重启后自动恢复规则
157+
- Debian/Ubuntu 系统自动安装 `iptables-persistent``netfilter-persistent`
158+
- Red Hat/CentOS 系统自动安装 `iptables-services`
159+
- 规则变更后自动持久化,确保重启后不失效
156160
4. 如需重置密码,通过 `virtctl console` 进入控制台手动修改

kubevirtinstall.sh

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,26 @@ setup_firewall_service() {
387387
# iptables 后端:安装 iptables-persistent 作为额外持久化
388388
if [ "$FW_BACKEND" = "iptables" ]; then
389389
if command -v apt-get >/dev/null 2>&1; then
390-
_info "安装 iptables-persistent 用于规则持久化..."
391-
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq iptables-persistent 2>/dev/null || true
390+
_info "安装 iptables-persistent 用于规则持久化(IPv4 + IPv6)..."
391+
# 预配置避免安装时的交互提示
392+
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | debconf-set-selections
393+
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | debconf-set-selections
394+
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq iptables-persistent netfilter-persistent 2>/dev/null || true
395+
# 启用并启动服务
396+
systemctl enable netfilter-persistent 2>/dev/null || true
397+
systemctl start netfilter-persistent 2>/dev/null || true
398+
# 立即保存当前规则(IPv4 + IPv6)
399+
netfilter-persistent save 2>/dev/null || true
400+
elif command -v yum >/dev/null 2>&1; then
401+
_info "安装 iptables-services 用于规则持久化(IPv4 + IPv6)..."
402+
yum install -y -q iptables-services 2>/dev/null || true
403+
# 立即保存当前规则
404+
mkdir -p /etc/sysconfig
405+
iptables-save > /etc/sysconfig/iptables 2>/dev/null || true
406+
ip6tables-save > /etc/sysconfig/ip6tables 2>/dev/null || true
407+
# 启用并启动服务
408+
systemctl enable iptables ip6tables 2>/dev/null || true
409+
systemctl start iptables ip6tables 2>/dev/null || true
392410
fi
393411
fi
394412

kubevirtuninstall.sh

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,15 @@ cleanup_firewall() {
167167
_step "清理端口转发规则..."
168168

169169
if [ -f "$FIREWALL_LIB" ]; then
170+
# 使用防火墙库清理(推荐,会自动持久化)
170171
fw_cleanup_all
171172
else
172173
# 回退:手动清理
173174
if command -v nft >/dev/null 2>&1; then
174175
nft delete table inet kubevirt 2>/dev/null || true
175176
fi
176177
if command -v iptables >/dev/null 2>&1; then
178+
# 清理IPv4规则
177179
local chain
178180
for chain in PREROUTING OUTPUT POSTROUTING; do
179181
local i=0
@@ -186,12 +188,36 @@ cleanup_firewall() {
186188
i=$((i + 1))
187189
done
188190
done
191+
# 清理IPv6规则
192+
if command -v ip6tables >/dev/null 2>&1; then
193+
for chain in PREROUTING OUTPUT POSTROUTING; do
194+
local i=0
195+
while [ "$i" -lt 500 ]; do
196+
local rule_num
197+
rule_num=$(ip6tables -t nat -L "$chain" --line-numbers -n 2>/dev/null | \
198+
grep "KUBEVIRT-VM-" | head -1 | awk '{print $1}')
199+
[ -z "$rule_num" ] && break
200+
ip6tables -t nat -D "$chain" "$rule_num" 2>/dev/null || break
201+
i=$((i + 1))
202+
done
203+
done
204+
fi
205+
# 持久化清理后的规则
206+
if command -v netfilter-persistent >/dev/null 2>&1; then
207+
netfilter-persistent save 2>/dev/null || true
208+
elif [ -x /etc/init.d/iptables-persistent ]; then
209+
/etc/init.d/iptables-persistent save 2>/dev/null || true
210+
elif command -v iptables-save >/dev/null 2>&1; then
211+
mkdir -p /etc/sysconfig
212+
iptables-save > /etc/sysconfig/iptables 2>/dev/null || true
213+
ip6tables-save > /etc/sysconfig/ip6tables 2>/dev/null || true
214+
fi
189215
fi
190216
fi
191217
rm -f /etc/kubevirt/port-rules.conf
192218
rm -f /etc/kubevirt/iptables-rules
193219

194-
_info "防火墙规则清理完成"
220+
_info "防火墙规则清理完成(已持久化)"
195221
}
196222

197223
# ===== 停用并删除 systemd 服务 =====
@@ -293,10 +319,11 @@ print_summary() {
293319
echo " ✓ CDI 组件"
294320
echo " ✓ K3s Kubernetes 集群"
295321
echo " ✓ virtctl 工具"
296-
echo " ✓ 端口转发规则(nftables/iptables)"
322+
echo " ✓ 端口转发规则(nftables/iptables,含持久化规则"
297323
echo " ✓ 相关配置文件"
298324
echo ""
299325
_warn "vmlog 文件未删除,如需清理请手动运行:rm -f vmlog"
326+
_warn "iptables-persistent/netfilter-persistent 服务未卸载(可能有其他用途)"
300327
echo "======================================================"
301328
}
302329

scripts/firewall.sh

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,21 @@ _ipt_rebuild() {
146146

147147
# ===== iptables: 通过 netfilter-persistent 保存规则 =====
148148
_ipt_save_persistent() {
149+
# 方法1: netfilter-persistent (Debian/Ubuntu 推荐)
149150
if command -v netfilter-persistent >/dev/null 2>&1; then
150151
netfilter-persistent save 2>/dev/null || true
152+
# 方法2: iptables-persistent 传统方式
151153
elif [ -x /etc/init.d/iptables-persistent ]; then
152154
/etc/init.d/iptables-persistent save 2>/dev/null || true
155+
# 方法3: Red Hat/CentOS 方式
156+
elif command -v iptables-save >/dev/null 2>&1; then
157+
# 保存 IPv4 规则
158+
mkdir -p /etc/sysconfig
159+
iptables-save > /etc/sysconfig/iptables 2>/dev/null || true
160+
# 保存 IPv6 规则(如果 ip6tables 可用)
161+
if command -v ip6tables-save >/dev/null 2>&1; then
162+
ip6tables-save > /etc/sysconfig/ip6tables 2>/dev/null || true
163+
fi
153164
fi
154165
}
155166

@@ -217,14 +228,39 @@ fw_clear_rules() {
217228
}
218229

219230
# ===== 清除所有 KubeVirt 规则并清空状态文件 =====
231+
# 用于完全卸载时,删除所有KUBEVIRT相关的防火墙规则
232+
# 并持久化清理结果,确保重启后规则不会恢复
220233
fw_cleanup_all() {
221234
detect_fw_backend || return 0
222235

223236
case "$FW_BACKEND" in
224-
nftables) nft delete table inet kubevirt 2>/dev/null || true ;;
225-
iptables) _ipt_flush ; _ipt_save_persistent ;;
237+
nftables)
238+
nft delete table inet kubevirt 2>/dev/null || true
239+
;;
240+
iptables)
241+
# 清除IPv4规则
242+
_ipt_flush
243+
# 同时清除IPv6规则(如果存在)
244+
if command -v ip6tables >/dev/null 2>&1; then
245+
local chain
246+
for chain in PREROUTING OUTPUT POSTROUTING; do
247+
local i=0
248+
while [ "$i" -lt 500 ]; do
249+
local rule_num
250+
rule_num=$(ip6tables -t nat -L "$chain" --line-numbers -n 2>/dev/null | \
251+
grep "KUBEVIRT-VM-" | head -1 | awk '{print $1}')
252+
[ -z "$rule_num" ] && break
253+
ip6tables -t nat -D "$chain" "$rule_num" 2>/dev/null || break
254+
i=$((i + 1))
255+
done
256+
done
257+
fi
258+
# 持久化清理后的规则(IPv4 + IPv6)
259+
_ipt_save_persistent
260+
;;
226261
esac
227262

263+
# 清空状态文件
228264
[ -f "$KUBEVIRT_PORT_RULES" ] && : > "$KUBEVIRT_PORT_RULES"
229265
}
230266

0 commit comments

Comments
 (0)