家用住宅主机Linux防火墙iptables完整安全规则
很多朋友在家里用旧电脑或树莓派跑Linux服务,比如文件共享、监控系统、远程下载。
这些主机直接接入家庭局域网,如果防火墙规则没配好,就像家门没锁——风险很大。
本文以 Ubuntu 22.04 为例,带零基础的你完整配置一套 iptables 安全规则。
准备工作:确认当前防火墙状态
先打开终端,查看现在有没有 iptables 规则:
sudo iptables -L -n -v
如果输出显示 Chain INPUT (policy ACCEPT) 且下面没有规则,说明防火墙完全开放,需要立刻加固。
另外确认系统是否安装了 iptables(一般系统自带)。
如果是 ufw 或 firewalld 用户,建议先停用它们,避免规则冲突:
sudo systemctl stop ufw
sudo systemctl disable ufw
编写核心安全规则:逐条配置
iptables 规则是从上到下匹配的,所以顺序很重要。
我们按“丢弃一切,只放行必要流量”的思路来写。
下面是一组适合家用主机的完整规则:
# 1. 清空现有规则(谨慎执行,远程SSH可能中断)
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t mangle -F
# 2. 设置默认策略:先全部丢弃,避免遗漏
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 3. 允许本地回环接口(系统内部通信用)
sudo iptables -A INPUT -i lo -j ACCEPT
# 4. 允许已建立的连接和相关连接(避免断连)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 5. 放行SSH(假设默认端口22,可自定义)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 6. 放行HTTP/HTTPS(如果你在主机上跑了Web服务)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 7. 防止SSH暴力破解(限制每分钟最多3次新连接)
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
# 8. 丢弃所有非法包(减少风险)
sudo iptables -A INPUT -m state --state INVALID -j DROP
# 9. 记录并丢弃其他所有入站流量(可选日志)
sudo iptables -A INPUT -j LOG --log-prefix "[IPTABLES DROP] " --log-level 4
sudo iptables -A INPUT -j DROP
重点提醒:如果你通过SSH远程操作,执行 -P INPUT DROP 之前必须确保第4条(放行已建立连接)和第5条(放行SSH端口)已经添加,否则你会立刻断开连不上。
建议在本地物理终端或提前测试。
保存规则并设置开机自启
iptables 规则默认重启后消失。
我们需要把它保存到文件并开机加载。
方法一:使用 iptables-save/restore
# 保存当前规则到文件
sudo iptables-save > /etc/iptables/rules.v4
# 设置开机自启(需安装 iptables-persistent)
sudo apt install iptables-persistent -y
sudo systemctl enable netfilter-persistent
方法二:手动创建 systemd 服务(适合不想装额外包的用户)
sudo iptables-save > /etc/iptables.up.rules
sudo chmod 644 /etc/iptables.up.rules
然后编辑 /etc/rc.local 或创建一个 systemd 服务在启动时执行 iptables-restore < /etc/iptables.up.rules。
避坑指南与高频问题
Q1:执行规则后自己连不上了?
别慌。如果有物理访问,直接按电源重启;如果远程,可让家人帮忙重启或提前配置 crontab 保留恢复脚本。建议先在本地终端逐一测试规则。
Q2:规则顺序错了,某些端口不通?
iptables 规则从上到下匹配,如果某条规则之前有 DROP 导致所有流量被丢,后面的 ACCEPT 就不起作用。调试时用 sudo iptables -L -n --line-numbers 查看行号,用 sudo iptables -D INPUT 行号 删除错误规则。
Q3:家用主机需要放行哪些端口?
根据你跑的服务决定:SSH(22)、HTTP(80、443)、SMB(445、139)、NFS(2049)、Plex(32400)等。原则:只开放必要的,其余全封。
效果验证:检查规则并测试连通
执行 sudo iptables -L -n -v 查看规则列表,确认每条规则都有对应的包计数(pkts 列有数字表示有流量经过)。
用另一台设备(比如手机)尝试访问这台主机的放行端口和未放行端口:
- 测试 SSH:
ssh 用户名@主机IP应能连接 - 测试 HTTP:浏览器访问
http://主机IP应能看到页面(如果架了网站) - 测试被阻断的端口:
nc -zv 主机IP 3306(MySQL端口)应返回连接超时或拒绝
如果想看日志中丢弃的记录,可以 sudo journalctl -k | grep IPTABLES,能看到被丢弃的包来源IP。
以上这套规则适合大多数家用场景。
如果有更复杂的需求(如端口转发、VPN支持),可以在基础上叠加 nat 表规则。
如果你在配置中遇到意外情况,优先检查规则顺序和模式匹配条件。
坚持最小权限原则,你的家庭Linux主机就能安全稳定运行。