背景:在阿里云的ECS服务器上使用docker安装了一个青龙面板容器,使用本机的5700端口。域名abc.top可解析到我ECS的IP地址。
需求:通过域名abc.top可直接访问青龙面板,但是禁止使用IP访问。
网上大概有两个推荐的方法:nginx和iptable。以下我使用nginx。
server {
listen 5700; # 监听5700端口
server_name abc.top; # 设置虚拟主机服务名称为 abc.top
location / {
if ($host != "abc.top") {
return 403; # 检查 $host 变量的值,如果不是使用域名 "abc.top"访问,则返回403。
}
}
}
但是其实这样设置会有一个端口抢占的问题。因为我的docker ql 已经占用了5700端口,而nginx监听这个端口的前提是要占用它,这就产生了矛盾。结果就是要么nginx修改配置后无法重启,要么就是docker ql无法重启。
解决方案:
解决方法十分简单,让nginx换一个监听端口就行。
server {
listen 5000; # 改为监听5000端口
server_name abc.top;
location / {
if ($host != "abc.top") {
return 403;
}
proxy_pass http://localhost:5700; # 当if条件没有匹配成功,说明访问被允许,将流量转向本机的5700端口即可。
}
}
只需要再开一个闲置端口,通过内网将访问5700上的端口交由5000端口代理,就可避免上述问题。
这样在防火墙和阿里云安全组上,只需要放通5000端口,不需要放通5700端口,同时避免了重要业务的端口直接暴露。