如何使用两个域名分别绑定内外网服务,方便内网用户和外网用户访问。举个例子:内网地址为:share.local.codejerry.cn
,公网则通过share.codejerry.cn
访问同一个服务。
泛解析 DNS 允许我们将任何子域名解析到指定的 IP 地址。这意味着,无论何时我们需要添加新的服务或页面,都不需要为它们单独配置 DNS 记录。
*.local.codejerry.cn => 内网服务器 IP
*.codejerry.cn => 公网服务器 IP
为了确保通过 HTTPS 访问的安全性,我们需要为我们的域名配置 SSL 证书。利用 Certbot 和 Let’s Encrypt,我们可以自动化这个过程,简化证书的申请和续期。以下是配置 SSL 证书的步骤:
这部分内容可以参考 明天更新
内网服务配置的目的是确保内网服务能够通过 HTTPS 安全提供服务,并且对外开放。以下是配置内网服务的步骤:
安装nginx:
sudo apt update
sudo apt install nginx
然后编辑配置文件:
vim /etc/nginx/sites-available/serve.conf
添加如下内容
# HTTP 到 HTTPS 的重定向
server {
listen 80;
server_name upload.local.codejerry.cn;
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl;
server_name upload.local.codejerry.cn;
ssl_certificate /etc/letsencrypt/live/codejerry.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/codejerry.cn/privkey.pem;
location / {
proxy_pass http://内网实际服务的 IP:端口;
}
}
然后将上面的文件导入nginx生效的文件中
sudo vim /etc/nginx/sites-available/default
# 在最后一行添加下面一行,serve.conf就是前边你编辑文件的名字
include sites-available/serve.conf;
然后保存退出,重新加载nginx
:wq
sudo nginx -s reload
内网穿透是一个关键步骤,它允许我们的内网服务能够通过特定的穿透服务,在公网安全地访问。
我们将使用内网穿透工具(如frp)来实现这一点。具体来说,我们需要在内网服务器上配置相应的穿透规则,以便将来自公网的请求转发到内网服务。以下是具体配置的步骤:
[web 80]
type = tcp
localIP = 127.0.0.1
localPort = 80
remotePort = 10080
[web 443]
type = tcp
localIP = 127.0.0.1
localPort = 443
remotePort = 10443
这个配置创建了两个代理:web 80
和 web 443
。web 80
代理将内网的 80 端口(通常用于 HTTP 流量)映射到远程端口 10080;而 web 443
代理则将内网的 443 端口(通常用于 HTTPS 流量)映射到远程端口 10443。通过这种方式,外部流量可以通过特定的远程端口安全地访问内网服务。
注:远程端口 10080 和 10443 可以不对外开放,它们只用于内网穿透服务,只能在远程服务器的内部访问。
具体FRP穿透可以参考博主的另一篇文章:内网穿透之FRP,域名访问本地服务【只看这篇就够了,收藏必备】
公网服务器的配置旨在使得外部用户能够通过公网域名访问内网服务。关键在于设置 Nginx 以正确地转发来自公网的请求到内网穿透服务。以下是配置公网服务器的步骤:
## 公网服务器配置
map $http_host $host_with_cn {
~^(.+)\.codejerry\.cn$ $1.local.codejerry.cn;
}
server {
listen 80;
server_name ~^(.*)\.codejerry\.cn$; # 使用正则表达式匹配所有子域名
location / {
proxy_pass http://127.0.0.1:10080; # 转发到内网穿透的端口
proxy_set_header Host $host_with_cn; # 映射后的内网域名
}
}
使用 map 指令将公网域名(如 upload.codejerry.cn
)映射到对应的内网域名(如 upload.local.codejerry.cn
)。然后在 server 块中,将所有匹配的公网域名请求转发到内网穿透指定的端口(此例中为 10080)。proxy_set_header Host $host_with_cn; 这一行确保内网服务通过请求头中的 host 来识别原始请求的域名。
此外,这种配置方式允许通过公网域名访问内网服务,即使 *.local.codejerry.cn
并未开启解析。这意味着,如果我们希望服务仅通过公网访问,可以将 *.local.codejerry.cn
替换为任意域名,只要与公网端的配置相匹配即可。
对于GitLab,Overleaf,Streamlit等,可能在Nginx重设置其他请求头,以确保服务正常转发。上代码供参考:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name upload.local.codejerry.cn;
client_max_body_size 10G;
return 301 https://$host$request_uri;
location / {
proxy_pass http://IP:Port;
proxy_ssl_server_name on;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
server {
listen 443 ssl;
server_name upload.local.codejerry.cn;
client_max_body_size 10G;
ssl_certificate /etc/letsencrypt/live/codejerry.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/codejerry.cn/privkey.pem;
location / {
proxy_pass http://IP:Port;
proxy_ssl_server_name on;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
通过以上步骤,使用双域名和内网穿透技术来管理服务系统。这种方法不仅提高了安全性,还极大简化了服务的维护和管理工作。这对于那些需要频繁更新和维护服务的人来说,无疑是一个非常实用的解决方案。