隐藏虚拟主机

关于nginx配置隐藏的想法。

一般公司的内部服务,虽然暴露在公网上,但是呢,其目标群体并不是大众,所以,有些服务还是希望被隐藏起来。一般做法是,为一个ip申请多个域名,而该ip又暴露多个端口。通过域名 + 端口的形式,增加了访问对应服务的难度。

而我自己,有类似的需求。因为自己的云主机,无法绑定域名,故,采用了多端口。但多端口,而又没有域名,实际上并没有任何隐藏效果。故想通过其他方式,来实现目的。

替代域名的方式,可以有cookie/header等等方式。

以下简单叙述实现过程。

参考链接

隐藏版本信息

nginx 隐藏版本   http 块下写
server_tokens      off;

php.ini   隐藏php的信息
expose_php = On

通过cookie来切换vhost

nginx配置如下:

location / {
           proxy_set_header Host $http_host;
           proxy_set_header   X-Real-IP $remote_addr;
           proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_connect_timeout 30;
           proxy_send_timeout 60;
           proxy_read_timeout 60;
           proxy_buffering on;
           proxy_buffer_size 32k;
           proxy_buffers 4 128k;
           proxy_busy_buffers_size 256k;
           proxy_max_temp_file_size 256k;
       
       if ( $cookie_hostname ~* typecho ){
           proxy_pass http://127.0.0.1:40198;
       }
           #proxy_redirect default;
   }

请求方式:

curl -v  --cookie "hostname=typecho" http://1.15.47.218/

谷歌浏览器通过,手动修改cookie方式,确实能达到目的。

后续通过php代码等,来实现cookie的设置。

关于if

if语句块比较特殊(挑剔),有较多的指令,不能放在其中。比如:

if ( $cookie_hostname ~* typecho ){
    deny all;   # 该块内不能有该指令
}

下面的这些指令,均不能放在if块中。

proxy_set_header Host $http_host;
proxy_set_header   X-Real-IP $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
proxy_redirect default;
proxy_redirect default;  # 不太明白此指令的意思,但其必须要放到  proxy_pass后面。