文章目录
项目场景
我使用内网穿透的场景:家里一台windows的笔记本,办公室一台windows的服务器,但是由于这台windows服务器没有公网ip,所以一直是用向日葵或者todesk链接,跑代码什么的比较麻烦,所以用我的一个云服务器来搭建一个内网穿透服务。也是在网络上搜集流程来做,在这里做一下汇总记录。
要用frp进行内网穿透首先需要一个有公网IP的云服务器,相当于一个中转机器。
注意:下面的配置中
客户端都是指办公室的windows电脑,也就是你想要远程访问的电脑。
服务端都是指具有公网IP的云服务器
所有的配置都在这两台机器上,你其他要连接办公室服务器的电脑都无需进行额外配置。
一、下载frp客户端和服务端
首先去github上下载frp软件。点击这里进入下载 frp下载地址
如图下载对应文件,分别是win和linux端的,win端的需要这里需要客户端,给办公室的服务器用, linux端的给云服务器用,所以是要服务端。下面进行详细配置。
二、配置
我这里是有一个linux的云服务器作为服务端,windows作为客户端,所以这里我也是分别下载了这两个压缩包,下载好之后进行解压。
![content](https://i-blog.csdnimg.cn/blog_migrate/6f8bb9bf922e7c570edf3a432414fbcb.png)
1. win端
首先是windows端,win端作为客户端,我们只保留这三个c结尾的文件,其他的可以删除
![content](https://i-blog.csdnimg.cn/blog_migrate/f6cf26d9fb0b66186c10e10f50899beb.png)
配置只需要把frpc.ini中的server_addr项,改为自己云服务器的公网IP地址就可以了,其他的不需要动,了解原理之后可以自己进行更改或者添加,我这里就是简单的先连通,但其实我的需求这个配置已经可以满足了。
[common]
server_addr = 自己的服务器公网IP
server_port = 7000
# 下面这个可以创建多个,做多个端口映射。
# 其中local_port就是本地需要映射的端口
# remote_port就是云服务器的端口
# 也就是说,连接的时候,我们只需要连接云服务器的6000端口,就相当于链接办公室服务器的22端口
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
![content](https://i-blog.csdnimg.cn/blog_migrate/965c0703413bc167c2afcbfa4ef4ca19.png)
然后把win的文件放到你需要内网穿透的这台win上,随便找一个位置,建议别放C,有权限问题。
我放在了D盘下创建了一个叫做frp的文件夹,把上面的三个文件拷贝进去就可以了。
2. windows开启openssh
因为windows端,默认没有下载openssh服务端,所以我们这里要下载一下,这里有两种下载方式,一种是去设置中,找到添加可选方式,搜索openssh,找到openssh服务端,下载。下载好之后去计算机管理,服务,找到opensshservice这个服务,打开它,并在属性中设置自动启动就可以了。
这个网上有很多教程,下面给出一个直接用命令行下载的方法,这个比较快不用找,所以详细介绍这个方法。
首先需要用管理员身份启动 PowerShell,使用如下命令看一下,要确保 OpenSSH 可用于安装:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
输出应该是类似的结果:
Name : OpenSSH.Client~~~~0.0.1.0
State : NotPresent
Name : OpenSSH.Server~~~~0.0.1.0
State : NotPresent
然后使用 PowerShell 安装服务器即可:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
输出结果类似:
Path :
Online : True
RestartNeeded : False
这样就可以完成 OpenSSH 的安装。
安装完成之后,就需要进行一些初始化配置了,还是以管理员身份,使用 PowerShell 执行即可。
首先需要开启 SSHD 服务:
Start-Service sshd
然后设置服务的自动启动:
Set-Service -Name sshd -StartupType 'Automatic'
最后确认一下防火墙是否是放开的:
Get-NetFirewallRule -Name *ssh*
如果是放开的,那么结果会提示 OpenSSH-Server-In-TCP
这个状态是 enabled。
好了,完成如上操作之后我们就可以使用 SSH 来连接我们的 Windows 服务器了。
但是注意,这里只开启了openssh服务,我们只能在局域网中和这个电脑经行ssh链接
3. 服务端(linux端)
linux端也是只需要保留三个s结尾的文件作为服务端,配置如下,其实不需要更改,如果想要网页端的一个显示面板,可以加上下面的内容,也就是在浏览器访问服务器的7500端口,可以出来一个可视化的面板。
frps.ini
[common]
bind_port = 7000
# 下面的内容可要可不要,没什么大用,不用的话配置文件都不需要改,直接上传
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin
这里你一定要记得去云服务器管理页面,在防火墙中把6000,7000,7500这三个端口打开,如果你需要更多端口的映射,你就要记得把端口打开。
然后把我们配置好的linux端的三个文件都上传到服务器,我是放在了root目录下创建了一个frp的文件夹,这个位置无所谓,你能找得到就可以。
三、运行
接下来,我们分别把客户端和服务端手动运行起来,以便测试没有什么问题。
1. linux端
把文件上传好之后,在这个文件夹中,输入以下命令
./frps -c frps.ini
如果提示权限不足,输入下面的命令把权限给他
chmod 777 frpc
然后再输入上面的命令跑起来,会提示你运行成功,linux端也就是服务端就运行好了
2. win端
这里我们先进入之前,创建的frp文件夹中,然后在这个文件夹下打开cmd
运行如下命令
frpc -c frpc.ini
跑起来之后就可以了,这个时候会看到linux服务端多了三条,就说明他们已经成功连起来了
3. 测试
然后可以用家里的电脑试一下,在powershell中输入
ssh -p 6000 你要连接的win的用户名@你的服务器公网IP
第一次链接会让你输入yes,然后输入密码,就连接成功了,到这里可以连接成功,已经算是是完成了,可以做很多事情了。
四、配置自启动
上一步我们是手动启动,关了窗口就没了,重启之后还要手动重新打开,比较麻烦。
所以我们配置一下自动启动,一劳永逸。
用样的分别在两个地方分别配置
1. linux
先进入下面的文件夹
cd /lib/systemd/system
在这个文件夹中我们创建并编辑文件frps.service
vim frps.service
文件中我们写下面的内容
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=你的用户名
Restart=on-failure
RestartSec=5s
ExecStart=/root/frp/frps -c /root/frp/frps.ini "这里写你的绝对路径的手动启动frc的命令"
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
需要改的位置就两个,User和ExecStart,user改成你的用户名,ExecStart改成你的手动启动命令,但是注意要用绝对路径,修改好之后我们:wq保存退出
然后分别执行下面的命令
systemctl daemon-reload //重新加载
systemctl enable frps //frps自启动
systemctl start frps //开启frps服务
systemctl status frps //查看frps开启状态
在输入systemctl status frps后,可以看到输出内容说已启动就ok了
2. win端
这里配置的有两种方式,一个是bat快捷方式放在启动文件夹里,一个是做服务项
这里我们做做服务项,稍微复杂一点,但是很方便,而且没有黑窗口
使用WinSW实现service服务配置
WinSW(Windows Service Wrapper)是一个开源的 Windows 服务包装器,它可以将任何可执行文件(如 Java 应用程序、Python 脚本、Ruby 脚本等)转换为 Windows 服务,并为其提供了一些额外的功能,如重新启动、日志记录、配置文件管理等。
1. 下载WinSW安装包
github下载地址:WinSW
![content](https://i-blog.csdnimg.cn/blog_migrate/5bbc5a820ff8a07d6b4269a8f87102a6.png)
将下载的文件改名为winsw.exe,并在同级创建winsw.xml文件,都放在win端的frp文件夹中
![content](https://i-blog.csdnimg.cn/blog_migrate/70d3eab3ba757e9cad985beb919a4476.png)
下面配置winsw,我们编辑winsw.xml文件
<service>
<!-- 该服务的唯一标识 -->
<id>frpc</id>
<!-- 该服务的名称 -->
<name>frpc_0.43.0-windows-amd64</name>
<!-- 该服务的描述 -->
<description>frp内网穿透-客户端</description>
<!-- 要运行的程序路径 -->
<executable>D:\frp_0.43.0\frpc.exe</executable>
<!-- 携带的参数 -->
<arguments>-c D:\frp_0.43.0\frpc.ini</arguments>
<!-- 第一次启动失败 60秒重启 -->
<onfailure action="restart" delay="60 sec"/>
<!-- 第二次启动失败 120秒后重启 -->
<onfailure action="restart" delay="120 sec"/>
<!-- 日志模式 -->
<logmode>append</logmode>
<!-- 指定日志文件目录(相对于executable配置的路径) -->
<logpath>logs</logpath>
</service>
2. 运行
配置好之后,我们安装服务,在当前文件中打开cmd,运行下面的命令
.\winsw.exe install
会提示服务安装成功
然后我们打开服务,Win键 + R,然后输入services.msc
找到刚才安装的服务
![content](https://i-blog.csdnimg.cn/blog_migrate/934bef81224f780f7c91385c9eaf5e92.png)
我们右键点击属性,把启动方式改成自动,然后再到这个页面右键启动它,就ok了,以后就不用管了,也不会出来黑窗口
补充:winsw常用命令
//注册服务
.\winsw.exe install
//卸载服务
.\winsw.exe uninstall
//启动服务
.\winsw.exe start
//停止服务
.\winsw.exe stop
//重启服务
.\winsw.exe restart
//查看状态
.\winsw.exe status
五、免密登录
这个算是一个补充,之前的每次登录都会要求你输入密码,会比较麻烦,所以可以配置免密登录,这样每次登录直接就能连接,而不需要输入密码,步骤也很简单。
1.生成公钥和私钥
Windows 打开 cmd
输入:ssh-keygen
ssh-keygen
连续回车或者根据提示确定生成的私钥公钥存放的路径。默认(就是一路回车)会在C盘/用户/用户名/.ssh目录下生成公钥和私钥。
id_rsa:私钥
id_rsa.pub:公钥
2. 将公钥拷贝到服务器
-
在服务器输入
ssh-keygen
回车(生成服务器的公私钥) -
如果是windows端,就在cmd中输入
ssh-keygen
-
完成后会在用户目录下生成 .ssh目录(输入 ls -a查看)
-
同样的windows端的话就是在C盘用户目录生成.ssh目录
-
进入ssh目录 cd .ssh
-
将客户端的公钥(也就是刚刚Windows上自己生成的id_rsa.pub)添加到 authorized_keys文件:
-
可以vim authorized_keys直接将Windows上自己生成的id_rsa.pub的内容拷贝过去
注意:如果没有 authorized_keys文件的话,用 touch authorized_keys创建一个,创建后权限改为 600 -
windows端的操作类似,也是在.ssh目录中,有一个authorized_keys文件,注意这里是没有后缀名的,如果没有就自己创建一个,然后把在客户端生成的公钥,也就是id_rsa.pub里面的内容,全部复制到authorized_keys中
-
之后再继续增加免密登录的设备的话,就继续往authorized_keys文件中复制公钥就可以了。
4. 重启ssh服务
linux端直接执行下面的命令
systemctl restart sshd
window端就去计算机管理,找到里面的服务,然后找到之前安装的openssh服务端,右键重启他就可以了
然后链接时就可以不用输入密码了
六、使用
内网穿透之后,想做什么都可以。比如可以用vscode的remote ssh插件,直接链接到服务器,相当于直接在你配置了内网穿透的机器上跑代码,体验感非常好。
而需要注意的是,你在连接时,你要输入的ip都是你有公网ip的服务器的ip,而端口就是我们之前设置好的端口6000。
命令就是这个
ssh -p 6000 你要连接的win的用户名@你的服务器公网IP
如下图所示,下载这个插件之后,添加你的服务器进来,就可以本地写代码,服务器跑代码了。链接的时候,会让你输入一段ssh命令,就写上面的就可以了。
![content](https://i-blog.csdnimg.cn/blog_migrate/ee03fcfed77aa7ec36d7e452dddbc37a.png)