隐藏虚拟主机
关于nginx配置隐藏的想法。
一般公司的内部服务,虽然暴露在公网上,但是呢,其目标群体并不是大众,所以,有些服务还是希望被隐藏起来。一般做法是,为一个ip申请多个域名,而该ip又暴露多个端口。通过域名 + 端口的形式,增加了访问对应服务的难度。
而我自己,有类似的需求。因为自己的云主机,无法绑定域名,故,采用了多端口。但多端口,而又没有域名,实际上并没有任何隐藏效果。故想通过其他方式,来实现目的。
替代域名的方式,可以有cookie/header等等方式。
以下简单叙述实现过程。
参考链接
- https://www.zhihu.com/question/40767711
- http://www.john3.cn/2019/02/12/diary/d20190212/
- https://blog.csdn.net/yfx000/article/details/110886364
隐藏版本信息
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后面。