一个域名随时随地访问内网服务

OK 记录一下自己通过域名访问内网服务的一些手法

个人喜欢倒腾一些乱七八糟的玩意儿,喜欢在自己的电脑上搭建一些东西,又不满足于只能在家里玩,所以有了内网穿透的想法。

起先打电话问运营商要固定IP,运营商:不给!

后来又看到有IPv6方式实现内网穿透的,但是好像只支持IPv6网络去访问,也没试通。

最后,朋友给我推荐了Tailscale,用起来发现真的香。

说下一个大概的思路,然后和我用到的物料,最后再说下实操手法。

我的需求就是可以访问内网的一些服务,比如PVE的控制台、OpenRouter的管理界面、还有自己玩的一些小项目,当然了还必须要有ssh访问到家里的服务器!

这些需求首先肯定要实现内网穿透,我选的Tailscale,所有的流量都走自建节点。然后访问家里的服务的话最好是有个域名,通过域名地址访问就好了。至于ssh我选的是通过堡垒机的方式去连接,选的JumpServer。

至于实现原理,就是通过Tailscale提供的内网穿透服务和自建中继服务器,实现公网可以访问内网服务。 通过1Panel搭建网站和申请SSL证书(需要DNS RAM),实现理论上的无限免费续期SSL证书。

再说下物料:

  1. 一台访问起来延迟较低的服务器,一般是国内服务器。
  2. 一个域名,二级域名即可。(假设你用国内服务器,需要备案)
  3. 一个 SSL 证书,这个非常关键,下面会介绍如何申请。

根据物料说下我的实际选择,一台VPS(很低配置就可以了、可以装一个1Panel、装docker、带宽也不用很高,比家里的上传带宽高一点就行了,除非你家里的上传带宽很高)、一个域名、然后把域名挂在CloudFlare去。

为啥我选择的不是国内服务器呢?毕竟国内服务器的延迟很低,因为要备案呀… 现在很多VPS都非常廉价了,随便选一个就得了。然后如果非要选国内服务器的话可以看看雨云,弹性带宽性价比高的离谱。

OK 终于到操作了

第一步 先注册一个Tailscale的账号,注意邮箱千万不要用公司邮箱,否则后面会让你付费,普通的163 outlook gmail就可以了

第二步 ssh到自己的公网服务器,执行Tailscale的一键安装脚本

curl -fsSL https://Tailscale.com/install.sh | sh

第三步 启动

tailscale up --accept-routes
# 启动之后有个链接 复制到刚才登录Tailscale的浏览器点Connect就可以了

第四步 内网电脑也安装下Tailscale 执行一键安装就行了 也启动它

# 正常启动是这样
tailscale up --accept-routes

# 但是如果你想把自己的子网也广播出去(假设你同一个网关下有多台机器那就非常建议你广播出去了)
tailscale up --accept-routes --advertise-routes=192.168.1.0/24

第五步 配置 如果你刚才选择了广播子网那就要去Tailscale控制台选择 Edit route settings 允许广播后生效

第六步 验证一下 在公网服务器ping一下你的内网IP 能ping通就说明没问题了

第七步 搭建DERP 这里是用docker拉一个镜像然后跑起来就行了 如果你是国外VPS的话直接跑就行了 docker.io是完全可以访问通的 国内服务器的话就自己找一个吧很多 或者看后面的步骤先安装1Panel 1Panel会提供给你一个加速镜像源

OK 第7.1步 整个二级域名 比如derp.xxx.com 解析到你这台公网服务器上

然后拉取certbot并启动申请证书

# 启动后交互式命令行第一个选择 1 之后输入需要申请SSL证书域名即可(例如xxx.xxx.com)
docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" -p 80:80 certbot/certbot certonly

第7.2步 弄完证书就直接跑下derper就行了 看别的教程说的是derper要用443端口 没必要宝贝 信我的用8443就行 443咱要留着给1Panel用

# derper服务占用8443端口 没有使用443端口是防止与1Panel的OpenResty的端口冲突
# xxx.xxx.com换成刚才用certbot申请证书的域名
docker run --restart always \
  --name derper -p 8443:8443  -p 3478:3478/udp \
  -e DERP_CERT_MODE=manual \
  -v /etc/letsencrypt/live/DERP/fullchain.pem:/app/certs/xxx.xxx.com.crt \
  -v /etc/letsencrypt/live/xxx.xxx.com/privkey.pem:/app/certs/xxx.xxx.com.key \
  -e DERP_ADDR=:8443 \
  -e DERP_STUN=true \
  -e DERP_DOMAIN=xxx.xxx.com \
  -e DERP_HTTP_PORT=-1 \
  -d fredliang/derper:latest

到这里,其实就差不多了,记得安全组放行下端口(UDP/3478 和 TCP/8443),放行完了到浏览器输入验证DERP服务是否成功输入你的域名:8443去访问。看到下面这个图片就OK了。

最后,再去Tailscale配置下Access controls,看图就行了

// 登录Tailscale Admin Console 修改 Access controls 配置
// 直达地址: https://login.Tailscale.com/admin/acls/file
// 找到 derpMap 属性并修改(没有的话增加)
{
  // 此处仅展示 derpMap 配置项
  "derpMap": {
    "OmitDefaultRegions": true, // 是否忽略默认的服务器 建议设置为 true 仅使用自建中继服务器
    "Regions": {
      "900": {
        "RegionID": 900, // 整数数字 范围在[900, 999]
        "RegionCode": "Beijing", // 服务器区域代码 如果多台机器可设定不同名称易于区分
        "RegionName": "Beijing", // 服务器名字
        "Nodes": [
          {
            "Name": "1",
            "RegionID": 900,
            "HostName": "xxx.xxx.com", // 用certbot申请证书的域名
            "DERPPort": 8443 // 端口 这里用的是 8443
          }
        ]
      }
    }
  }
}

最后,只要是安装了Tailscale的机器都执行下 tailscale netcheck 看看现在的穿透走的是不是你搭建的DERP通道

OK 恭喜你实现了内网穿透!!!

现在你在公网服务器上就已经可以访问你的内网服务了,或者你在公网上直接配个nginx转发,你完全可以利用IP+端口号访问你的服务了。

但是,这种IP+Port的方式并不优雅!我们一定要把服务器的资源压榨到底!

接下来,搞1Panel和永久免费的SSL

直接一键安装就完事了 安装完会给你怎么登录

bash bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"

把你需要访问的域名解析到公网IP,这里建议使用泛解析*.a.b.com 的这种,解析一次就完事了。

然后再配置下DNS账号,Cloudflare的就一串字符串,自己搜搜吧,阿里云的是一个key一个value。

最后就在1Panel-网站功能里随便设置你的反向代理就完事了!

具体的网站配置和阿里云配置可以看下这篇笔记

24 个赞

既然都用了服务器,直接国内轻量+wireguard就行,又不用备案。用国外vps还要考虑线路和阻断问题

2 个赞

1panel装个OpenResty反代derp不就行了。我前段时间也折腾了Tailscale ,我过我是自建的headscale,还没有搭建derp。

域名得备案吧

按理说是没问题的,如果不安1Panel的话就可以只用certbot了

都有vps了,我选择全设备搭easytier组网 :upside_down_face:

也可以直接搞个X-UI,vmess、vless这些也很方便,passwall、openclash也能用

1 个赞

又没有http/https服务,为什么要备案,而且直接用阿里/腾讯轻量的IP就能连上,ipv4总不能连不上吧

有境外vps+域名这些都不难搞吧

我写的字你是一点也不看啊 我是有访问web服务的需求的呀 并不是只做内网穿透:exploding_head:

FRP应该也能满足你的使用场景,还更轻量

有vps跟域名用1panel+frp-panel感觉更方便,tailscale没啥优势配置起来还麻烦。

对的,这个超级好用,也推荐

frp-panel下次买新的VPS时候试试,不过感觉tailscale的安全性还是更好一些的,毕竟内网很多东西都是自己一直在用的

我用的frp 套cf nginx 通配域名反代

你写的是访问内网的web服务,你又不发布到公网上,比如你访问内网的PVE的控制台应该是直接访问它的IP地址如http://192.168.1.100:55555这样吧
如果想用域名访问直接host里面指向就好,比如

pve.home 192.168.1.100
jumpserver.home 192.168.1.100

然后直接访问域名就行
都不需要自备域名,想什么域名访问就什么域名访问

感谢佬友分享

如果你家的宽带有动态的对公IP就好办了。1、光猫改桥接,路由器拨号上网。2、大多数路由器都有ddns功能,注册一个花生壳账号在路由器ddns登录,会有一个动态域名解析到你家路由器上。3、在路由器的端口映射上就可以随意配置你家内网设备和端口了。

上面的搞完之后,更多的玩法是可以在你家的服务器上跑一个lucky,上面解析一个域名,然后用各种二级域名代理你的服务。我就是这么弄的。

1 个赞

可以可以 非常强:+1:t2:

临时使用可以用下ngrok,有时候我本地起了个服务临时要给同事,这个就很方便