使用frp访问公司内部网络

观看之前,建议你有 ssh 和简单的 shell 使用经验。

顾名思义,这是一个通过内网穿透自建 vpn 来访问公司内网的教程。说到内网穿透、vpn 都不是什么新鲜的概念,但是这些工具组合起来确实有很多好玩的地方。在这里,就是他们其中的一种组合游戏。
好戏开始之前,我们先提出几个疑问,让我猜猜你想的对不对。

1. 我在家里可以访问公司内网吗,比如打卡,收发邮件之类的?
2. 我需要哪些必备的东西呢?
3. frp是个什么工具?

那么,带着疑问我们开始吧!

实现原理

frp

一句话来说就是,通过 frp 把公司计算机的 ssh 暴露出来,个人计算机使用公司计算机 ssh 的 socks5 代理进行上网。

首先介绍一下 frp 这个软件,经常做微信开发的小伙伴应该有接触到,它是搞内网穿透的。在调试公众号或者小程序接口的时候,需要把开发服务器映射到公网上,这样微信服务器才能成功回调到开发者计算机。但是,我们开发计算机在局域网呀,在使用 NAT 转换之后,公网服务器无法直接访问局域网计算机;也就是说,我可以访问互联网,但是互联网无法主动访问我。frp 就是解决这个问题的,它把我自己的计算机的 web 服务放到公网上,然后我们就可以从互联网访问到它。

那么话说回来了,这和今天这个话题有什么联系呢?我们要让个人计算机使用公司的计算机网络进行网络访问,就必须把公司的计算机暴露在互联网当中。如下图:

其实你已经注意到了:把公司计算机直接暴露在公网,会不会不安全呀?当然会,实际使用过程中,一定要按需开启,并且使用安全验证。

frp 不仅仅能把 web 服务暴露在公网,而且还可以把 ssh 服务暴露在公网上。也就是说,我可以通过个人计算机直接 ssh 公司的内网的计算机。

ssh

代理我们使用的是 ssh 的 socks5 代理,ssh 有这样一个功能,就是把 ssh 服务器当成一个 socks5 正向的代理,把监听到 socks5 服务端口的流量转发到 ssh 服务器上。就可以实现个人计算机通过公司内网计算机进行上网了。

下面介绍需要用到的设备以及环境。

原材料

上面说到,要想实现必须有三台计算机。首先,公司的个人电脑家中的电脑是其中两个,还需要一个公网电脑进行数据中转。

流量转发端

流量转发端是公网中转计算机,它是什么呢?简言之就是有独立 ip 的服务器,这个很容易就买到了,比如阿里云或者腾讯云什么的,很多小伙伴在双 11 和和双 12,被他们冲了一波业绩吧!现在用起来吧,我这里环境使用 Centos7,使用 Ubuntu 的小伙伴也关系,只是防火墙设置不同而已。

流量提供端

流量提供端为公司的计算机,必须支持 ssh 服务,Linux 和 Mac 原生支持了,Windows 需要额外下载软件进行支持,比如 Windows10 的内置 Ubuntu,我这里使用 Mac 系统。

流量消费端

流量消费端为个人计算机,可以是 Mac、Linux,或者 Windows,Android,后两个需要额外软件,iOS 没有试过。我这里使用 Mac 系统。

我个人不建议使用 Windows 最为搭建这套环境,Windows 下的 Linux 子环境实在是难以折腾,即使通过虚拟机或者 bash 等折腾成功,还要考虑网络问题。

搭建过程

搭建过程分为以下几步。

1. 在中转服务器和公司计算机之间搭建frp服务。
2. 个人计算机可以通过ssh访问公司计算机。
3. 把个人计算机的ssh流量作为局部代理
4. 设置局部代理

这样一来工作就清晰了起来!

1. 搭建 frp 服务

frp 分为客户端和服务端两个软件,我们可以从 https://github.com/fatedier/frp/releases 获得(他们在同一个压缩内)。其中 frps 是服务器端,frpc 是客户端。把 frps 放到中转服务器,把 frpc 放到公司计算机。

同时,不管设计 frps 还是 frpc,都仅仅需要一个软件和一个配置文件即可运行。

搭建中转服务器的 frps 服务(操作中转服务器)

这一步的目的是建立 frp 服务器。首先 ssh 到中转服务器,下载 frp 软件

1
2
wget https://github.com/fatedier/frp/releases/download/v0.23.2/frp_0.23.2_linux_amd64.tar.gz
tar -zxvf frp_0.23.2_linux_amd64.tar.gz

得到解压的文件,我们只需关注 frps 和 frps.ini 这两个,其他的可以删除。
编辑 frps.ini

1
2
[common]
bind_port = 7000

然后运行 frp 服务端。

1
./frpc -c ./frpc.ini

当然,为了方便使用,也可以后台运行。

1
nohup ./frpc -c ./frpc.ini &

搭建公司计算机的 frpc 服务(操作公司计算机)

这一步要打通公司计算机中转服务器之间的连接。在这之前,首先要确定公司的计算机时候开启 ssh 服务器。Linux 默认都会开启,Windows 用户只能去找软件来使用,其中 Bitvise SSH Server 还不错,使用起来也比较简单,只是收费。Mac 系统参考如下:

系统偏好设置 -> 共享 -> 远程登录。勾选上,然后在右边添加自己用户。
-w340
设置好 ssh 服务之后,请下载 frp 客户端软件。这里需要 frpc 和 frpc.ini 这两个文件,其他都可以删除掉。

下载时候要选择好对应平台再下载。客户端和服务端如果系统平台不一样,就不能用同一份(虽然客户端和服务端在同一个文件夹中)。

然后编辑 fric.ini

1
2
3
4
5
6
7
8
9
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

注意,这里虽说是在设置公司计算机的客户端配置,但是涉及的到两个端口70006000,在中转服务器中也需要添加防火墙例外规则,腾讯云或则阿里云好像还要添加安全组。

其中,x.x.x.x为你中转服务器的公网 ip。server_port是中转服务器和公司服务器通信的端口,remote_port是 ssh 的虚拟端口,我们连接时候指定的端口就是它。其他的参数都无关紧要,具体可以了解 https://github.com/fatedier/frp

现在启动公司计算机的 frp 客户端

1
./frpc -c ./frpc.ini

到这里,主要工作基本上已经完成了,现在就来测试一下是否可以从个人计算机通过 ssh 连接到公司的计算机吧。

2. SSH 到公司计算机(操作个人计算机)

如果使用的是 mac 或者 linux 可以直接使用下面的命令,连接到公司计算机。如果是 windows,需要下载 putty 或者 linux 子系统等 ssh 软件(后文提到)。

1
ssh -oPort=6000 [用户名]@x.x.x.x

其中,x.x.x.x 是你中转服务器的公网 ip。注意这里一定要加上面指定的端口,不然会连接到中转服务器的 ssh 服务。不出什么问题,就可以连接到公司计算机了。

在这个过程中,如果很久都没连接上,或者被远程主动关闭,请检查防火墙的设置。我们可以使用 telnet 命令测试远程端口是否开启。

教程到这里,好像和 vpn 好像还没有什么太大的关系,仅仅是可以控制公司的计算机而已。不要忘记,ssh 有一个很好的功能,就是把远程服务器的流量,变成本地计算机的 socks5 代理。

3. 设置 ssh 的 socks5 代理(操作个人计算机)

好的,现在可以按 control+c 停止连接。然后,Linux 用户和 Mac 用户可以直接输入以下命令直接开启 sock5 隧道。

1
ssh -f -N -D 127.0.0.1:1080 -oPort=6000 [公司计算机账户]@[中转服务里ip]

比如

1
ssh -f -N -D 127.0.0.1:1080 -oPort=6000 spawn@192.168.2.1

注意以上命令,这里又多出一个 1080 的端口,这个端口是为本地开的。任何把代理端口指向这个位置的连接,都可以使用这个代理,所以这里要记住这个端口。

如果你想让局域网其他电脑也可以访问,那么把 127.0.0.1 换成 0.0.0.0。

注意:ssh 的 sock5 代理如果长时间不使用会自动断开连接,当然,使用autossh可以解决这个问题。

Windows 用户需要额外的软件,推荐使用 putty。操作步骤如下:打开 putty
-w334
其中 x.x.x.x 为中转服务 ip,端口填写 6000

-w343
按照上图操作步骤操作
然后检查路由表,看看是否正常开启。

1
netstat -n -a

-w733

到此 Windows 可以开启一个端口为 1080 的 sock5 隧道
开启 sock5 隧道之后,怎么能检测一下呢?打开一个新的 Shell,输入

1
2
export ALL_PROXY=socks5://127.0.0.1:1080
curl cip.cc

注意,上面的 1080 就是之前预留的端口,地址 127.0.0.1 指向本地。接下来使用上面命令看一看公网 ip 是不是和公司计算机的一样。(PS. 公司计算机也可以输入这个命令查看,或者直接百度关键字 ip。如果相同,那么以上过程就全部成功了!

插个题外话,如果把公司计算机去掉,直接连接中转服务器的 ssh 服务的话,你懂得~。ssh 比 pptp 和 l2tp 要爽哦,关键日子那几天,纸飞机隧道都不可用,全靠它呢!!!

接下来,有了 sock5 代理,按理说文章应该可以结束了。但是毕竟还没有看到效果,那么接下来简单说说它的几种食用方式,这个过程可以任意发挥,没有固定方式!

通过局部代理上网

上面我们说到,如何把 ssh 流量变成 socks5 局部代理,那么现在就是怎么使用这个局部代理了。

命令行代理

这种代理方式只在当前 session 生效,一旦关闭当前命令行,就会失效。

1
2
3
开启方式 export ALL_PROXY=socks5://127.0.0.1:1080
关闭方式 export ALL_PROXY=
检验方式 curl cip.cc

Mac 全局代理

系统偏好设置 -> 网络 -> 高级 -> 代理 -> socks 代理 勾选这个
-w433
点击确定。

Chrome 插件分网址代理

推荐使用插件 SwitchyOmega,由于本教程不是讲局部代理使用方式,直接贴这个插件的使用教程 https://github.com/FelisCatus/SwitchyOmega
-w473
使用SwitchyOmega可以针对不同网页使用不同的代理方式,比如说,1080 端口是访问公司内网的,1088 端口是土啬的。它还可以破除公司对于某些网站的限制,同时也代理就不用切来切去了,十分方便。

Proxifier 分应用代理

使用 SwitchyOmega 可以在访问不同网站的时候使用不同的代理设置,那么 Proxifier 就可以针对于不同的应用使用不同的代理,甚至切断互联网连接。或者我们可以把上面教程反过来玩,然公司服务器当个人计算机,家中的电脑扮演公司计算机的角色。使某些 App 走家中的流量,就可以简单破除公司对于某些 App 的网路限制,比如微信或者音乐视频类软件,但是要注意 dns 的设置。

它是一个十分优秀的软件,但是需要付费。如果是针对外企用户需要频繁切换网络的用户来说,它的确是一个福音。

注意事项

一般来说,公司的网络安全部都不会允许把公司计算机暴露在公网之下,本文只讨论技术,大家好好玩儿~

2021 年 3 月 2 日更新

使用nps后者goproxy过程会更简单 - -


 Gitalk评论