type
status
date
slug
summary
tags
category
icon
password
📝 前言
本文介绍外网访问的两种方式:
1.无公网IP,使用Cloudflare Tunnel。
2.有公网IP,使用Cloudflare代理,路由器的端口转发和DDNS。
以上两种方式都使用可以绕过80/443端口封禁,并且隐蔽原始的IP地址。
两种方式不冲突,可以同时使用(通过域名区分)。
最后通过安装Traefik插件,获取Cloudflare代理/隧道后面客户端的真实IP。
媒体服务等对带宽需求较大的不适合使用Cloudflare代理。
💻 Cloudflare Tunnel
使用 Cloudflare Tunnel,您可以运行cloudflared
服务,将位于内部网络的服务器安全地暴露在互联网上。例如,在您的内部网络上安装 后,您可以将您的本地 Web 应用程序暴露在互联网上,比如 example.com,使远程办公者可以在任何地方访问。
一、设置本地解析(自定义挟持域名)
假设Traefik本地IP为
192.168.1.80
,emby服务域名为https://emby.example.com
以下方法任选其一:
在路由器上设置(推荐)
因为各家路由器设置方法不一样,请自行搜索
路由器品牌或型号+自定义Hosts
,大部分可以找到对应的设置方法。下面列出部分路由器的设置方法
- 基于linux系统的路由,如OpenWrt固件、小米路由等:
大部分智能路由器是定制的linux系统,使用root账户登录SSH,修改/etc/hosts,重启生效。
- OpenWrt WEB:
网络→主机名→新增 或 网络→DHCP/DNS→自定义挟持域名
- 小米路由:
米家APP→路由器卡片更多操作→路由应用→自定义Hosts。
- 爱快固件:
网络设置→DNS设置→DNS设置→增加→填写要劫持的域名和IP→保存。
- 极路由:
在应用中心,安装自定义hosts,添加劫持,重启路由器即可。
- 斐讯路由:
功能设置→高级设置→HOST配置或高级设置→系统设置→系统参数→hosts配置,使用标准hosts格式。
- 潘多拉固件:
网络→DHCP/DNS→HOSTS和解析文件→自定义DNS解析,根据提示添加即可。
- 华硕梅林固件:
首先登陆路由器后台,在系统管理→系统设置中开启
JFFS
和SSH
,然后重启路由器。使用SSH登陆路由器,在
/jffs/configs
下建立dnsmasq.conf.add
文件,文件内容addn-hosts=/jffs/configs/hosts
在
/jffs/configs
下创建自己的hosts文件,按照标准hosts规则填写需劫持的域名,然后执行service restart_dnsmasq重启或者重启路由器即可生效。- 老毛子固件:
内部网络→DHCP服务器→自定义HOSTS文件→添加一行→保存,重启生效。
自建DNS服务
DNS服务器需要长期稳定运行,有条件的可以装一个AdGuard-Home。
- AdGuard-Home:
AdGuard-Home使用Docker部署时,需分配固定IP,并将路由器的首选DNS设置为该IP。
主页→过滤器→DNS重写
- Dnsmasq:
在
/etc/dnsmasq.conf
添加一行:address=/example.com/192.168.1.80
- SmartDNS:
- /domain/为后缀匹配算法,范围包含其子域名。
- ip: 可以为IPV6,或IPV4地址,可以指定多个IP地址,如果有多个IP地址,查询的时候,将会进行随机排序。
域名地址添加一行:
address /example.com/192.168.1.80
address选项中:
前缀通配与主域名匹配
// 通配
*-a.example.com
// 仅匹配子域名
*.example.com
// 仅匹配主域名
-.example.com
注意:* 和 - 仅支持写在域名开头。其他位置的写法均不支持。
添加记录到容器hosts
仅cloudflare tunnel使用,内网访问需额外设置。
在cloudflared容器的高级视图中
额外参数
后面加上--add-host='emby.example.com:192.168.1.80'
二、创建隧道
- 登录至Zero Trust,然后转到Access>Tunnels。
- 选择“Create a tunnel”。
输入隧道的名称。例如
myhome-VPC-01
。- 保存好红框中的token。
- 添加“Public hostnames”
这里的Service指的是内网服务地址,如果经由Traefik则必须使用域名。也可以跳过Treafik,使用
http
://unraid_ip:port
三、安装cloudflared
- 找到cloudflared点击安装
- 打开高级视图修改
发布参数
,与创建隧道时生成的命令一致(tunnel --no-autoupdate run --token <YourToken>
)。并在br0
网络分配一个IP。
此IP需要添加到Traefik受信任的IP列表中traefik.yml:
- 启动容器
注意
cloudflared使用QUIC协议,如果路由器上运行有openclash,建议关闭UDP流量转发或排除cloudflared,否则可能会连接失败。
四、完成
Tunnel状态变为HEALTHY就完成了。
🌐 Cloudflare 代理
一、端口转发设置
在路由器
网络
-防火墙
-端口转发
中新增一条转发将路由器WAN口的8443
端口的流量转发到Traefik(192.168.1.80)的443
端口。其中8443
也可以是其他Cloudfare支持的流量代理端口。Cloudfare默认情况下支持流量代理端口如下:
HTTP端口
- 80
- 8080
- 8880
- 2052
- 2082
- 2086
- 2095
HTTPS端口
- 443
- 2053
- 2083
- 2087
- 2096
- 8443
二、DDNS设置
- 添加一个用于DDNS的记录
名称
这里使用随机生成的字符串。IPv4地址
目前可以随便填,注意要取消Cloudflare代理。为什么要单独添加一个DDNS的记录?
为了避免与Cloudflare API不必要的交互,详细的解释可以看这篇文章。
- 添加一个CNAME记录
为了以后不用每新增一个服务就新增一个域名,
名称
这里使用了泛域名*
。目标
则是上一步中的完整域名,并且开启Cloudflare代理。泛域名
泛域名指在一个根域名之下,所有未建立的子域名的合集。如果某子域名已经存在,那么不在此列之中。
利用通配符
*
(星号)来做次级域名以实现所有的次级域名均指向同一IP地址。- 设置DDNS
在路由器的动态DNS中新建一个条目,
域名
中的主机名与域名使用@
而不是.
分隔。- 完成
等待几分钟后,前面手动设置的192.168.1.10,已经自动更新为本地公网IP。
三、Origin Rules设置
在Cloudflare中找到Origin Rules设置
创建一条端口改写规则,将目标端口重写到
8443
。这里的匹配规则可以根据需求自行设置。四、完成
这个方法相较于Workers没有每日次数限制, 相对来说也更优雅, 还提供了DDoS防护和CDN缓存, 如果觉得慢还可以关闭缓存, 只用cast IP当跳板
最后: 根据评论所说,建议开启DNSSEC和端到端(FULL)加密。
👥 真实IP
如果Traefik位于Cloudflare代理/隧道后面,它将无法从外部客户端获取真实IP以及其他信息。基于客户端IP的部分功能无法生效,如CrowdSec等。
所以我们还需要安装
Real IP from Cloudflare Proxy/Tunnel
插件来获取客户端真实IP。在下方找到此插件
该插件通过CF-Connecting-IP覆盖X-Real-IP和X-Forwarded-For来解决此问题。
如果请求来自Cloudflare,则真实IP将是Cf-Connecting-IP(在配置文件中的最可信IP)。
该插件还将CF-Visitor方案写入X-Forwarded-Proto。(这解决了在使用CF[443]→PROXY/隧道→Traefik[80]→WP[80]时,WordPress出现的无限重定向问题)
插件安装
在静态配置文件中:
在动态配置文件中:
完成
可以看到插件安装好后,X-Real-IP已经是客户端的真实IP了。
📎 参考文章
有关Cloudflare使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:Biliko
- 链接:https://biliko.net/article/traefik-part7
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章