V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
wwc
V2EX  ›  NGINX

NGINX 如何禁止未绑定域名和 IP 访问 443 端口

  •  
  •   wwc · 2017-03-20 10:34:49 +08:00 · 10721 次点击
    这是一个创建于 2812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,这需求对 80 端口来说很简单,到了 443 各种问题啊,求解决方法!!

    详细描述: 比如我服务器 443 端口只绑定了 www.baidu.com 这一个域名, https://www.baidu.com 是可以访问的,与此同时,使用其他解析到我 IP 上的域名和直接使用我的 IP ,也是可以访问的,我现在想只让我绑定的域名能访问, https://其他域名 和 https://我服务器 IP ,一律 444 或者 403.

    9 条回复    2017-03-20 16:26:03 +08:00
    XiaoFaye
        1
    XiaoFaye  
       2017-03-20 10:39:20 +08:00
    设一个 default_server 和 一个只映射 www.baidu.com 的 server , default 那个全部返回 404 , 这样只有用 www.baidu.com 域名访问的才会正确映射。
    wwc
        2
    wwc  
    OP
       2017-03-20 10:47:12 +08:00
    @XiaoFaye 是啊,理论上是这样,但是我这样搞之后,正常绑定的也无法访问了。
    ovear
        3
    ovear  
       2017-03-20 11:00:39 +08:00 via Android   ❤️ 1
    这个很简单啊, Nginx 对于找不到 hostname 的域名,默认采用第一个 host
    所以你可以在 include vhost/*. conf 之前加一个 default server
    然后 Nginx 有个直接打断连接的 http code 444

    所以
    location / 左大括号
    return 444 分号
    右大括号

    就可以实现了


    至于 ip ,直接绑 server name
    zpf124
        4
    zpf124  
       2017-03-20 11:46:02 +08:00
    @wwc 那你就贴一下你正常绑定的配置文件吧, 如果 server_name 正确应该不会你自己域名都访问不了
    salmon5
        5
    salmon5  
       2017-03-20 11:59:21 +08:00
    server {
    listen 443 ssl default_server;
    return 403;
    }

    server {
    listen 443 ssl;
    server_name www.baidu.com;
    下面省略
    }

    匹配到 baidu 用 baidu ,匹配不到的全部到 default_server,直接返回 403.
    Tyanboot
        6
    Tyanboot  
       2017-03-20 12:01:09 +08:00 via Android
    以下内容来源 Nginx 官方文档

    If someone makes a request using an IP address instead of a server name, the “ Host ” request header field will contain the IP address and the request can be handled using the IP address as the server name:
    server {
    listen 80;
    server_name example.org
    www.example.org
    ""
    192.168.1.1
    ;
    ...
    }
    In catch-all server examples the strange name “_” can be seen:
    server {
    listen 80 default_server;
    server_name _;
    return 444;
    }
    There is nothing special about this name, it is just one of a myriad of invalid domain names which never intersect with any real name. Other invalid names like “--” and “!@#” may equally be used.


    参考官方文档。 server_name 填一个下划线。
    wwc
        7
    wwc  
    OP
       2017-03-20 13:11:30 +08:00
    @zpf124 解决了,需要添加私钥和证书路径才可以。
    msg7086
        8
    msg7086  
       2017-03-20 15:43:56 +08:00   ❤️ 1
    @wwc 进帖子之前就猜到是这个问题了。
    Nginx 上对于 SSL 服务器在不配置证书的时候会出现协议错误,哪怕端口上配置了其他网站也会报错。
    解决方法就是随便生成一个证书填进去就好。
    wwc
        9
    wwc  
    OP
       2017-03-20 16:26:03 +08:00
    @msg7086 是的,我也是实在没办法了,随便加了证书路径,结果就 OK 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2219 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.