如何阻止Nginx响应特定SSH子域名并限制主域名SSH访问
嘿,这两个问题其实都可以通过配置调整轻松解决,我分两部分给你拆解:
一、阻止Nginx在SSH子域名上提供网站服务
要让ssh.yourdomain.com完全不提供HTTP/HTTPS服务,你需要给Nginx加一个专门的配置,直接拒绝这个子域名的所有Web请求:
- 登录服务器,找到Nginx的配置目录(通常是
/etc/nginx/sites-available/或/etc/nginx/conf.d/)。 - 创建一个新的配置文件(比如
ssh-subdomain.conf),或者修改现有配置,添加下面的server块:# 处理HTTP请求 server { listen 80; listen [::]:80; server_name ssh.yourdomain.com; # Nginx特有的444状态码,直接关闭TCP连接,不给任何Web响应 return 444; } # 如果你的服务器启用了HTTPS,必须加上这个块处理HTTPS请求 server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name ssh.yourdomain.com; # 可以用任意SSL证书(哪怕是自签的),或者如果不需要SSL握手,也可以直接返回444 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; return 444; } - 测试配置是否合法:
sudo nginx -t,如果输出test is successful,就重启Nginx生效:sudo systemctl restart nginx。
⚠️ 注意:如果你的Nginx有泛域名配置(比如server_name *.yourdomain.com;),一定要让这个ssh子域名的配置优先加载(比如放在泛域名配置文件前面),因为Nginx会匹配最具体的server_name。
二、拒绝主域名的SSH访问
这部分分两种情况,取决于你的主域名和SSH子域名是否指向同一个IP:
情况1:主域名和SSH子域名用不同IP
这种情况最省心,直接让SSH服务只监听SSH子域名的IP:
- 打开SSH配置文件:
sudo nano /etc/ssh/sshd_config - 找到
ListenAddress选项,注释掉原有内容,添加你的SSH子域名IP:ListenAddress 192.168.1.100 # 替换成ssh.yourdomain.com对应的IP - 保存后重启SSH服务:
sudo systemctl restart sshd
这样主域名的IP上不会有SSH监听,自然就无法通过主域名连接了。
情况2:主域名和SSH子域名用同一个IP
这种情况下需要通过主机名过滤来限制,有两种可靠方法:
方法A:用SSH的Match规则
在/etc/ssh/sshd_config末尾添加:
# 拒绝所有非ssh子域名的SSH连接 Match Host !ssh.yourdomain.com DenyUsers *
⚠️ 注意:这个方法依赖客户端IP的**反向解析(PTR记录)**正确映射到ssh.yourdomain.com,如果反向解析不稳定,建议用方法B。
方法B:用TCP Wrappers(hosts.allow/deny)
- 编辑
/etc/hosts.allow,添加:sshd: ssh.yourdomain.com - 编辑
/etc/hosts.deny,添加:sshd: ALL
这样只有来自ssh.yourdomain.com的请求会被允许,其他全部拒绝,同样需要反向解析正常工作。
内容的提问来源于stack exchange,提问作者Kiyo
相关产品推荐
相关产品推荐

