内网穿透——外网装逼?腾哥长文带你玩转内外网互通

你是否被以下问题所困扰:

我想装个B让其他同学在外网访问我本地运行的程序或者网站,该怎么办?
接了个小外包,给客户演示Demo没有站点怎么办? 做微信、支付宝支付等其他第三方平台的功能,没有外网回调地址,应该怎么办?

我们先来了解一下内网穿透。内网穿透,又叫NAT穿透,是计算机用语,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。翻译过来就是你的电脑可以直接被你朋友从外部访问。通常我们的电脑是无法自己被访问的,因为我们的电脑缺少自己的独立的公网IP地址。由于国情的某些原因,现在ipv4地址稀缺,电信运营商已经不会随便分配固定IP给个人。通常实现内网穿透,是通过路由器上端口映射来实现的。但是我们上网的环境通常是存在多级路由器较为复杂的网络结构,我们上网过程中和广域网联通,通常会经过运营商上层的多层路由器,而它们不是每个人都有权限可以访问和设置。

cover.png

腾哥在这里介绍两种内网穿透的方法,一种是市面上的软件方法,另一种是自建服务器进行穿透的方法。

:使用现成的软件花生壳

打开花生壳官网https://hsk.oray.com/

下载花生壳客户端并安装;

注册花生壳账号并登陆;

根据花生壳官方帮助手册进行配置使用

由于此类软件官方已经进行了详细的说明,此处不再详细介绍。类似的软件还有:

神卓互联:https://www.shenzhuohl.com/

钉钉内网穿透:https://open.dingtalk.com/document/resourcedownload/http-intranet-penetration/

SAKURA FRP: https://www.natfrp.com/

等等

:自建服务器进行内网穿透

前期准备:

一台拥有公网IP地址的服务器,比如腾讯云;

一台运行在本地的服务器,开启相应服务可以在内网访问;

一台作为访客的设备(手机流量)

根据官方的表述,frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

https://github.com/fatedier/frp/releases

使用文档:https://gofrp.org/docs/

Frp分为服务端和客户端,我们首先配置服务端。存在多种部署方式,我用docker进行服务端部署,方便快捷。

首先创建配置文件:

**创建存放目录
sudo mkdir /etc/frp
# 创建frps.ini文件
nano /etc/frp/frps.ini**

frps.ini内容如下:

[common]

# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = admin
dashboard_pwd = admin
# 设置http及https协议下代理端口(非重要)
vhost_http_port = 7080
vhost_https_port = 7081
# 身份验证
token = 12345678

这个配置文件记录了服务端参数。服务器IP:端口号可以进入服务器frp面板,token起到客户端连接服务器的身份验证作用。
为了安全请务必将面板密码和token设置复杂一点。

#服务器镜像:snowdreamtech/frps
#重启:always
#网络模式:host
#文件映射:/etc/frp/frps.ini:/etc/frp/frps.ini
输入下面指令启动


docker run --restart=always --network host -d -v /etc/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps

别忘了在服务器的防火墙设置放行相关端口。

运行在云服务器上的docker容器:
1.png

客户端部署方式一(Win系统):

首先在本地启动一个服务。

下载客户端,如下

2.png

注意相关文件都是frpc 不是s

配置文件示例(frpc.ini)

[common]
# server_addr为FRPS服务器IP地址
server_addr = x.x.x.x
# server_port为服务端监听端口,bind_port
server_port = 7000
# 身份验证
token = 12345678

# [ssh] 为服务名称,下方此处设置为,访问frp服务段的2288端口时,等同于通过中转服务器访问127.0.0.1的22端口。
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP
# local_port 为目标端口
# remote_port 为远程端口

[service1]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 80

[web]
type = tcp
local_ip = 192.168.1.2
local_port = 80
remote_port = 1888

打开cmd并定位到软件目录 输入”frpc”启动服务

3.png

如图看到success表示成功了,可以试试访问云服务IP:你设置的远程端口

4.png

客户端部署方式二(docker):

和上面类似,在需要映射出去的设备上 创建/etc/frp/frpc.ini配置文件 内容同上。

#镜像:snowdreamtech/frpc
#重启:always
#网络模式:host
#文件映射:/etc/frp/frpc.ini:/etc/frp/frpc.ini

启动客户端:
docker run --restart=always --network host -d -v /etc/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc

试试访问云服务IP:你设置的远程端口
5.png

笔者尝试,多台客户端可以连接到同一服务器,比如笔者在NAS和软路由上都部署了frp,都能正常使用,注意远程端口别冲突就行。
后续还可以根据文档设置服务开机自启动,云服务器可以设置反向代理和域名等等。