利用frp实现外网对内网机器进行远程桌面

最近组建了一台低功耗的新电脑用来跑一些需要常开的程序和虚拟机,新年的时候回家后想远程连回去操作一下,于是事先配置了下。

远程工具采用的是frp,frp 是一个反代工具,一些人做微信小程序这类限制比较多的开发时,经常用 frp 把内网开发端口直接反代到外网域名上方便连接和调试。

此处从外网进行远程桌面连接也是同理,只是我们反代的不是 http 端口,而是直接做 tcp/udp 转发。

Windwos 远程桌面连接支持 TCP,不过默认使用 UDP,速度会更快。

首先在服务器上做配置,frp 官方有提供二进制文件,我为了配置方便直接使用 Docker,因为服务器使用了 GCE 的容器优化形镜像,使用二进制文件反而更麻烦。

使用的 frp 是第三方的,不过因为 dockerfile 是开源的,构建也是自动化的,不会有什么问题。

首先先写好 docker-compose 的配置:

version: '3'
services:
    caddy:
        image: abiosoft/caddy
        volumes:
            - ./.caddy:/root/.caddy
            - ./Caddyfile:/etc/Caddyfile
        ports:
            - '80:80'
            - '443:443'
        depends_on:
            - frp
            - frpc
        restart: always
    frp:
        image: hyperapp/frp
        ports:
            - '服务器端口号:1080'
            - '服务器端口号:1080/udp'
        entrypoint:
            - /frps
            - -c
            - frps.ini
        volumes:
            - ./frps.ini:/frps.ini
        restart: always
    frpc: # 让远程桌面可以直接通过服务器ip连接
        image: hyperapp/frp
        entrypoint:
            - /frpc
            - -c
            - frpc.ini
        ports:
            - '3390-3391:3390-3391'
            - '3390-3391:3390-3391/udp'
        volumes:
            - ./frpc.ini:/frpc.ini
        restart: always
yaml

这里除了 frp 外还使用了 caddy 用来提供 frp 控制台(虽然只能看统计)

接下来是 frp 的配置,两个配置文件都放在服务器上,十分简单,记得把备注了的地方改掉:

frps.ini

[common]
bind_addr = 0.0.0.0
bind_port = 1080
kcp_bind_port = 1080
#如果不需要控制台,前面的caddy整段和下面以dashboard开头的几个参数都可以去掉
dashboard_addr = 0.0.0.0
dashboard_port = 80
# 控制台的用户名和密码,记得改掉
dashboard_user = admin
dashboard_pwd = password
log_file = ./frps.log
log_level = info
log_max_days = 3
# 记得把token改成其他的
token = 12345678
max_pool_count = 100
max_ports_per_client = 100
authentication_timeout = 900
tcp_mux = true
ini

frpc.ini

[common]
server_addr = frp
server_port = 1080
token = 12345678 # 要与上面的token一致
use_encryption = true
use_compression = true

[desktop_visiter]
type = stcp
role = visitor
# 把sk改成其他的
sk = 0000
server_name = desktop
bind_addr = 0.0.0.0
bind_port = 3390

# 还可以反代ss,直接通过ss访问内网服务
[ss_visitor]
type = stcp
role = visitor
# 要与上面的sk一致
sk = 0000
server_name = ss
bind_port = 3391

[torrent_visitor]
type = stcp
role = visitor
# 要与上面的sk一致
sk = 0000
server_name = torrent
bind_addr = 0.0.0.0
bind_port = 80
ini

Caddyfile

http://你的ip {
  # 因为前面torrent_visitor直接绑定到80端口,所以我们可以直接通过docker服务名访问
  proxy /gui http://frpc {
    transparent
  }
  proxy /frp http://frp {
    without /frp
    transparent
  }
  proxy /static http://frp {
    transparent
  }
  proxy /api/serverinfo http://frp {
    transparent
  }
  proxy /api/proxy http://frp {
    transparent
  }
  proxy /api/traffic http://frp {
    transparent
  }
}

前面四个文件全部放在同一个目录,然后使用 docker-compose up -d 启动即可。

最后是客户端上的配置:

frpc.ini

[common]
server_addr = 服务器ip
server_port = 服务器端口号
# 要与上面的token一致
token = 12345678
use_encryption = true
use_compression = true

[desktop]
type = stcp
# 要与上面的sk一致
sk = 0000
# 由于我是放在树莓派上运行,所以这里写的是台式机的内网ip,如果是本机直接运行frp,则直接填127.0.0.1
local_ip = 192.168.0.64
local_port = 3389

# ss反代
[ss]
type = stcp
# 要与上面的sk一致
sk = 0000
# 跑在docker上,所以直接用服务名访问
local_ip = ss
local_port = 1080

# utorrent控制台反代
[utorrent]
type = stcp
# 要与上面的sk一致
sk = 0000
# 同样跑在docker上
local_ip = utorrent
local_port = 1080
ini

在本地机器上运行命令:

frpc -c frpc.ini
sh

即可完成启动,至此在外网我们可以直接通过:

服务器 ip:3390 访问内网远程桌面

服务器 ip:3391 连接 ss 并访问内网服务

http://服务器ip 访问 frp 控制台

http://服务器ip/gui 访问 utorrent 进行远程下载