Administrator
发布于 2025-05-13 / 42 阅读
0
0

CentOS7 iptables 使用(允许、封禁 IP)

前言

iptables 作为底层防火墙框架,已经有新的官方继任者 nftables 了(内核版本 3.15 及以上)。

在一些旧的发行版,比如阿里云 CentOS 7 版本是 3.10(uname -r),只能用 iptables。

对于大多数场景和角色来说,更推荐使用 firewalld。firewalld 是更上层、更易用的抽象层(接口层)。用汽车类比,iptables、nftables 这些底层防火墙框架相当于发动机的控制算法,firewalld 相当于油门、刹车、挡位这些易于操作的工具。建议只有遇到极其复杂的网络配置或者性能极致优化时才去操作 iptables、nftables。

iptables、nftables 、firewalld 选一个配置就行,请不要同时配置,可能会引起冲突。

firewalld 的使用请看本站另一篇文章【CentOS7 firewalld 使用】。

iptables nat 转发相关的配置可以参考本站 GRE 相关的文章。

一、查看 iptables 所有规则

# 1、查看所有
iptables -L
iptables -L -nv

# 2、查看指定的 chain
iptables -L IN_public_allow -nv
iptables -L INPUT -nv
  • -L:--list,列出所有规则。语法:-L [chain [rulenum]]

  • -n:--numeric,显示 ip 和端口号,而不是解析为域名

  • -v:--verbose,详细信息

  • -t:--table,默认是 filter 表

  • --line-numbers,显示规则行号,删除会用到

二、添加规则到规则链中

# 1、允许特定 IP 访问(一般用不上)
iptables -A INPUT -j DROP
iptables -A INPUT -s 192.168.1.100 -j ACCEPT

# 2、拒绝特定 IP 访问(封禁 IP)
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -I INPUT -s 192.168.1.100 -j DROP

# 3.1 拒绝访问 3306 数据库
iptables -A INPUT -p tcp --dport 3306 -j DROP

# 3.2 放行 ip 访问 3306、只允许建立新连接(目前我们生产环境使用)
iptables -A IN_public_allow -s 10.96.224.136 -p tcp --dport 3306 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT

# 3.3 放行当前 ip 访问 3306、只允许建立新连接(目前我们生产环境使用)
iptables -A IN_public_allow -s ${SSH_CLIENT%% *} -p tcp --dport 3306 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT

# ${SSH_CLIENT}
# 输出: 客户端IP地址 客户端端口号 服务器端口号 => 例如: 192.168.1.100 54321 22
# %% * => %%空格*
# %%模式匹配: 去掉匹配的最长后缀, 去掉第一个空格以及后面的所有字符(* 匹配所有字符)
  • -A:Append(追加),追加到链条的最后,最后匹配。

  • -I:Insert(插入),插入到链的最前面(或指定位置),优先匹配。

  • INPUT:规则链名称

  • -s:--source,语法:-s address[/mask]

  • -p:--protocol,协议,例如 tcp

  • --dport:目标端口为 3306

  • -m conntrack --ctstate NEW,UNTRACKED:-m 同 --match,使用连接跟踪模块,匹配状态为 NEW(新连接)或 UNTRACKED(未跟踪)的连接。只允许建立新的连接,防止某些类型的攻击(如 SYN 洪水攻击)。高流量的环境中如果连接跟踪表满了,新连接也会标记为 UNTRACKED

  • -j:--jump,跳转到某个目标操作,用于指定目标操作。

    • ACCEPT:接受匹配数据包,允许其通过防火墙

    • DROP:丢弃匹配的数据包,不发送任何响应

    • REJECT:拒绝数据包,并发送一个拒绝响应

    • LOG:记录匹配数据包到日志,然后把数据包传递给下一条规则

    • REDIRECT:将数据包重定向本机的另一个端口。通常用于将流量重定向到本地的代理服务

    • NOTRACK:不跟踪数据包,用于减少连接跟踪表的负担

    • DNAT:目标地址转换,用于端口转发、负载均衡

    • SNAT:源地址转换,适合静态 IP

    • MASQUERADE:对匹配的数据包进行源地址伪装(NAT)。也是源地址转换,可以理解为 SNAT 的一种特殊形式,适用于动态 IP

SNAT 和 MASQUERADE 一般用于多网络接口和内网转发,比如服务器 A 有两个网络接口:

  • eth0:连接公网,IP 为 203.x.113.45

  • eth1:连接私有网络,IP 为 192.168.1.1

服务器 A 可以执行 SNAT 命令使得内网可以通过 eth0 访问外部网络。内网比如机器 B(192.168.1.100)设置网关为服务器 A 的内网 IP(192.168.1.1),请求发送给网关后就会通过 eth0 发送出去。

三、删除规则

# 1、获取规则编号
iptables -L -nv --line-numbers

# 1.1 通过规则号删除
iptables -D IN_public_allow 规则编号

# 2、通过规则内容删除
# 用 SQL 类比解释: delete from INPUT where source = '192.168.1.100' AND action = 'DROP';
iptables -D INPUT -s 192.168.1.100 -j DROP
  • -D:--delete,删除

四、保存规则

上面添加、修改没有保存,重启系统后配置会重置。可使用以下两种方法保存:

1、直接修改 iptables 配置文件(CentOS7 位置:/etc/iptables.rules)

要注意,不同系统文件名可能不同。

2、使用iptables-save 保存以及 iptables-restore恢复


评论