iptables防火墙规则配置入门

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折优惠券,有需要的朋友可以看看。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容