0%

frp + OpenSSH通过服务器远程连接Windows电脑

  1. 需求与设计
  2. 中转服务器frps安装和配置
    1. 下载frp
    2. 解压
    3. 中转服务配置
    4. 启动服务
    5. 添加到系统服务并设置开机运行
    6. 开启防火墙端口
  3. 被控端Windows配置
    1. 开启OpenSSH服务端
    2. 被控端配置frpc
    3. 控制端配置frpc
    4. Windows frpc客户端持久化运行
  4. 控制端VS Code开启免密登录
    1. 控制端操作
    2. 被控端设置允许密钥对登录
    3. 连接

需求与设计

需求:在家通过ssh连接公司电脑(Windows系统)进行开发

设计:使用公网服务器(Ubuntu)安装frps做中转,公司电脑(Windows)安装frpc客户端以及OpenSSH-server作为被访者,家里电脑(Windows)安装frpc客户端以及OpenSSH-client作为访客。

中转服务器frps安装和配置

下载frp

下载页面:Releases · fatedier/frp (github.com)

服务器操作系统是Ubuntu,选择linux amd64进行下载,下载链接:

https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz

通过网络下载:

1
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz

下载到本地再拷贝过去(scp命令:scp [local_file] [remote_user]@[ssh_address]:[remote_path]):

1
scp frp_0.43.0_linux_amd64.tar.gz user@ip:/etc/frp

解压

1
2
tar -xf *.gz # 全部解压,省得输文件名
tar -xf frp_0.43.0_linux_amd64.tar.gz # 单独解压

-x取出文件

-f指定文件名

两个参数缺一不可。解压后:

image-20220612183927563

中转服务配置

1
2
3
4
5
6
7
# frps.ini
[common]
bind_port = 12301

dashboard_port = 12302
dashboard_user = user
dashboard_pwd = pwd

其他客户端通过bind_port连接中转服务器

dashboard是frp运行状态的检查面板,也可以在这里查看代理数据的统计,dashboard_配置了其运行的端口、用户名和密码

完整配置在压缩包的”frps_full.ini”文件中,参考frp/frps_full.ini at dev · fatedier/frp (github.com)

启动服务

打开命令行,进入解压后的目录执行以下命令即可启动。

1
./frps -c ./frps.ini

添加到系统服务并设置开机运行

使用 systemd | frp (gofrp.org)

在目录/etc/systemd/system中添加文件frps.service,写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.ini

[Install]
WantedBy = multi-user.target

启动服务:

1
2
3
systemctl start frps
# 或者
service frps start

查看并设置自动启动:

1
2
3
4
5
6
systemctl is-enabled frps
# disabled
systemctl enable frps
# Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /etc/systemd/system/frps.service.
systemctl is-enabled frps
# enabled

输入systemctl status frpsservice frps status,查看运行状态:

image-20220612223652625

开启防火墙端口

1
2
firewall-cmd --add-port=[port]/tcp --permanent
firewall-cmd --reload

被控端Windows配置

开启OpenSSH服务端

在Windows-设置-应用-可选功能,添加可选功能,选择OpenSSH服务器,安装:

image-20220612224220732

右键“计算机”,管理,服务,找到“OpenSSH SSH Server”,启动并设置开机自动启动:

image-20220612225714273

在命令行输入ssh [用户名]@localhost,并输入当前用户的密码,即可通过ssh登录当前用户:

image-20220612225904597

被控端配置frpc

使用私有化连接方式,被控端frpc.ini配置:

1
2
3
4
5
6
7
8
9
10
# frpc.ini
[common]
server_addr = 中转服务器ip
server_port = 中转服务器绑定的端口

[secret_ssh]
type = stcp
sk = 密钥
local_ip = 127.0.0.1
local_port = 22

该项配置将被控端的22端口暴露给中转服务器,其他客户端通过中转服务器,认证通过密钥后,即可连接该被控端。

运行./frpc.exe -c ./frpc.ini,即可启动。

控制端配置frpc

1
2
3
4
5
6
7
8
9
10
11
12
# frpc.ini
[common]
server_addr = 中转服务器ip
server_port = 中转服务器绑定的端口

[secret_ssh_visitor]
type = stcp
role = visitor
server_name = secret_ssh
sk = 密钥
bind_addr = 127.0.0.1
bind_port = 6000

运行./frpc.exe -c ./frpc.ini,在命令行输入ssh -oPort [用户名]@127.0.0.1,即可进行ssh连接。

Windows frpc客户端持久化运行

NSSM - the Non-Sucking Service Manager

下载后解压nssm-2.24.zip,打开命令行cd到该文件夹下的win32win64文件夹中,执行以下命令:

1
./nssm.exe install CustomService

这句话的意思是将要在添加一个名为CustomService的系统服务,运行后会弹出一个对话框,选择程序目录、程序名称、输入命令行参数等,全都输入完毕再点击“确定”,即可添加服务。

输入frpc.exe的程序目录以及配置文件参数:

image-20220612233410906

然后打开计算机管理,找到服务nssmFrpc22,启动服务并设置开机自启动,被控端的配置就算完成。控制端的frpc配置与被控端的一致。

控制端VS Code开启免密登录

主要针对控制端,连接时省得输入密码

控制端操作

生成密钥对(使用git bash):

1
ssh-keygen -t rsa -C "example@abc.com"

命令执行期间需要输入密钥对的名称,假设为id_rsa

生成后,将得到id_rsaid_rsa.pub,前者是私钥,后者是公钥。将私钥文件拷贝到用户文件夹的.ssh文件夹中

打开VS Code,确保安装插件Remote - SSH(ms-vscode-remote.remote-ssh)后,点击左下角,并选择“Connect to Host…”,点击“Add New SSH Host…”,输入ssh -oPort=6000 [被控端用户名]@127.0.0.1,将该配置添加到[用户文件夹]/.ssh/config文件中,随后VS Code打开该文件,找到刚刚添加的条目,加上字段IdentityFile,将其设置为私钥文件的路径,如下图所示:

image-20220612235338175

最后将id_rsa.pub文件中的公钥字符串拷贝到被控端[用户文件夹]/.ssh/authorized_keys文件中,没有就新建一个文本文件改后缀名,若已存在则换行添加。

被控端设置允许密钥对登录

接着需要对被控端的OpenSSH-server做进一步配置,使其允许密钥对连接。

打开文件C:\ProgramData\ssh\sshd_config,确保以下几个选项的配置正确:

1
2
3
4
5
6
7
# 允许使用公钥验证登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 允许使用密码验证
PasswordAuthentication yes
# Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

接着将OpenSSH SSH Server服务重启,即可完成配置。

连接

在控制端,打开VS Code,使用Remote SSH连接到前几步添加的服务器,第一次连接需要选择服务器,选择“Windows”,若不需要输入密码直接连接,则说明密钥对配置成功。

使用VS Code连接被控端时,会自动在被控端Windows用户文件夹下的.vscode-server文件夹安装Remote SSH的相关资源:

image-20220613001342497

远程连接时安装的插件都会放在这个文件夹中,需要注意避免用户文件夹过大。