LOADING

加载过慢请开启缓存 浏览器默认开启

记一次基于OpenWRT+Nginx反代的局域网服务小改造

起因

随着服务器上面跑的东西越来越多,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结尾的域名全部指向反代服务器

然后去给服务器设置白名单 比如只接受反代服务器的连接请求

但那个也不是完全有必要,我们后面有需要的话再改