boxmoe_header_banner_img

欢迎来到Kunger的博客

加载中

文章导读

通过cloudflared实现TCP隧道


avatar
Kunger 2023年3月22日 5.41k


cloudflare是一个免费的CDN提供商,曾经很多人使用cloudflare的优选IP进行科学上网。不过很可惜,现在cloudflare的大部分IP都被联通采取了不定时阻断的策略,一旦有大流量,就会空路由一段时间,所以优选IP科学上网算是没戏了。不过还提供了很多服务,基于cloudflare的全球边缘节点,仍然可以做很多事情。

今天要讲的是通过cloudflare的zerotrust服务中的cloudflare tunnel(也曾叫做argo tunnel)创建TCP隧道。使用cloudflared隧道大洞的好处是,不需要暴露公网IP,或者说不需要公网IP。这样做,可以有效减少服务器被攻击的风险。cloudflare的zero trust是一个很庞大的体系。包括了利用warp组建私有网络等功能,不过今天不去讲那些高深的功能了。

随着版本的迭代,目前cloudflared的边缘节点已经支持IPv6了,这样,我们就可以很轻松的将纯IPv6的节点通过cloudflared映射出来。

建立隧道或是映射,我们需要注册一个cloudflare账户,同时为了使用access功能访问TCP端口,我们还需要在控制台开启zero trust服务。开启zero trust服务需要绑定支付方式,可以使用PayPal或是信用卡。这个过程不会产生费用。

进入到zero trust控制台后,在access中选择tunnel,创建tunnel有两种方法,一种是通过控制台创建,另一种是通过命令行创建。通常我推荐使用web控制台创建,有界面的创建方式更简单一些,稍后我也会讲到通过命令行创建隧道。

首先点击access中的隧道,并创建新的隧道。

然后输入隧道名称

最后选择对应的系统版本以及架构。并执行运行命令。需要注意的是通过生成的安装命令(包管理器安装)的不能使用cloudflared update进行升级,所以建议到github下载最新版本安装,或是将cloudflare的源加入到包管理器。
https://github.com/cloudflare/cloudflared

执行安装命令后,cloudflared会自动安装成系统服务,并开机自启。如果你是纯IPv6环境或是套了warp,这边建议使用原生的IP去连接cloudflare的边缘节点以达到最大速度。cloudflared默认使用IPv4连接到边缘节点。如果需要修改成IPv6,可以修改systemd的服务或直接运行时通过--edge-ip-version 6来指定。一旦修改服务,不要忘记重启服务。

systemd服务文件位于:/etc/systemd/system/cloudflared.service

执行完安装工作后,服务器应该会自动连接到cloudflare的边缘节点,同时页面上也可以看见连接到边缘的服务器信息了。

点击下一步开始配置要映射的服务,http业务可以直接映射出来,TCP服务必须通过隧道(需要在对端安装cloudflared),同时也可以设置回源host,连接超时,保活的包时间等等。

cloudflared连接边缘节点默认使用quic,如果服务器UDP质量不佳,应该手动指定protocol(--protocol [quic/h2mux/http2/auto]

Kunger

完成服务映射后,即可保存隧道。如果你希望映射http服务出来,接下来就是绑定域名了。通过zero trust页面创建的隧道,会自动创建DNS记录,如果你没有通过NS接入cloudflare则需要手动到DNS服务商去添加一下记录。

域名解析生效后,如果映射的是http服务,那么应该已经生效了,如果出现错误,可以查看cloudflared的日志,通常情况是映射https服务,源站的证书不受信任,需要使用可信的证书或者是cloudflare办法的源证书。

如果映射的是TCP服务,接下来需要到对端(访问端)进行处理。对端也需要安装cloudflared,由于对端不安装服务,则需要通过命令行登录cloudflared。在对端执行cloudflared login 并复制生成的登录链接到浏览器进行认证就可以。

对端登录后执行 cloudflared access tcp --hostname [绑定的域名] --url [监听地址] 就可以通过cloudflared的隧道访问映射的TCP服务了。我这边映射了iperf3通过隧道访问,测试得到的结果隧道内的速度大约在100M左右。

如果不想通过web端进行配置,可以通过命令行进行配置。在映射端执行cloudflared login进行登录

使用如下命令创建隧道,并记录UUID

cloudflared tunnel create

执行如下命令运行隧道

cloudflared tunnel run --url tcp://localhost:3000

使用cloudflared创建的隧道,不会自动创建对应的记录,需要手动在cloudflare中创建记录,将你希望使用的子域名CNAME指向UUID.cfargotunnel.com
如果没记UUID,可以到zero trust的web控制台找到,或者使用命令命令查找。

cloudflared tunnel list

cloudflare提供的隧道服务还是很方便的,并且依托cloudflare在全球的节点,可以说在绝大多数国家,访问cloudflare的隧道都是非常快速的。虽然在国内速度不如意,但是在国外VPS上的体验还是很不错的。

Img@PixivID:106396383[ボタン@ぽんゆい]



评论(6)

查看评论列表
评论头像
幸福的井底蛙 2023年04月29日
如果用tunnel访问内网已有的tcp服务器端口该怎么设置呢
评论头像
Kunger 博主 2023年04月29日
本文不就是写的如何访问内网的服务么。 内网端执行cloudflared tunnel run --url tcp://localhost:3000或者在Web配置内网的服务器后,需要访问的设备执行cloudflared access tcp --hostname [绑定的域名] --url [监听地址]
评论头像
guagua 2023年07月16日
访问速度会不会很慢,隧道容易被墙吗
评论头像
gege 2024年10月09日
大佬,我安装了cloudflared颁布的源证书 , 但是连接映射端口以后还是会出现 ERR failed to connect to origin error="websocket: bad handshake" originURL=https://*** , 这该怎么解决啊
评论头像
游客 2025年02月27日
cloudflared tunnel tcp没提供移动端的解决方案啊,比较鸡肋了
评论头像
ld 2025年03月23日

此评论仅作者可见


发表评论

表情 颜文字
插入代码