需求
做frp内网穿透时,有一台放在家里的server,仅有公网的IPv6地址。
另外有一台client在内网里。希望通过公网v6的server完成frp内网穿透的搭建。
参考内容:
[1] Github Project Issues, "IPv6访问 #111", https://github.com/fatedier/frp/issues/111
[2] Github Project Issues, "ipv4和ipv6同时生效如何配置 #733", https://github.com/fatedier/frp/issues/733
[3] Github Project Issues, "IPV6是否支持 #2634", https://github.com/fatedier/frp/issues/2634
[4] 官方文档, https://gofrp.org/docs/examples/
其中前三个是有关frp的讨论。最后一个官方文档贴上来,方便没有配置过frp的同学作参考。
预备知识:frp运转逻辑
了解frp的同学请直接跳过,进到下一步。
frp主要做的是内网穿透。举例来说,你有一个client,想要访问它,但因为各种各样的原因你没办法在公网上访问到你的client(可能是因为没有公网IP,也可能是因为防火墙的原因),但你的client却又能主动上互联网,那么这个时候就可以用一个有公网ip的server做中转,这样你就可以通过一个转发访问到你的client了。一个基本的示意图如下所示。
当然这是最基本的一个逻辑。从图上看,你在于client做交互时还是需要经过server,这样server带宽压力会比较大。不过现在frp好像还支持XTCP这种可以做P2P交互的协议,这样需要你在User上也部署一个frpc。本文暂时没有做进一步探讨。
IPv6模式下frps的配置
首先需要确认你的server和client支持IPv6的访问和DNS解析。这一部分不做过多赘述。
目前frp好像完全支持IPv6,主要修改的部分为:
- client端,
server_addr
部分写成IPv6地址。 - server端,
bind_addr
部分监听IPv6的本地地址。
举例来说,我这里绑定了一个域名summer.114514.love
,那么我两个部分应该写成如下形式:
# --- frpc.ini --- on client --- #
server_addr = [summer.114514.love]
# --- frps.ini --- on server --- #
bind_addr = ::
建议绑定一个域名,毕竟IPv6地址总变。这里放一个自己写的参考文章:基于Cloudflare DNS 部署 IPv6 DDNS
其它部分正常配置即可。我们假设上一节的图就是我们的需求,则在这种情况下两个配置文件分别写为:
# --- frpc.ini --- on client --- #
[common]
server_addr = [summer.114514.love]
server_port = 7000
token = nnnaaaAAAA!!!!
[ssh-self]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 10022
[ssh-other]
type = tcp
local_ip = 192.168.1.114
local_port = 51419
remote_port = 11451
# --- frps.ini --- on server --- #
[common]
bind_addr=::
bind_port = 7000
token = nnnaaaAAAA!!!!
dashboard_port = 7500
dashboard_user = senpei
dashboard_pwd = 1145141919810blacktea
enable_prometheus = true
具体的设置逻辑和v4的情况下没什么不同。例如token两边需要一样之类的。
另外在具体使用的时候,与server相连这一部分使用任何一种协议都是可以的。比如对于我来讲,我的server就是一个放在家里的树莓派,它只有公网的IPv6地址而没有公网IPv4地址。我们假设它的内网IP为10.19.19.114
,那么如果你在同一个内网下,下面两种方式都是可以的:
ssh senpei@summer.114514.love -p 10022
ssh senpei@10.19.19.114 -p 10022
其它小坑
如果你和我一样,是用一台放在家里的小server来跑,请注意设置一下你路由器的防火墙设置,将相应的端口放行。
以上。