利用公有云穿透至家庭服务器并对外提供服务
利用公有云穿透至家庭服务器并对外提供服务
我是一个喜欢折腾的人,但是也仅限于享受折腾的过程,很多时候折腾完了就扔在了一边,也没有记录的习惯。这导致下次再遇到相同问题的时候还需要再次翻资料,所以在发现了shiro之后便有了记录解决问题的习惯。
言归正传,我们都知道公有云的服务器价格都不低,但是配置却一般,不过最吸引人的在于它拥有固定IP以及80和443端口(前提需要备案)。于是乎我们是否可以借助公有云的资源将流量穿透到家庭服务器,答案是可以的。
这次借助的工具是frp.frp分为客户端和服务端,服务端部署在公有云的服务器上,客户端部署在自己的服务器上。我们首选在公有云服务器安装frp,安装过程见官方文档,建议加入systemd,方便启动,我这边只展示相关配置,我在服务端定义配置文件为 frps.toml:
bindPort = 7000
auth.token = "<your token>"服务端配置很简单,启动之后会占用7000端口。接下来在自己的服务器上同样下载frp,配置文件名称设置为 frpc.toml:
serverAddr = "<your server ip>"
serverPort = 7000
auth.token = "<your token>"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 8000
[[proxies]]
name = "80"
type = "tcp"
localIP = "127.0.0.1"
localPort = 30871
remotePort = 80
transport.proxyProtocolVersion = "v2"
[[proxies]]
name = "443"
type = "tcp"
localIP = "127.0.0.1"
localPort = 30166
remotePort = 443
transport.proxyProtocolVersion = "v2"
[[proxies]]
name = "6443"
type = "tcp"
localIP = "127.0.0.1"
localPort = 6443
remotePort = 6443简单解释下配置文件含义,第一个proxies协议为四层网络协议TCP类型,代表本地服务器和云厂商服务器通过8000端口穿透,即访问远端服务器的8000端口时,会代理到本地服务器的22端口,所以在使用ssh命令连接远端服务器的8000端口时,会自动连接到家庭服务器的ssh。以下三个proxies配置同理。
我在80和443的proxies上增加了一行transport.proxyProtocolVersion = "v2",这个目的是为了让经过穿透后的请求到达后端时,依旧能识别出remote ip。因为我我的本地服务是个k3s集群,由ingress-nginx作为网关,safeline作为防火墙,加上这行配置可以让safeline识别到远端的真实ip。后面有机会单独写一篇文章描述下相关配置。