如何通过Tomcat在CentOS上精确限制单一IP地址访问?
- 内容介绍
- 文章标签
- 相关推荐
一、 前言:守护我们的数字绿洲
服务器就像是我们辛勤耕耘的田地,Tomcat是那片肥沃的土壤,而IP 地址则是进出田间的行人。 如果不加以管理,陌生的脚步会踩踏我们的作物, 白嫖。 甚至把稻谷拔光。于是 我们需要一种精准、温柔却不失坚决的方式,让真正的访客畅通无阻,让不速之客止步于门外。
二、为何要精准限制单一 IP?
- 防止恶意爬虫频繁抓取导致服务器负载飙升。
- 保护业务数据不被未经授权的 IP 暴露。
- 满足合规要求——有些行业必须对访问来源做细粒度审计。
- 让运维同事睡得更安稳,夜里也能安心种树、养娃。
三、 方法一:Tomcat 自带的 RemoteAddrValve
Tomcat 为我们准备了一把“守门钥匙”,叫做 RemoteAddrValve。只要在 conf/server.xml 的 节点里加上一段配置, 平心而论... 就能把指定 IP 放进白名单或黑名单。
技巧:如果你想一边放行多个 IP, 只要用逗号分隔; 总结一下。 想屏蔽某些 IP,用 deny 属性即可。
重启服务让配置生效
保存后施行:
sudo systemctl restart tomcat
# 或者
sudo service tomcat restart
四、 方法二:借助 CentOS 防火墙做层层过滤
极度舒适。 有时候我们希望在网络层面先拦截流量,这样即便 Tomcat 配置失误,也不会让恶意请求抵达应用。
使用 firewalld 示例
# 添加只允许单个 IP 的永久规则
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.55" port protocol="tcp" port="8080" accept'
# 拒绝其他所有来源
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="8080" reject'
# 重载防火墙
sudo firewall-cmd --reload
使用 iptables 示例
# 只接受来自目标 IP 的连接
sudo iptables -A INPUT -p tcp -s 203.0.113.55 --dport 8080 -j ACCEPT
# 拒绝其余所有到 Tomcat 的请求
sudo iptables -A INPUT -p tcp --dport 8080 -j REJECT
# 保存规则
service iptables save
五、 方法三:Apache HTTPD 作反向代理 + mod_authz_host
很多企业已经在前端部署了 Apache 作统一入口,此时可以让它来挑选访客, 是个狼人。 再把合法流量转发给 Tomcat。
ServerName myapp.example.com
# 只允许特定 IP
Order Deny,Allow
Deny from all
Allow from 203.0.113.55
ProxyPass /myapp http://localhost:8080/myapp
ProxyPassReverse /myapp http://localhost:8080/myapp
如此一来 即使 Tomcat 本身没有任何限制,Apache 已经帮我们拦住了不请自来的访客,我爱我家。。
六、 方法四:用 Cookie + 数据库记录访问次数,实现动态限流
有时候业务需要“每日只能访问三次”的温柔限制,这时单纯的 IP 白名单显得力不从心。我们可以借助 Cookie 把用户标记下来再配合数据库统计次数。
| IP 限流方案对比表 | ||
|---|---|---|
| 方案名称 | 实现难度 | 适用场景 |
| RemoteAddrValve | 低 | 单机白/黑名单,快速上线。 |
| Iptables/Firewalld | 中等 | 全局网络层防护,多租户环境。 |
| Apache Reverse Proxy + mod_authz_host | 中等偏低 | L7 精细控制,兼容 SSL terminator。 |
| CooKie+DB 动态限流 | 高 | 需要计数、 周期性重置、统计报表的业务。 |
下面给出一个简易实现思路:
- 用户首次访问时 后端生成一个唯一标识,写入 Cookie 并插入数据库表
aip_limit_log, ip VARCHAR, cnt INT, last_date DATE). - 每次请求到达时从 Cookie 中读取 UID,查询对应记录并判断当天计数是否已达上限.
- If 未达上限,则 ++cnt 并放行;否则返回自定义错误页面或 HTTP 429 状态码。
- A 定时任务每日凌晨将 cnt 重置为零,以便新的一天重新计数。
# 示例 SQL 建表语句
CREATE TABLE aip_limit_log (
uid VARCHAR PRIMARY KEY,
ip VARCHAR NOT NULL,
cnt INT DEFAULT 0,
last_date DATE NOT NULL
);
-- 查询示例
SELECT cnt FROM aip_limit_log WHERE uid='${cookie_uid}' AND last_date = CURDATE;
-- 更新示例
UPDATE aip_limit_log SET cnt = cnt+1 WHERE uid='${cookie_uid}';
-- 超限返回示例
if{
response.sendError;
}
他急了。 这种方式虽然稍显繁琐, 却能让你在“保护”与“友好”之间找到恰当平衡——既不给恶意爬虫留下可乘之机,也不给正常用户贴上“黑名单”。正如春耕时节,你会细心给每株幼苗浇水,却不让野草横行;系统平安也是如此,需要精细灌溉与严密防护并存。
七、 最佳实践小贴士
- #1 常备备份:修改任何配置前,都请先复制原文件,如
/opt/tomcat/conf/server.xml.bak_$. - #2 多层防御:"深度防御"不是口号,而是把网络层、防火墙层和应用层都织成一道网,让攻击者无处遁形。
- #3 日志审计:Tomcat 的 AccessLogValve 能记录每一次请求, 把日志导入 ELK 或 Grafana 做实时监控,一旦出现异常访问,可立刻定位并封禁对应 IP。
- #4 动态更新:Container 重启会丢失内存中的白名单, 如果你的白名单经常变动,可考虑使用 JMX 动态注入 Valve 或写脚本自动替换 server.xml 后 reload.
- #5 合规留痕:SQL 表记录访问次数时请务必开启审计日志,以备监管部门检查。这样既合法合规,又能为未来的数据分析提供宝贵素材。
- To be honest, 一旦发现误封了亲朋好友的 IP,不要慌张——立刻编辑对应配置,将其加入 allow 列表,并发送温暖的邮件道歉,让他们感受到你的诚意与专业。正所谓“多生孩子多种树”,技术也该像种子一样,用爱心灌溉成长!
八、 :技术是一棵树,平安是根基
Tomcat 在 CentOS 上的部署,就像在大地上栽下一棵大树。若根部被虫害侵蚀,它终将枯萎;若枝叶被风暴撕裂,它也难以后来啊。通过本文介绍的四种手段——从最直接的 Valve 到系统级防火墙, 再到前端代理以及高级限流机制,你可以依据业务规模和平安需求灵活组合,让这棵树根深叶茂,结出丰硕果实也让每位使用者感受到温暖与平安。愿你在代码与运维之间播撒希望,在每一次部署升级中种下更多绿色,让数字世界充满活力与善意!
一、 前言:守护我们的数字绿洲
服务器就像是我们辛勤耕耘的田地,Tomcat是那片肥沃的土壤,而IP 地址则是进出田间的行人。 如果不加以管理,陌生的脚步会踩踏我们的作物, 白嫖。 甚至把稻谷拔光。于是 我们需要一种精准、温柔却不失坚决的方式,让真正的访客畅通无阻,让不速之客止步于门外。
二、为何要精准限制单一 IP?
- 防止恶意爬虫频繁抓取导致服务器负载飙升。
- 保护业务数据不被未经授权的 IP 暴露。
- 满足合规要求——有些行业必须对访问来源做细粒度审计。
- 让运维同事睡得更安稳,夜里也能安心种树、养娃。
三、 方法一:Tomcat 自带的 RemoteAddrValve
Tomcat 为我们准备了一把“守门钥匙”,叫做 RemoteAddrValve。只要在 conf/server.xml 的 节点里加上一段配置, 平心而论... 就能把指定 IP 放进白名单或黑名单。
技巧:如果你想一边放行多个 IP, 只要用逗号分隔; 总结一下。 想屏蔽某些 IP,用 deny 属性即可。
重启服务让配置生效
保存后施行:
sudo systemctl restart tomcat
# 或者
sudo service tomcat restart
四、 方法二:借助 CentOS 防火墙做层层过滤
极度舒适。 有时候我们希望在网络层面先拦截流量,这样即便 Tomcat 配置失误,也不会让恶意请求抵达应用。
使用 firewalld 示例
# 添加只允许单个 IP 的永久规则
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.55" port protocol="tcp" port="8080" accept'
# 拒绝其他所有来源
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="8080" reject'
# 重载防火墙
sudo firewall-cmd --reload
使用 iptables 示例
# 只接受来自目标 IP 的连接
sudo iptables -A INPUT -p tcp -s 203.0.113.55 --dport 8080 -j ACCEPT
# 拒绝其余所有到 Tomcat 的请求
sudo iptables -A INPUT -p tcp --dport 8080 -j REJECT
# 保存规则
service iptables save
五、 方法三:Apache HTTPD 作反向代理 + mod_authz_host
很多企业已经在前端部署了 Apache 作统一入口,此时可以让它来挑选访客, 是个狼人。 再把合法流量转发给 Tomcat。
ServerName myapp.example.com
# 只允许特定 IP
Order Deny,Allow
Deny from all
Allow from 203.0.113.55
ProxyPass /myapp http://localhost:8080/myapp
ProxyPassReverse /myapp http://localhost:8080/myapp
如此一来 即使 Tomcat 本身没有任何限制,Apache 已经帮我们拦住了不请自来的访客,我爱我家。。
六、 方法四:用 Cookie + 数据库记录访问次数,实现动态限流
有时候业务需要“每日只能访问三次”的温柔限制,这时单纯的 IP 白名单显得力不从心。我们可以借助 Cookie 把用户标记下来再配合数据库统计次数。
| IP 限流方案对比表 | ||
|---|---|---|
| 方案名称 | 实现难度 | 适用场景 |
| RemoteAddrValve | 低 | 单机白/黑名单,快速上线。 |
| Iptables/Firewalld | 中等 | 全局网络层防护,多租户环境。 |
| Apache Reverse Proxy + mod_authz_host | 中等偏低 | L7 精细控制,兼容 SSL terminator。 |
| CooKie+DB 动态限流 | 高 | 需要计数、 周期性重置、统计报表的业务。 |
下面给出一个简易实现思路:
- 用户首次访问时 后端生成一个唯一标识,写入 Cookie 并插入数据库表
aip_limit_log, ip VARCHAR, cnt INT, last_date DATE). - 每次请求到达时从 Cookie 中读取 UID,查询对应记录并判断当天计数是否已达上限.
- If 未达上限,则 ++cnt 并放行;否则返回自定义错误页面或 HTTP 429 状态码。
- A 定时任务每日凌晨将 cnt 重置为零,以便新的一天重新计数。
# 示例 SQL 建表语句
CREATE TABLE aip_limit_log (
uid VARCHAR PRIMARY KEY,
ip VARCHAR NOT NULL,
cnt INT DEFAULT 0,
last_date DATE NOT NULL
);
-- 查询示例
SELECT cnt FROM aip_limit_log WHERE uid='${cookie_uid}' AND last_date = CURDATE;
-- 更新示例
UPDATE aip_limit_log SET cnt = cnt+1 WHERE uid='${cookie_uid}';
-- 超限返回示例
if{
response.sendError;
}
他急了。 这种方式虽然稍显繁琐, 却能让你在“保护”与“友好”之间找到恰当平衡——既不给恶意爬虫留下可乘之机,也不给正常用户贴上“黑名单”。正如春耕时节,你会细心给每株幼苗浇水,却不让野草横行;系统平安也是如此,需要精细灌溉与严密防护并存。
七、 最佳实践小贴士
- #1 常备备份:修改任何配置前,都请先复制原文件,如
/opt/tomcat/conf/server.xml.bak_$. - #2 多层防御:"深度防御"不是口号,而是把网络层、防火墙层和应用层都织成一道网,让攻击者无处遁形。
- #3 日志审计:Tomcat 的 AccessLogValve 能记录每一次请求, 把日志导入 ELK 或 Grafana 做实时监控,一旦出现异常访问,可立刻定位并封禁对应 IP。
- #4 动态更新:Container 重启会丢失内存中的白名单, 如果你的白名单经常变动,可考虑使用 JMX 动态注入 Valve 或写脚本自动替换 server.xml 后 reload.
- #5 合规留痕:SQL 表记录访问次数时请务必开启审计日志,以备监管部门检查。这样既合法合规,又能为未来的数据分析提供宝贵素材。
- To be honest, 一旦发现误封了亲朋好友的 IP,不要慌张——立刻编辑对应配置,将其加入 allow 列表,并发送温暖的邮件道歉,让他们感受到你的诚意与专业。正所谓“多生孩子多种树”,技术也该像种子一样,用爱心灌溉成长!
八、 :技术是一棵树,平安是根基
Tomcat 在 CentOS 上的部署,就像在大地上栽下一棵大树。若根部被虫害侵蚀,它终将枯萎;若枝叶被风暴撕裂,它也难以后来啊。通过本文介绍的四种手段——从最直接的 Valve 到系统级防火墙, 再到前端代理以及高级限流机制,你可以依据业务规模和平安需求灵活组合,让这棵树根深叶茂,结出丰硕果实也让每位使用者感受到温暖与平安。愿你在代码与运维之间播撒希望,在每一次部署升级中种下更多绿色,让数字世界充满活力与善意!

