通常,局域网如教育网内的主机无法通过教育网以外的机器进行连接,因此需要做内网穿透,即将内网的ip暴露在公网。frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网,且frp是开源的,免费的,无需任何账户注册、登录,支持Linux、Mac、Windows等多个平台。本文介绍如何针对内网主机使用frp进行内网穿透。
准备
- 在公网的主机A,可以是云服务器,也可以是自己的PC。
- 在内网的主机B,也就是需要访问的目的主机。
配置
主机A
这里以Ubuntu 18.04 LTS为例。首先从frp官网下载对应的包,注意一定要下载正确的架构。这里以v0.38.0为例:
1 | wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz |
解压之后可以看frp目录下有这些文件:
1 | frp_0.38.0_linux_amd64 |
主机A为公网能访问的服务器,我们将它作为代理,需要在主机A上运行frp的服务器端,也就是fprs。首先需要配置服务器端的配置文件,使用vim frps.ini进行编辑,内容如下:
1 | [common] |
bind_port为服务器程序运行时需要打开的端口,dashboard_port为后台管理程序的端口,用户名和密码可以自行设置。注意这两个端口都需要通过防火墙打开,Ubuntu 18.04 LTS打开命令为:
1 | sudo ufw allow 7000 |
保存配置后,就可以启动frps:
1 | ./frps -c frps.ini |
此时,可以访问x.x.x.x:7500来测试是否能进入dashboard,成功进入,说明启动成功。
主机B
主机B为内网服务器,同样首先下载frp后解压,主机B需要运行frpc也就是frp客户端,因此先配置客户端配置文件,使用命令vim frpc.ini,内容如下:
1 | [common] |
为主机B打开端口:
1 | sudo ufw allow 7000 |
为主机A打开额外的6000端口:
1 | sudo ufw allow 6000 |
这里的6000端口配置文件中写的是remote_port,不太清楚指的是主机A还是主机B,我的理解应该是通过主机A的端口6000转发,这里就先都开放。
接着运行frp客户端程序:
1 | ./frpc -c frpc.ini |
ssh连接测试
这里注意,端口号要使用6000,IP地址要用公网主机A的IP地址,用户名用内网主机B的用户名:
1 | ssh -p 6000 username@x.x.x.x |
输入密码内网主机B的用户名对应的密码即可完成连接。
其他
后台运行
frpc和frps当终端退出时也就自动退出,为了能够一直在后台运行,可以使用nohup命令在后台挂起:
1 | 公网主机A |
ssh免密登录
每次ssh登录都要输密码太麻烦,只要把本地主机的ssh公钥放在远程主机的.ssh/authorized_keys中即可,如果没有公钥,则生成:
1 | ssh-keygen -t rsa -C "邮箱" # 或 ssh-keygen -o |
将公钥复制后拷贝近远程主机的.ssh/authorized_keys中即可。