【Network】通过反向代理实现内网穿透

Posted by 西维蜀黍 on 2020-03-22, Last Modified on 2022-12-10

Background

树莓派通常会(通过LAN 或者 WIFI)连接到一个路由器上,如果我们不方便在路由器上配置端口映射(或者这个路由器之外还有另外的 NAT),当我们不在这个内网时,就无法管理我们的树莓派。

这时候,我们可以考虑使用用于内网穿透的反向代理应用。

如果你有一个拥有公网 IP 的机器,比如云主机、VPS 等。那么最稳定的方式就是在这个机器上自己架设中转节点。

Approach1 - frp

Architecture

原生

配置并启动 server

https://github.com/fatedier/frp/releases 下载,我的server 是 Mac,所以选择 frp_0.31.1_darwin_amd64.tar.gz

修改 frps.ini 文件,这里使用了最简化的配置:

# frps.ini
[common]
bind_addr = xxx.xxx.xxx.xxx # 你的 frp server 的公网 IP
bind_port = 7000

# Optional
dashboard_port = 7500
dashboard_user = <你的仪表盘用户名>
dashboard_pwd = <你的仪表盘密码>

# Optional, for security reasons
privilege_token = <u5gYrhw!k$3R6%!t>

注意,

  • xxx.xxx.xxx.xxx为 frps 所运行机器的公网 IP。
  • 配置 dashboard_port、dashboard_user、dashboard_pwd信息后,可以更方便查看流量信息。
  • privilege_token是验证凭据,服务端和客户端的凭据必须一样才能连接,当然为了安全还是设置长一点。

启动 frps:

$ ./frps -c ./frps.ini

配置并启动 client

我的 client 在树莓派,所以选择https://github.com/fatedier/frp/releases/download/v0.31.1/frp_0.31.1_linux_arm.tar.gz

修改 frpc.ini 文件,xxx.xxx.xxx.xxx 处填写你的 frp server 的公网 IP:

# frpc.ini
[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
# Optional, for security reasons
privilege_token = u5gYrhw!k$3R6%!t

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

启动 frpc:

$ ./frpc -c ./frpc.ini

通过 ssh 访问内网机器,<the user of ssh> 为

$ ssh -oPort=6000 <the user of ssh>@xxx.xxx.xxx.xxx

# e.g.,
$ ssh -oPort=6000 test@xxx.xxx.xxx.xxx

通过 dashboad 可以查询流量信息:

使用 Docker

下载镜像导入 从项目中下载docker images后导入,阿里云镜像下载:

wget --no-check-certificate https://code.aliyun.com/clangcn/frp-docker/raw/master/frps-docker/frps-docker.tar

github镜像下载地址:

wget --no-check-certificate https://github.com/clangcn/frp-docker/raw/master/frps-docker/frps-docker.tar

镜像导入命令

docker load < frps-docker.tar

启动命令

docker run -h="frps-docker" --name frps-docker -d \
-p 6443:5443/tcp \
-p 6443:5443/udp \0.

-p 7443:5445/tcp \
-e set_token=password \
-e set_log_level=info \
-e set_log_max_days=3 \
"frps-docker:latest"

端口说明

Docker内定义 Docker内默认值 描述
bind_port 5443(TCP) frps服务端口
kcp_bind_port 5443(UDP) KCP加速端口
bind_udp_port 5444(UDP) udp端口帮助udp洞洞穿nat
dashboard_port 5445(TCP) Frps控制台端口
vhost_http_port 80(TCP) http穿透的端口。
vhost_https_port 443(TCP) https穿透服务的端口

变量说明(变量名区分大小写)

变量名 默认值 描述
set_token password frps的认证密码,用于客户端连接
set_subdomain_host frps子域名设置,默认为空,可以输入类似abc.com这样的域名
set_dashboard_user admin frps控制台用户名
set_dashboard_pwd admin frps控制台密码
set_max_pool_count 50 最大连接池数,貌似不用这个了
set_max_ports_per_client 0 允许连入的最大客户端,0为不限制
set_authentication_timeout 900 验证时间,单位为秒,默认900s
set_log_level info 日志等级,可选项:debug, info, warn, error
set_log_max_days 3 日志保存天数,默认保存3天的
set_tcp_mux true TCP 多路复用

安装

sudo chmod 777 /var/run/docker.sock

Approach2 - ngrok

进入 ngrok.com,注册并登录,下载ngrok,树莓派选择 Linux(ARM)

$ unzip /home/pi/Downloads/ngrok.zip
$ cd /home/pi/Downloads

访问 https://dashboard.ngrok.com/,以获得 authtoken。

$ ./ngrok authtoken <your authtoken>

// e.g.,
$ ./ngrok authtoken 1WqMjP9yw0fsseUdb6tVdUNgTiN_56d8svuRSDF142bDorTgg

运行 ngrok:

$ ./ngrok tcp 22

我们需要记住Forwarding这行。

当你在外网时,访问这个树莓派的ssh的方式:

$ ssh <your respaberry acount>@<domain and port>

// e.g.,
$ ssh pi@0.tcp.ngrok.io -p 11911

Approach3 - 花生壳

下载:http://hsk.oray.com/download/download?id=25

在树莓派上下载安装包后,通过cd命令进入对应下载目录,输入下面的命令进行安装:

$ dpkg -i phddns_rapi_3.0.3.armhf.deb
+--------------------------------------------------+
|           Oray PeanutHull Linux 3.0.4            |
+--------------------------------------------------+
|  SN: RAPI60c80c54ecac   Default password: admin  |
+--------------------------------------------------+
|    Remote Management Address http://b.oray.com   |
+--------------------------------------------------+

启动:

$ phddns start
sudo chmod 777 /var/run/docker.sock

在服务器端部署frps

docker run --network host -d -v /etc/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps

在客户端部署frpc

docker run –network host -d -v /etc/frp/frpc.ini:/etc/frp/frpc.ini –name frpc snowdreamtech/frpc

Reference