最近需要远程办公,不过居家访问公司服务器遇到一些困难,需求就是在家里安全访问公司内网中的服务器。
服务器只有一个局域网ip,没有公网ip,同一局域网内的设备可以通过局域网ip访问,而Internet上的设备最多只能找到公司的路由器,进不了局域网。
一、接入上网环境分析
我们使用公网一般有三种形式:
- 路由器分配了一个或多个固定的公网IP:
这种情况访问内网服务器比较方便,在路由器中做端口映射,然后就可以使用公网ip+端口号访问了。
- 路由器被分配了一个动态公网IP:
也同样在路由中设置端口映射,不过由于公网IP经常在变,因此应该采用动态域名来做解析,采用动态域名+端口号也可以访问。
- 路由器被分配了一个动态内网IP:
这种情况最麻烦,不过目前最常见,我们公司目前就是如此,动态域名解析后得到私有C类地址,比如192.168.2.3,这就必须采用内网穿透了。
二、内网穿透简单了解
内网穿透即是内网映射,内网(IP)端口映射外网(IP或域名),以实现将内网服务器、网站、和应用发布到外网访问的目的。通常在内网网络环境搭建服务器(解决无公网IP问题),需要外网访问内网场景(如远程办公)。
内网穿透工具很多,比如开源的frp和ngrok、老牌的nat123和花生壳等,通过比较选择了frp来实现,如果自己搭建需要借助一个有公网ip的云服务器。
三、FRP简介
frp是一款采用golang编写的开源内网穿透反向代理应用,支持 Windows、macOS与 Linux,支持 TCP、UDP 协议,支持http 和 https 协议,在公网服务器安装一个server端,内网服务器安装一个客户端,起到一个中转转发的作用,从而实现内网暴露到外网,实际就是一个反向代理转发器。
其软件地址为https://github.com/fatedier/frp,目前最新版本是0.41.0
frp 支持多种代理类型来适配不同的使用场景。
tcp :单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
udp :单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
http :针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。
https :针对 HTTPS 应用定制了一些额外的功能。
stcp :安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
sudp :安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
xtcp :点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。
tcpmux :支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。
四、FRP 安装使用过程
下载后的文件很简洁,由于golang的优秀特性,不需要依赖其他安装包,
其中frps是服务器端运行文件(安装到有公网IP的云服务器上),对应配置文件frps.ini和frps_full.ini,缺省在服务端使用7000端口。
frpc是客户端运行文件(安装到需要对外发布的内网服务器上),对应配置文件是frpc.ini
由于我们云和本地服务器都是linux,我们只讨论linux下的安装,windows下大同小异。
1 下载frp_0.41.0_linux_amd64.tar.gz,分别传到云和本地服务器上,解压
tar -zxvf frp_0.41.0_linux_amd64.tar.gz
sudo mkdir /etc/frp
sudo cp * /etc/frp -r
其中systemd目录是给自动启动服务用的,在我的服务器上不好用
配置服务端,用精简版的frps.ini就够用了
nano frps.ini
common
bind_port = 7000 #绑定的端口
dashboard_user = admin #控制台用户名
dashboard_pwd = password #控制台密码
dashboard_port = 7500 #控制台的端口
2 启动云服务器的服务端
nohup /etc/frp/frps -c ./frps.ini &
3 安装配置客户端的内网服务器
tar -zxvf frp_0.41.0_linux_amd64.tar.gz
sudo mkdir /etc/frp
sudo cp * /etc/frp -r
配置需要转发的服务
nano frpc.ini
common
server_addr = 公网的IP
server_port = 7000
ssh
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7001
oracle
type = tcp
local_ip = 127.0.0.1
local_port = 1521
remote_port = 7002
RDPWINDOWS
type = tcp
local_ip = 192.168.0.109
local_port = 3389
remote_port = 7003
TOMCAT
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 7008
4 启动内网服务器的客户端
nohup /etc/frp/frpc -c ./frpc.ini &
5 使用
公网环境下
putty 云服务器IP+端口号7001
公网ip:7004就可以rdp连接到内网的windows等等,就可以方便的访问公司内网服务器了,当然速度会略慢一些了
五、小结
内网穿透方法有不少,对于有公网主机资源的,可以使用像开源的FRP来搭建端口转发服务使用;如果自己确实连个公网IP权限都没有的,需要用类似nat123等三方工具,直接来将内网地址变成公网地址使用。