有需求将自己的nas还有一些内网服务穿透到外网进行访问,但是苦于ipv4地址枯竭,没有获取到公网ipv4,ipv6的普及性又不多,机缘巧合之下,了解到了cloudflare tunnel服务,发现是免费的,仔细了解了下,并记录下自己的配置过程。

安装

前置条件

  1. 你必须要有一个域名,并且NS在CloudFlare下,也就是DNS解析
  2. 一台可以访问互联网的Linux服务器(不需要公网IP)
  3. CloudFlare账户,同时需要绑定PayPal账户,所以你还需要一个PayPal账户
  4. 一些基础的Linux知识
如果有疑惑,可以在下面留言,博主收到邮件后会进行解疑。

准备CloudFlare账户

请先前往CloudFlare面板注册一个账号,随后将域名绑定,这里不做叙述,百度均有详细教程。

随后进入Cloudflare Zero Trust 控制面板,首次访问会提示绑定信用卡,这里选择PayPal账户即可,同时选择Free Plan白嫖即可。

至此,账户与域名准备就完成,下面开始在Linux服务器上安装Cloudflared

安装Cloudflared

其实安装教程官方已经给的非常详细了,基本都是无脑输入命令即可,这里贴出Debian的详细安装方法,教程源自官方文档

连接上你的SSH,以此执行下面命令即可:

# Add cloudflare gpg key
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# Add this repo to your apt repositories
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared buster main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# install cloudflared
sudo apt-get update && sudo apt-get install cloudflared

这样就安装上了CloudFlared了,安装完毕之后,进行配置与转发。

附:Github开源地址

配置与转发

tunnel有两种配置方式,一种是通过 cloudflare 控制台,另一种是通过命令行。我使用的是命令行,比较方便。

以下示例使用 debian 作为服务器的用户名,example.com 作为域名)

创建tunnel

# 登录CloudFlare
cloudflared tunnel login

登录之后,会在/root/.cloudflared下创建一个cert.pem文件,该文件存储着你的登录信息

# 创建一个tunnel,名字自定,这里用debian
cloudflared tunnel create debian

执行cloudflared tunnel list显示 debian 的 ID:

root@debian:~ $ cloudflared tunnel list
ID                                   NAME    CREATED              CONNECTIONS
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx debian 2023-12-09T11:26:41Z 2xLAX, 2xSJC

记住这个id,稍后会用到,该xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json文件在root目录下,请记得检查是否存在该文件,如果不存在,请尝试删除

新建配置文件,vim ~/.cloudflared/config.yml

将上面获得的ID复制到下面两个对应位置上,随后修改你想映射的服务,例如我这里映射了ssh、vnc、还有一些http服务,具体支持那些服务,请查询官方文档。

此处内容需要评论回复后(审核通过)方可阅读。

本地运行的服务做到端口不重复即可无限内网穿透出去。

新建一个脚本文件,自动更新设置的DNS以及运行tunnel服务,vim ~/tunnel-sh.sh

# update cloudflare DNS record
/usr/bin/cloudflared tunnel route dns debian ssh.example.com
/usr/bin/cloudflared tunnel route dns debian vnc.example.com
/usr/bin/cloudflared tunnel route dns debian mc.example.com
/usr/bin/cloudflared tunnel route dns debian file.example.com
/usr/bin/cloudflared tunnel route dns debian speed-test.example.com
# run tunnel
/usr/bin/cloudflared tunnel run my-tunnel

文件信息

设置开机自启动,sudo vim /etc/systemd/system/cloudflared-tunnel.service

[Unit]
Description=cloudflared tunnel
Wants=network-online.target
After=network-online.target
StartLimitInterval=300

[Service]
User=root
ExecStart=sh /root/.cloudflared/tunnel-sh.sh
# 如果启动失败,自动重试,因为开机自启大概率报错网络问题
Restart=always
RestartSec=30

[Install]
WantedBy=default.target

启动服务 & 设置开机自启

sudo systemctl start cloudflared-tunnel.service
sudo systemctl enable cloudflared-tunnel.service

所有步骤完成后,便可以方式访问网站进行测试,是否成功映射出去了。访问http://file.example.com/img相当于访问了局域网内的http://127.0.0.1:10086/img。至此,Linux服务器下的CloudFlare tunnel配置完毕。

SSH访问配置

需要在客户端安装cloudflared,安装方式和上面一样,我的客户端是Windows,下载cloudflared-windows-amd64.exe文件,然后新建一个SSH配置

Host ssh.example.com
  # 把 D:\tools\cloudflared-windows-amd64.exe 改成你自己的目录
  ProxyCommand D:\tools\cloudflared-windows-amd64.exe access ssh --hostname %h

使用 ssh [email protected] 即可 ssh 登录。

VNC远程桌面

客户端使用vnc远程桌面访问服务器 (服务器需要开启vnc server),需要先在客户端的命令行里执行

cloudflared access tcp --hostname vnc.example.com --url tcp://localhost:5901

这条命令把vnc.example.com(对应服务器的tcp://localhost:5900)映射到客户端本地的tcp://127.0.0.1:5901。然后我们用vnc viewer,或者其他 vnc 软件,使用 127.0.0.1:5901 登录 VNC。

使用浏览器访问SSH与VNC服务

浏览器本身不支持sshvnc,但是cloudflareapplication提供了ssh和vnc浏览器访问功能。

首先创建一个 application,域名输入刚刚配置的vnc.example.com,在Settings界面选择Browser renderingVNC

保存后,访问http://vnc.example.com,输入密码登陆即可登录VNC。

SSH同理
最后修改:2024 年 04 月 11 日

感谢看完,可以点个赞~请作者喝杯咖啡~ヾ(◍°∇°◍)ノ゙❤