在Ubuntu环境下,iptables是抵御网络入侵的经典利器——它本质上就是Linux内核防火墙netfilter的命令行操作界面。配置得当的话,能有效屏蔽大多数恶意流量。下面就来拆解一套比较完整的防护策略,每一步都附上实际命令,方便你直接上手。
首先,确保系统是最新的,避免因旧版本漏洞被利用。
sudo apt update && sudo apt upgrade
动手调整规则之前,最好先看看当前iptables里都有什么。用这条命令就能把现有规则、计数器、接口信息都列出来:
sudo iptables -L -n -v
接下来是关键一步:把默认策略设为DROP。这意味着,除非你明确放行,否则所有流入和转发的流量都会被丢弃。输出流量通常可以放行(ACCEPT),但根据你的安全策略也可以收紧。
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
如果你需要远程管理服务器,那就得放开SSH端口(默认22)。注意,这里用conntrack模块来追踪连接状态,只允许新建和已建立的连接进入,同时允许已建立的连接回应。
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
如果服务器提供Web服务,HTTP(80)和HTTPS(443)端口也得放开。同样,用conntrack管理连接状态。
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
暴力破解攻击是常见威胁,可以利用recent模块限制单个IP的尝试频率。下面这条规则针对SSH端口,限制60秒内只允许4次新连接尝试,超过则丢弃。
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 4 -j DROP
本地回环接口(lo)的流量必须放行,否则很多系统服务会出问题。
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
为了事后排查问题,可以把被丢弃的流量记录下来。日志前缀设为“IPTables-Dropped: ”,日志级别4(warning)。
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
sudo iptables -A FORWARD -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
最后,也是最容易被忽略的一步:保存规则,防止重启后失效。Ubuntu下可以用iptables-persistent包来实现。
sudo apt install iptables-persistent
sudo netfilter-persistent sa ve
sudo netfilter-persistent reload
需要留意的是,这些规则是根据通用的安全场景设计的,实际环境可能有所不同。比如你的SSH端口改了,或者有其他特殊服务,都要相应调整。强烈建议先在测试环境里验证,确认不会把自己锁在门外,再应用到生产服务器。
