内网穿透与FRP初探

First Post:

Last Update:

Word Count:
1.2k

Read Time:
4 min

内网穿透与FRP初探

内网穿透

​ 由于疫情被学校遣返回家,不得不收拾东西赶紧离开,而有一些任务还需要在内网里使用,于是就采取了对校内服务器进行一个内网穿透,我的服务器位于一个很复杂的局域网(校园网外加虚拟机)中,我想要实现远程命令和文件访问,必须通过内网穿透将其转发到公网之中,这样就可以在公网访问我的服务器了,想要搞事的话直接ssh连进内网机器就行了

​ 所谓内网穿透,我个人的理解是使用一些工具建立内网机器和一个公网机器的持久性连接,通过这个连接转发相应请求:内网机器部署到x端口上的服务可以转发给公网机器的y端口,而当用户直接去访问这个公网IP的y端口时,就能把这个请求转发给内网机器,并且把内网机器的响应也返回过来,实现了在公网对内网的访问。此外,从公网中访问自己的私有设备向来是一件极其困难的事,自己的电脑、服务器等设备,它们一般处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址,一层NAT套一层NAT。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH,WEB服务等),一般也可以通过内网穿透实现。

​ 内网穿透的前提是拥有一个公网IP,而且内网机器可以出网,即可以ping通公网的IP,我的VPS虽然在美国,但是大陆地区可以直连ping通,甚善👍

FRP使用

综合考虑还是使用 frp这个反向代理工具,配合着我的一个有着公网IP的VPS,就能实现公网ssh登录我的校内服务器

frp一共有两套,一个是服务端frps,一个是客户端frpc。通过在我的VPS上运行服务端frps,在内网机器上运行客户端frpc,配合各自的配置文件frps.ini和frpc.ini,就能连接,非常的简单,非常的快捷

下面是两个配置文件

frps.ini

1
2
3
[common]
bind_port = 7000 #与客户端绑定的进行通信的端口
token = 123456 #连接所需的token

frpc.ini

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = VPS的IP
server_port = 7000
token = 123456

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22 #绑定的本机x端口
remote_port = 5210 #所转发到的y端口

在vps上执行,创建后台任务,防止关闭ssh连接后进程销毁

1
nohup ./frps -c frps.ini &

屏幕输出nohub: ignoring input and appending output to nohub.out说明已经正常运行,可以通过jobs指令查看,此时Ctrl C退出都没事

在内网机器上执行

1
./frpc -c frpc.ini

创不创建后台感觉都行

这样在连接我的内网服务器时,直接

1
ssh root@公网IP -p 5210

就可以连接了

问题1

frp工具需要从GitHub上下载,我那个美国VPS可以轻松的

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

但是我的内网机器由于众所周知的网络原因死活连不上GitHub,wget和git clone是没法使用了

此外,连接我那个内网机器的终端是一个极其劣质的终端——VMware ESXI的web控制台,没办法复制粘贴,没办法传文件,也没有校园内网的独立IP,怎么把frp客户端文件传上去成了极其困难的问题

此时忽然想起来内网机子是可以ping通我的VPS的,于是我便在VPS上开启一个server服务,让内网机子从VPS上去下载文件

使用的命令是

1
python3 -m http.server 8000

通过该命令部署了一个简单的文件服务器,直接访问 IP:8000 就能看见文件列表,通过这个方式终于把frp客户端文件传给了内网机器

问题2

在尝试连接时发现,ssh报错

ssh: connect to host localhost port 22: Connection refused

哦原来是没开启ssh服务啊,令人感叹

1
2
3
4
5
6
7
ssh-keygen -t rsa    #连续按回车,生成秘钥

cat ~/.ssh/id_rsa >> ~/.ssh/authorized_keys #写入密钥文件

sudo apt install openssh-server #安装openssh-server

sudo /etc/init.d/ssh start #启动openssh-server

能用ssh登录其它主机并不代表着本地主机开启了ssh服务,要安装启动该服务才行,这样就能通过ssh连接本地

结尾

经过测试可以直接在公网连接我的内网服务器了,可以安心的离校了

此外通过这次灵感突发的尝试,对内网和内网穿透有了些许理解,也许在将来的某次内网渗透中就会用到罢