我一直尝试在使用预置文件安装 16.04 期间自动添加 UFW 规则以允许 SSH 访问。但是,所有记录的方法均无法在首次启动后打开端口 22。
具体来说,我尝试了以下几行的变体:
ufw ufw/enable boolean true
ufw ufw/allow_custom_ports string 22/tcp
ufw ufw/allow_known_ports string 22/tcp
ufw ufw/allow_known_ports string SSH
但似乎都没有什么效果。另外,我尝试在安装后部分添加规则,但由于 iptables 内核模块未加载,导致出现错误。
这可以在预置文件中实现吗?还是我应该放弃,并通过黑客手段在启动时启用防火墙?
答案1
我也尝试过一段时间让它工作。但似乎没有什么效果。直到我最终放弃,并使用一个简单的 rc.local 解决方法修复了它:
d-i preseed/late_command string \
mv /target/etc/rc.local /target/etc/rc.local.orig; \
echo '#!/bin/sh -e' > /target/etc/rc.local; \
echo '/usr/sbin/ufw allow ssh' >> /target/etc/rc.local; \
echo 'mv -f /etc/rc.local.orig /etc/rc.local' >> /target/etc/rc.local; \
echo 'test -x /etc/rc.local && /etc/rc.local' >> /target/etc/rc.local; \
echo 'exit 0' >> /target/etc/rc.local; \
chmod +x /target/etc/rc.local
解决方法是添加一个自定义rc.local
脚本,preseed/late_command
该脚本将:
将原件备份
rc.local
为rc.local.orig
(使用mv
)然后
rc.local
创建新的脚本——它将在系统第一次启动时执行新脚本将:
- 使用以下方式启用 SSH 访问
ufw
- 恢复原始内容
rc.local
(通过移动rc.local.orig
到rc.local
,删除自身) - 测试原始文件是否
rc.local
可执行并运行它 - 成功退出
- 使用以下方式启用 SSH 访问