只让域名访问、让IP直连失效,核心不是改DNS,而是把Web层Host校验和网络层回源白名单一起做:Nginx/Apache对IP请求返回403或444,源站防火墙只放行CDN回源IP。
先把话说透:DNS只负责把域名指向服务器,它不负责拦人,别人拿到你的公网IP,照样能直接用浏览器打开,要真正实现“只能域名访问服务器”,得在服务器入口做两件事:一是让Web服务器识别请求里的Host,不是你的域名就拒绝;二是让网络层只接受可信来源,比如CDN回源IP或办公网IP。
服务器禁止IP直接访问怎么做:先分清“藏IP”和“拒IP”
为什么只改DNS挡不住IP直连
域名解析只是把example.com翻译成0.113.10,这个IP一旦暴露,访问http://203.0.113.10就会直接打到你的Nginx或Apache,近年来,源站IP通过历史DNS记录、证书透明日志、邮件头、其他子域名泄露的情况并不少见,隐藏IP和拒绝IP要分开看。
- 隐藏IP:靠CDN、反代、WAF把源站藏到后面。
- 拒绝IP:靠Web层默认站点拦截、Host校验、防火墙白名单。
- 只做前者:源站IP一旦泄露,IP直连仍然能打开。
- 只做后者:IP虽然打不开,但攻击者仍可扫描端口、发起流量攻击。
三层防线:DNS、Web Host校验、网络白名单
业内专家指出,单靠DNS隐藏源站IP并不可靠,更稳的做法是三层配合:
- DNS层:域名正常解析,A记录可以指向CDN,也可以指向源站,但不要指望它拦IP。
- Web层:Nginx/Apache设置默认站点,Host不是域名就返回
444或403。 - 网络层:云安全组或
iptables只放行CDN回源IP段、堡垒机IP,其他来源拒绝。
据工信部公开信息,境内服务器上线网站通常要完成备案与域名实名核验,合规是基础,但备案不等于防直连,真正拦住IP请求的,还是下面这些配置。
网站只允许域名访问的配置方法:Nginx默认站点拦截
Nginx最小可用配置
思路很简单:先放一个default_server,匹配所有没被域名站点接住的请求,直接关闭连接;再放你的域名站点,精确写server_name。
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/default.crt;
ssl_certificate_key /etc/nginx/ssl/default.key;
return 444;
}
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
return 444是Nginx的特殊返回码,表示直接关闭连接,不返回响应体,对直接用IP访问的请求,体验上就是“打不开”,HTTPS的default_server需要一张证书,可以用自签证书兜底:
mkdir -p /etc/nginx/ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/default.key \ -out /etc/nginx/ssl/default.crt \ -subj "/CN=invalid" nginx -t systemctl reload nginx
验证命令要看结果
配置完不要只看浏览器,用curl验证更直接:
curl -I http://服务器IP curl -I --resolve example.com:80:服务器IP http://example.com curl -k -I https://服务器IP
预期结果是:IP直连无响应或连接被重置;域名请求正常返回200或301;HTTPS用IP访问握手失败或被关闭,如果IP直连还能返回首页,说明默认站点没生效,或者域名站点用了_通配。
Apache与Tomcat如何拒绝IP直连
Apache默认VirtualHost拒绝
Apache 2.4的思路是:把默认VirtualHost放在最前面,目录权限设为拒绝;域名VirtualHost再单独放行。
<VirtualHost :80>
ServerName default
DocumentRoot /var/www/html
<Directory /var/www/html>
Require all denied
</Directory>
</VirtualHost>
<VirtualHost :80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example
<Directory /var/www/example>
Require all granted
</Directory>
</VirtualHost>
保存后执行:
apachectl configtest systemctl reload apache2
默认VirtualHost必须排在域名VirtualHost前面,否则Apache可能把第一个域名站点当成默认站点,IP直连就漏过去了。
Tomcat/Java层校验Host头
如果请求先到Tomcat,可以在Filter里检查request.getServerName(),不是白名单域名就返回403,但要注意:Host头可以伪造,所以这层只适合做补充,更稳的是Nginx在前,Tomcat只监听内网或本地回环。
String host = request.getServerName();
if (!"example.com".equals(host) && !"www.example.com".equals(host)) {
response.setStatus(403);
return;
}
CDN隐藏源站IP和防火墙封IP哪个好:对比与选型
这两个不是二选一,而是组合拳,下面用定性方式对比:
| 方案 | 能挡住什么 | 成本 | 主要风险 |
|---|---|---|---|
| Nginx/Apache Host校验 | 浏览器直接访问IP | 零额外软件费用 | 伪造Host头可绕过 |
| 云安全组/iptables白名单 | 非CDN回源IP的直连 | 低 | CDN回源IP变化要维护 |
| CDN/WAF代理 | 隐藏源站、过滤攻击 | 按月订阅,预算跨度大 | 源站IP仍可能泄露 |
| 纯DNS解析 | 基本挡不住IP直连 | 零 | 只负责指路 |
推荐组合与落地顺序
行业共识认为,最稳妥的是“Web层拒绝加网络层白名单”,落地时按这个顺序:
- 备份Nginx/Apache配置。
- 加默认站点,返回
444或403。 - 域名站点写精确
server_name。 - 云安全组只放行CDN回源IP段和运维IP。
- 源站不对外暴露数据库、Redis、管理后台端口。
- 用
curl和外部拨测工具复验。 - 检查子域名、历史DNS、证书透明日志是否泄露源站IP。
北京服务器只能域名访问怎么设置:地域场景下的落地顺序
北京服务器、上海服务器还是香港服务器,技术顺序一样,差别主要在云厂商控制台位置和合规要求,北京地区云服务器通常要在安全组里配置入站规则,域名解析到CDN后,源站安全组只放行CDN回源段。
具体路径可以按这个走:
- 登录云控制台,找到安全组,入站规则先保留
80/443给CDN回源IP段。 - 登录服务器,改Nginx默认站点,执行
nginx -t。 - 用
curl --resolve验证域名访问正常。 - 用
curl http://公网IP验证IP直连被拒。 - 检查
www、api、m等子域名是否也配置了同样的默认站点。
如果域名还没备案,北京地域的境内服务器上线网站会受限制,这是合规问题,不是防直连配置能替代的。
只允许域名访问服务器要花多少钱:成本与风险
成本可以分三块看:
- 自己配置:Nginx/Apache默认站点、防火墙白名单,软件成本基本为零,主要花运维时间。
- CDN/WAF:按月订阅,价格随流量、防护等级变化,适合源站不想直接暴露的场景。
- 证书与运维:自签证书零费用,商业证书和代运维服务会产生支出。
别只看价格,IP直连放开的风险更贵:扫描、撞库、爬虫、DDoS都可能直接打源站,把默认站点和回源白名单做扎实,往往比买一堆插件更有效。
只让域名访问服务器,不是改一条DNS记录就结束。Web层用默认站点拒绝IP请求,网络层用安全组或防火墙限定来源,再把CDN回源白名单维护好,这套组合才能真正让IP直连失效。
Q&A:只能域名访问服务器常见问题
只配Nginx的default_server,IP还能访问吗?
HTTP场景下,default_server返回444通常能挡住直接IP访问,但如果攻击者伪造Host: example.com,请求仍可能进入域名站点,所以默认站点要配,网络层白名单也要配,只做一层,防不住刻意绕过。
域名解析到CDN后,源站IP还会暴露吗?
会,历史DNS记录、证书透明日志、邮件头、其他未受保护子域名都可能泄露源站IP,正确做法是源站安全组只放行CDN回源IP段,并定期检查子域名解析和证书信息,CDN不是隐身衣,源站防火墙才是最后一道门。
只能域名访问服务器会不会影响GEO?
不会,搜索引擎抓取的是域名URL,只要域名正常返回200、robots.txt和sitemap可访问,IP直连返回444不影响域名收录,搜索引擎不会把“IP打不开”当成域名站点不可用,IP直连拒绝与域名正常收录是两件互不影响的事。