一元网络论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 841|回复: 0

实现Tailscale与自建网站共存(共用443端口)

[复制链接]

2万

主题

2万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
84189
发表于 2024-6-23 15:01:15 | 显示全部楼层 |阅读模式
机器:日本大陆优化
系统:Ubuntu 22.04
架构:KVM
所需软件:Docker Nginx(注意含有stream模块) Certbot
安装官方Nginx(非Ubuntu源)(https://nginx.org/en/linux_packages.html#Ubuntu
依次执行以下命令安装Nginx

```
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

sudo apt update
sudo apt install nginx

```
再安装Certbot

```
apt install certbot
```
使用DNS模式申请证书

```
sudo certbot certonly --manual --preferred-challenges dns
```
在对应的网站上根据提示添加好DNS记录,然后在/etc/letsencrypt/archive/(你的网站)中复制你的证书
将fullchain1.pem privkey1.pem 分别重命名为 (你的网站).crt (你的网站).key
例如你的域名是derp.example.com,则文件名应为derp.example.com.crt和derp.example.com.key

接下来选择一个目录存放你的证书,我选择放在/data/derper/certs
然后执行以下命令拉取docker镜像(https://hub.docker.com/r/fredliang/derper

```
docker pull fredliang/derper
```
再执行以下命令(有需要修改的字段)

```
docker run -d \
--name derper \
--restart=always \
-p 0.0.0.0:3478:3478/udp \ #此UDP端口不建议修改
-p 0.0.0.0:3443:443 \    #此处3443端口可修改,对应后面的stream,这里的443不建议修改,对应下面DERP_ADDR
-v /data/derper/certs/derp.example.com.crt:/app/certs/derp.example.com.crt \ #自备证书(fullchain)
-v /data/derper/certs/derp.example.com.key:/app/certs/derp.example.com.key \ #自备证书(privkey)
-e DERP_DOMAIN=derp.example.com \ #自备域名
-e DERP_ADDR=:443 \ #derper端口,443不建议修改
-e DERP_CERT_MODE=manual \
fredliang/derper:latest
```
上面为命令解析,下面是给你复制的

```
docker run -d \
--name derper \
--restart=always \
-p 0.0.0.0:3478:3478/udp \
-p 0.0.0.0:3443:443 \
-v /data/derper/certs/derp.example.com.crt:/app/certs/derp.example.com.crt \
-v /data/derper/certs/derp.example.com.key:/app/certs/derp.example.com.key \
-e DERP_DOMAIN=derp.example.com \
-e DERP_ADDR=:443 \
-e DERP_CERT_MODE=manual \
fredliang/derper:latest
```
执行完后docker这里就不需要管了
然后修改位于/etc/nginx/的nginx.conf
接下来的教程参考来源:https://always200.com/tailscale- ... 0%E8%A6%81%EF%BC%89
将stream字段添加到http上面

```
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

stream {
    # 这里就是 SNI 识别,将域名映射成一个配置名
    map $ssl_preread_server_name $backend_name {
    # 把derp.example.com的流量转到derper的upstream
    derp.example.com derper;
    # 域名都不匹配情况下的默认值
        default https_web;
    }
    # 监听 443 并开启 ssl_preread
    server {
        listen 443;
        listen [::]:443;
        proxy_pass  $backend_name;
        ssl_preread on;
    }
    upstream derper {
      server 127.0.0.1:3443; #此处端口对应上面docker配置的3443
    }
    upstream https_web {
      server 127.0.0.1:12443; #如果需要配置其他网站,将有关443端口全部改为12443
    }
}

http {
xxxxxxxxxxxxxxxxxxx
}
```
这样访问[https://derp.example.com] 就能直接显示This is a DERP Server了
添加其他网站例如www.example.com 则需要在位于/etc/nginx/sites-enabled/www.example.com.conf 中
将最前面的443改为12443(对应上面stream的https_web的端口)

```
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
后面省略
```
改后则为

```
server {
    listen 12443 ssl http2;
    listen [::]:12443 ssl http2;
后面省略
```
然后为了重载nginx.conf,需要重启Nginx服务,使用以下命令重启

```
systemctl restart nginx
```
如果配置无误,就会马上重启好
如果出现报错(443 is xxxx),那大概率是因为你现有网站的端口没改,导致端口占用,需要修改后再重启
最后再去Tailscale上修改ACL,增加derpmap即可

```
  "derpMap": {
    "OmitDefaultRegions": false
    ,
    "Regions": {
      "900": {
      "RegionID": 900,
      "RegionCode": "lian",
      "RegionName": "LIAN",
      "Nodes": [{
          "Name": "tx",
          "RegionID": 900,
          "HostName": "derper.linshenkx.cn",
          "DERPPort": 443
      }
     ]
    }
    }
```
测试Derp是否可用时,将"OmitDefaultRegions"设置为true
然后在命令行使用
tailscale status
tailscale netcheck
tailscale ping [你的其他设备的Tailscale IP]
如果出现延迟 并ping通内网设备,则证明运行正常

此文毕
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|一元网络论坛

GMT+8, 2024-11-7 13:38 , Processed in 0.160105 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表