如何合并Modsecurity规则:仅允许特定IP/主机及美国访问
ModSecurity规则合并实现方案
原规则说明
用户原本配置了三条独立的ModSecurity规则,功能如下:
规则1:仅允许美国(US)访问,阻止高风险国家
SecAction "id:900600, phase:1, nolog, pass, t:none, setvar:'tx.high_risk_country_codes = AD AE AF AG AI AL AM AO AQ AR...'" # Allow only the below countries SecRule REMOTE_ADDR "@geoLookup" "chain,id:2000001,drop,msg:'Countries allowed'" SecRule GEO:COUNTRY_CODE "!@pm US"
规则2:允许指定IP访问
SecRule REMOTE_ADDR "^XX\.XX\.XX\.XX$" "phase:1,id:2000002,nolog,allow,msg:'Allow access from IP XX.XX.XX.XX'"
规则3:允许指定远程主机访问
SecRule REMOTE_HOST "host\.name\.com$" "phase:1,id:2000003,nolog,allow,msg:'Allow access from host.name.com'"
合并后的规则实现
要实现「阻止非美国地区访问,但指定IP或指定主机除外」的逻辑,可通过**链式规则(chain)**组合条件,利用逻辑与(AND)筛选需要拦截的请求:
# 保留原高风险国家变量设置(若无其他规则依赖可移除) SecAction "id:900600, phase:1, nolog, pass, t:none, setvar:'tx.high_risk_country_codes = AD AE AF AG AI AL AM AO AQ AR...'" # 核心规则:仅当请求既不是指定IP、也不是指定主机、且来自非美国地区时,拦截请求 SecRule REMOTE_ADDR "!@pm XX.XX.XX.XX" "chain,phase:1,id:2000004,drop,msg:'Block non-US access except allowed IP/host'" SecRule REMOTE_HOST "!@pm host.name.com" "chain" SecRule REMOTE_ADDR "@geoLookup" "chain" SecRule GEO:COUNTRY_CODE "!@pm US"
规则逻辑解释
- 第一条规则:判断请求来源IP不是指定的
XX.XX.XX.XX,触发链式检查 - 第二条规则:继续判断请求的远程主机不是指定的
host.name.com,延续链式检查 - 第三条规则:对请求IP执行地理查询(
@geoLookup) - 第四条规则:判断查询到的国家代码不是US,此时触发
drop动作拦截请求
该逻辑等价于:指定IP/主机直接放行,其余请求仅允许美国地区访问,不符合条件则拦截。
内容的提问来源于stack exchange,提问作者BradG
相关产品推荐
相关产品推荐

