在Linux系统中,限制IP访问是保障服务器安全的重要手段,常见的应用场景包括防止恶意攻击、限制非法访问、控制特定用户访问权限等,Linux提供了多种IP限制工具和方法,涵盖防火墙规则、TCP Wrappers、主机访问控制列表等,可根据实际需求选择合适的方案,以下将详细介绍几种主流的IP限制方法及其具体操作步骤。
使用iptables限制IP访问
iptables是Linux内核集成的防火墙工具,功能强大且灵活,通过配置规则链实现对数据包的过滤、转发和地址转换等操作,限制IP访问主要通过filter
表的INPUT
链(控制进入服务器的数据包)实现。
基本语法
iptables命令的基本格式为:
iptables [-t 表名] [选项] [链名] [匹配条件] [-j 动作]
-t
指定表名(默认为filter
),-j
指定动作(如DROP
丢弃、REJECT
拒绝并返回错误信息、ACCEPT
允许)。
封禁单个IP
封禁恶意IP168.1.100
的所有访问:
iptables -I INPUT -s 192.168.1.100 -j DROP
-I
表示插入规则到链的顶部,-s
指定源IP地址。
封禁IP段
若需封禁整个网段(如168.1.0/24
),可使用子网掩码:
iptables -I INPUT -s 192.168.1.0/24 -j DROP
允许特定IP访问,拒绝其他IP
先设置默认策略为DROP
,再添加允许的IP规则:
iptables -P INPUT DROP # 设置INPUT链默认丢弃所有数据包 iptables -A INPUT -s 192.168.1.200 -j ACCEPT # 允许特定IP
-A
表示追加规则到链的末尾,-P
设置默认策略。
限制特定端口的IP访问
仅允许IP168.1.50
访问SSH端口(22),其他IP拒绝:
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.50 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
-p
指定协议(tcp
/udp
),--dport
指定目标端口。
保存规则
不同Linux发行版的保存命令不同:
- CentOS/RHEL:
service iptables save
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4
删除规则
若需删除已添加的规则,可通过-D
选项指定规则内容,或通过规则序号删除(iptables -L --line-numbers
查看序号):
iptables -D INPUT -s 192.168.1.100 -j DROP
优点:功能全面,支持复杂规则(如端口、协议、MAC地址等过滤),适合企业级环境。
缺点:规则语法复杂,需谨慎操作,误操作可能导致网络中断。
使用firewalld限制IP访问
firewalld是CentOS 7+、RHEL 7+、Fedora等系统默认的动态防火墙管理工具,支持区域(Zone)和服务的动态配置,比iptables更易用。
启动并启用firewalld
systemctl start firewalld systemctl enable firewalld
查看当前区域
firewall-cmd --get-active-zones
默认区域为public
,可根据需求修改(如dmz
、internal
)。
封禁单个IP
在public
区域封禁IP168.1.100
:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop' firewall-cmd --reload # 重新加载规则使生效
--permanent
表示持久化规则(重启后生效),不加则临时生效。
封禁IP段
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" drop' firewall-cmd --reload
允许特定IP访问服务
仅允许IP168.1.200
访问HTTP服务(80端口):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.200" service name="http" accept' firewall-cmd --reload
查看已添加的规则
firewall-cmd --list-rich-rules
优点:动态管理规则,支持区域和服务分类,界面化工具(firewall-config)更易操作。
缺点:仅适用于支持firewalld的系统,复杂规则配置效率低于iptables。
使用TCP Wrappers与hosts.allow/hosts.deny限制IP
TCP Wrappers是基于主机名的访问控制工具,通过/etc/hosts.allow
和/etc/hosts.deny
文件管理服务访问权限,适用于xinetd
或libwrap
支持的服务(如SSH、FTP、Telnet等)。
配置文件语法
/etc/hosts.allow
:允许访问的规则列表。/etc/hosts.deny
:拒绝访问的规则列表。
规则格式为:服务列表: 客户端地址 [选项]
,服务列表用逗号分隔,客户端地址支持IP、域名、通配符(所有,单个字符,网段
如168.1.
表示整个网段)。
允许特定IP访问SSH,拒绝其他IP
编辑/etc/hosts.allow
,添加允许的IP:
sshd: 192.168.1.50, 192.168.1.60 # 允许192.168.1.50和60访问SSH
编辑/etc/hosts.deny
,拒绝所有其他IP访问SSH:
sshd: ALL # 拒绝所有IP访问SSH
允许网段访问FTP,拒绝其他
# hosts.allow vsftpd: 192.168.1. # 允许192.168.1.0/24网段访问FTP # hosts.deny vsftpd: ALL
规则生效顺序
TCP Wrappers先读取hosts.allow
,允许的记录直接通过;再读取hosts.deny
,拒绝的记录直接拒绝;未匹配的规则默认允许访问,需确保hosts.deny
中的ALL
规则覆盖所有未允许的服务。
优点:配置简单,无需重启服务即可生效,适合轻量级服务访问控制。
缺点:仅支持依赖libwrap
的服务,无法过滤非TCP Wrappers服务(如部分HTTP服务器)。
使用fail2ban动态封禁恶意IP
fail2ban是一款基于日志分析的动态封禁工具,通过监控服务日志(如SSH登录失败、HTTP暴力破解),自动匹配恶意IP并添加防火墙规则封禁,适合防御自动化攻击。
安装fail2ban
# CentOS/RHEL yum install -y fail2ban # Debian/Ubuntu apt update && apt install -y fail2ban
配置文件
主配置文件为/etc/fail2ban/jail.conf
,建议复制为jail.local
修改(优先级更高):
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
配置SSH防暴力破解
编辑jail.local
,找到[sshd]
部分,修改如下:
[sshd] enabled = true port = 22 filter = sshd logpath = /var/log/secure maxretry = 3 # 最大失败次数 bantime = 3600 # 封禁时间(秒,3600为1小时) findtime = 600 # 时间窗口(秒,600为10分钟)
参数说明:maxretry
为允许的最大失败登录次数,bantime
为封禁时长,findtime
为统计失败次数的时间窗口。
启动并设置开机自启
systemctl start fail2ban systemctl enable fail2ban
查看封禁状态
fail2ban-client status sshd # 查看SSH封禁状态 fail2ban-client banned # 查看所有被封禁的IP
手动解封IP
fail2ban-client set sshd unbanip 192.168.1.100
优点:动态防御,基于日志自动封禁,减少人工干预,适合防御暴力破解和DDoS攻击。
缺点:依赖日志格式,需确保日志路径正确,可能误封正常用户(如频繁操作触发阈值)。
不同IP限制方法对比
方法 | 适用场景 | 配置工具 | 优点 | 缺点 |
---|---|---|---|---|
iptables | 企业级复杂规则过滤 | iptables命令 | 功能全面,支持高级过滤 | 语法复杂,易误操作 |
firewalld | CentOS 7+等系统动态防火墙管理 | firewall-cmd、图形界面 | 规则动态更新,支持区域分类 | 仅限支持系统,复杂规则效率低 |
TCP Wrappers | 轻量级服务访问控制(SSH/FTP等) | hosts.allow/hosts.deny | 配置简单,无需重启服务 | 仅限支持服务,无法过滤非TCP服务 |
fail2ban | 动态防御暴力破解和自动化攻击 | fail2ban配置文件 | 自动化封禁,减少人工干预 | 依赖日志,可能误封正常用户 |
实际应用案例
案例1:仅允许公司内网IP访问服务器,拒绝外网
- 使用iptables设置默认丢弃所有入站数据包:
iptables -P INPUT DROP
- 允许内网网段
168.1.0/24
和回环地址访问:iptables -A INPUT -s 127.0.0.1 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
- 允许已建立的连接和ICMP报文(用于网络诊断):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT
- 保存规则并重启iptables。
案例2:使用fail2ban封禁频繁SSH失败IP
- 确认SSH日志路径(
/var/log/secure
),修改jail.local
中[sshd]
配置:[sshd] enabled = true filter = sshd logpath = /var/log/secure maxretry = 2 bantime = 1800 findtime = 300
- 重启fail2ban服务:
systemctl restart fail2ban
- 查看封禁IP:
fail2ban-client status sshd
相关问答FAQs
Q1:如何查看当前系统中已生效的IP限制规则?
A1:根据使用的工具不同,查看方式如下:
- iptables:
iptables -L -n -v
(-n
以数字形式显示IP和端口,-v
显示详细信息)。 - firewalld:
firewall-cmd --list-all
(查看当前区域的所有规则)。 - TCP Wrappers:
cat /etc/hosts.allow
和cat /etc/hosts.deny
(直接查看配置文件)。 - fail2ban:
fail2ban-client status
(查看所有监狱状态)或fail2ban-client banned
(查看被封禁IP)。
Q2:如何解除已添加的IP限制规则?
A2:根据工具不同,解除方法如下:
- iptables:通过
-D
选项删除规则(需与添加时规则内容完全一致),iptables -D INPUT -s 192.168.1.100 -j DROP
;或通过iptables -F
清空所有规则(谨慎使用)。 - firewalld:使用
--remove-rich-rule
删除规则,firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" drop'
,然后执行firewall-cmd --reload
。 - TCP Wrappers:直接编辑
/etc/hosts.allow
或/etc/hosts.deny
文件,删除对应规则即可,无需重启服务。 - fail2ban:使用
set unbanip
解封,fail2ban-client set sshd unbanip 192.168.1.100
;或修改jail.local
中bantime=0
禁用封禁,重启服务。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/28230.html