2
在人的一生中最为辉煌的一天,并不是功成名就的那一天,而是从悲叹和绝望中产生对人生挑战的欲望,并且勇敢的迈向这种挑战的那一天。

在浏览网站时,客户端需要进行域名解析,以获取目标网站的 IP 地址。一旦客户端获得了 IP 地址,它就可以使用该地址与服务器建立 HTTP 通信,并请求所需的网页内容。

image.png

如果已经知道了目标网站的 IP 地址,理论上可以跳过域名解析的过程,直接使用 IP 地址进行 HTTP 通信。

以百度为例,我们可以使用 ping 命令来获取百度的 IP 地址。

image.png

虽然解析得到的IP地址是 14.119.104.254,但是直接使用该 IP 地址访问 https://14.119.104.254 并不能访问百度网站。

image.png

因为 SSL/TLS 证书是与域名有关的,而不是与 IP 地址有关的。证书是由证书颁发机构(CA)签发的,用于验证网站的身份和加密传输的数据。在申请证书时,需要指定证书的主题名称(Subject Name),通常是网站的域名。

当浏览器访问一个使用 SSL/TLS 加密的网站时,它会检查证书中的主题名称是否与当前访问的域名匹配。如果匹配成功,浏览器会信任该证书,否则会提示用户存在安全风险。

image.png

忽略安全风险继续访问,发现访问被拒绝了

image.png

为了看清楚通过域名访问和通过 IP 访问的区别,我们使用 whistle 抓包软件,这样可以看到 HTTPS 加密的正文内容。

首先咱们通过域名来访问一下:

image.png

然后通过 IP 地址来访问一下:

image.png

放在一起一对比,在请求头中就只有两个地方不一样:

image.png

分别是 Host 字段和 Cookie 字段。

这样一看,真相基本就明确了,问题多半出在这个 Host 字段。

为了进一步验证,我们使用 Postman 来直接访问https://14.119.104.254,可以看到服务器返回了403错误

image.png

然后,我们通过 Postman 修改一下 Host 字段,将其设置为域名 www.baidu.com,再试一次:

image.png

我们再来调研一下其他网站(知乎和蓝湖)用 IP 访问会如何:

image.png

image.png

其实,并不是不能通过 IP 访问,而是转发服务会做访问控制,限制通过 IP 访问,因为直接使用 IP 地址访问网站,可能会遇到以下问题:

  • 大多数网站都使用共享主机或虚拟主机,这意味着多个网站可能使用同一个 IP 地址。因此,如果您直接使用 IP 地址访问网站,则可能会访问到错误的网站。
  • 一些网站可能使用负载均衡技术,这意味着它们可能有多个服务器,每个服务器都有不同的 IP 地址。如果您直接使用其中一个 IP 地址,您可能无法访问该网站的所有内容或功能。
  • 一些网站可能使用 SSL 证书来保护数据的安全性。在这种情况下,您必须使用网站的域名进行访问,否则您可能会遇到证书错误或安全警告。

因此,为了确保能够正确地访问网站并获得所有功能和安全保护,最好使用网站的域名而不是 IP 地址进行访问。

比如,我们通过 OpenResty 的配置来禁止直接使用 IP 地址进行访问。以下是配置步骤:

1、打开 OpenResty 的配置文件,通常是 /usr/local/openresty/nginx/conf/nginx.conf。

2、找到 http 块中的 server 块,添加以下配置:

server {
    listen 80 default_server;
    server_name _;
    return 444;
    ...
}

其中,server_name 指定了服务器名称,使用 _ 表示匹配所有域名。return 444; 是一个特殊的指令,表示直接关闭连接,不返回任何响应。
3、重新加载 OpenResty 的配置文件,以使配置生效。可以使用以下命令:

sudo /usr/local/openresty/nginx/sbin/nginx -s reload

通过以上配置,当用户直接使用 IP 地址访问 OpenResty 时,服务器将不会返回任何响应,从而禁止了直接使用 IP 地址进行访问。但是,这并不影响使用域名进行访问。


记得要微笑
1.9k 声望4.5k 粉丝

知不足而奋进,望远山而前行,卯足劲,不减热爱。