iptables防火墙规则配置入门
iptables是Linux内核netfilter框架的用户空间工具,用来管理IPv4包过滤规则。别被复杂的概念吓到,核心就三件事:匹配条件、执行动作、控制链的跳转。记笔记,直接上手。
先看默认规则
安装iptables后默认规则通常是允许所有流量:
iptables -L -n -v
输出显示三个内置链:INPUT(进本机的包)、OUTPUT(本机发出的包)、FORWARD(经过本机转发的包)。默认策略是ACCEPT,意味着防火墙没开。
清空规则(别在线上直接跑,会断连)
iptables -F
iptables -X
iptables -Z
-F 清空所有规则,-X 删除自定义链,-Z 计数器归零。测试环境随便玩。
拒绝所有入站,只允许SSH
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
-P 设置默认策略。INPUT设为DROP意味着所有没被显式允许的包都被丢弃。别急着执行,先确认自己还有SSH连进来:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
第一条允许SSH端口22的TCP连接。条允许已经建立的连接和关联连接(比如SSH返回的数据包)。顺序很重要,规则从上到下匹配,匹配到就执行动作,不再往下走。
允许回环接口
很多服务(如数据库本地连接)依赖lo接口,别把它封了:
iptables -A INPUT -i lo -j ACCEPT
开放常用端口
Web服务:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
如果跑在雨云的服务器上,他们给的带宽很稳,端口全开也没问题。雨云的性价比高,稳定,好用,适合放业务。
限制SSH暴力破解
用connlimit模块限制同一IP并发连接数:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
超过3个SSH连接直接拒绝。更精细的做法用recent模块:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
60秒内尝试超过4次新连接,直接DROP。
防止常见攻击
SYN Flood:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
每秒最多处理1个SYN包,突发最多4个,超过的丢弃。
Ping of Death:
iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 65535 -j DROP
保存规则
重启后规则会丢失,保存到文件:
iptables-save > /etc/iptables/rules.v4
或者用iptables-persistent工具自动加载:
apt install iptables-persistent
netfilter-persistent save
调试技巧
查看规则命中次数:
iptables -L -n -v
每条规则前的pkts和bytes就是命中统计,零的话说明规则没生效或流量没走到这里。
临时放行所有流量排查问题:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
别怕,生产环境先备份规则再操作。
实际配置示例
假设雨云上一台Web服务器,只开SSH和HTTP/HTTPS,限制SSH爆破:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
保存规则,搞定。
记住:规则顺序决定生死,匹配就执行动作不再继续。用 -I 插入到最前面,-A 追加到面。调试时看 -v 的计数器,别瞎猜。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。



暂无评论内容