起因
随着服务器上面跑的东西越来越多,docker跑的服务也越来越多了
我常访问所以我可以记住每个虚拟机的ip或者docker的端口
但是每次在浏览器输入都得输入192然后手动补全,有时候甚至得冒号加端口号才可以
太特么麻烦了
开始
其实指定域名去指定某个IP很简单,一个DNS服务器就解决了
比较麻烦一点的是端口号,因为正常的DNS服务只负责解析域名到ip
指定端口的话就需要用Nginx反代了
再加上后面我想给一些服务加上单点登录和通行密钥,反代这关肯定是过不去了
DNS服务器的搭建
其实这个很简单,我OpenWRT里面iStore装一个SmartDNS,上游服务器设置为网关或者某个国内的DNS,然后域名地址按照
address /domain.suffix/ip
比如
address /openwrt.lan/192.168.0.114
填写
然后设备需要自定义一下DNS服务器为OpenWRT(如果你WRT本身就是主路由那不需要这步)
值得一提的是如果直接在Chrome里输入.lan结尾的域名他会搜索,因为他不认为.lan是有效域名
但是后面加个/就可以了
Nginx反代
这个其实是稍微麻烦点的点
我们可以把Nginx跑在OpenWRT上,但那样会遇到一个问题
就是与WRT原本的web服务uHTTPd冲突
导致你没有办法再访问luci管理界面
即使你可以访问 uHTTPd http到https的重定向也会不可用
我们可以关闭uHTTPd,直接让Nginx接管WRT的web管理界面
但那样太麻烦了 我懒我也不会
而且Nginx默认不支持luci
况且Nginx的话https证书自签还要自己解决
那还说啥,咱们局域网另外一台设备跑Nginx好了
Nginx配置
我整了台最小化安装的ubuntu server
我不咋会用别的Linux发行版
然后装了Nginx之后配置一下就好了
server {
listen 80;
# listen 443 ssl;
server_name backrest.lan; # 你用来访问的域名
# 如果你有SSL证书,可以在此处配置证书路径,实现HTTPS访问
# ssl_certificate /path/to/your/cert.crt;
# ssl_certificate_key /path/to/your/private.key;
location / {
# 实际代理的地址
proxy_pass https://192.168.0.90:9898;
proxy_set_header Host $host;
# 传递客户端的真实IP地址
proxy_set_header X-Real-IP $remote_addr;
# 包含经过所有代理的客户端IP列表
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
配置之后,我们去之前SmartDNS的配置那里将用来访问的域名的ip改为Nginx反代的ip
address /backrest.lan/192.168.0.233
192.168.0.233即为Nginx反代服务器的地址
完事了
后面我为了方便管理,我迁移到了1Panel
我1Panel的配置文件如下
server {
listen 80 ;
server_name backrest.lan;
index index.php index.html index.htm default.php default.htm default.html;
access_log /www/sites/backrest.lan/log/access.log main;
error_log /www/sites/backrest.lan/log/error.log;
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
return 404;
}
location ^~ /.well-known {
allow all;
root /usr/share/nginx/html;
}
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
root /www/sites/backrest.lan/index;
include /www/sites/backrest.lan/proxy/*.conf;
}
后记
其实的话完全可以让Nginx反代所有的服务,在DNS那里可以将所有*.lan结尾的域名全部指向反代服务器
然后去给服务器设置白名单 比如只接受反代服务器的连接请求
但那个也不是完全有必要,我们后面有需要的话再改