目录
——什么是内网穿透?
——为什么要内网穿透?
——先决条件
——配置服务端
——配置客户端
——通过SSH连接到内网
——使内穿更加方便
——什么是内网穿透?
内网穿透,即NAT(Network Address Translator)穿透,是 指计算机在内网(局域网)内使用私有IP地址,在连接外网(互联网)时使用全局IP地址的技术 。
这么说你可能听不太懂,通俗来说,在你的机器上有一个网络称为内网,服务器上有个网称为外网,内网和外网之间有一堵墙,进行内网穿透就是打破这堵墙,让内网能够连上外网。
下面是一个简单的内网穿透示意图:
——为什么要内网穿透?
原因很简单:为了方便。
如果不进行内网穿透,要对你的板子进行终端操作,要么需要连上显示器插上鼠标键盘开机后进行操作,要么则需要在同一个内网环境下(同一个wifi下,或将板子用网线连在电脑上)电脑上使用SSH协议(推荐使用Xshell)连接到板子。这样长此以往开发就很麻烦,要么需要克服硬件困难,要么就需要克服地理因素。
当实现内网穿透后,只要确保板子在合适的地点上电并确保板子联网。(Nano板子可以通过网线连上wifi或者安装无线网卡和天线并连上wifi)就可以在无论多远的地方通过SSH进行连接,远程对板子的终端进行操作。实现远程部署,在家办公...
下面我将介绍如何实现内网穿透:
——先决条件
边缘设备:Jetson Nano 4G板子(其他的板子例如树莓派的板子内穿的方法也应该大同小异)
服务器:Ubuntu架构的AWS EC2服务器(阿里云、腾讯云,只要是个服务器都可以)
操控设备:一台电脑,需要安装Xshell或类似的终端模拟软件
概念解释:下文中Jetson Nano的终端就是客户端,服务器的终端就是服务端
——配置服务端
下载frp:下载地址是Releases · fatedier/frp · GitHub
或在服务器终端输入
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
注:
我下载的frp版本是0.33.0,这里的0.33.0可以修改成你想要的版本。
命令末尾不一定是amd64,这取决于你服务器的处理器架构。
若你不知道服务器的处理器架构,可以在服务器终端输入。
arch
或
uname -m
若输出X86_64,则选择amd64(我的服务器是X86_64)
若输出aarch64,则选择arm64(我的板子是aarch64)
下载完成后解压文件。
tar -zxvf frp_0.33.0_linux_amd64.tar.gz
由于每次开启frps/frpc服务都需要cd到解压后的目录,故此处可以选择给上述目录重命名(可选)。
cp -r frp_0.33.0_linux_amd64 frp
此时我们cd到改名后的目录。
cd frp
查看当前目录的文件。
ls .
若输出下述文件,则说明frp下载成功,若缺少若干文件请删除目录后重新下载:
frpc frpc.ini frps_full.ini LICENSE
frpc_full.ini frps frps.ini
由于此时我们是服务端,所以对我们有用的只有frps*(frps、frps.ini、frps_full.ini),剩下的frps*可以选择性删除,以避免混淆。
使用vim指令修改frps.ini文件。
vim frps.ini
将此文件改成下面的形式:
[common] bind_port = 7000 dashboard_port = 7500 token = 114514 dashboard_user = root dashboard_pwd = 123
注:
“bind_port”表示客户端和服务端连接的端口,这个端口我们后面配置frpc.ini也要用到,确保两边的bind_port一致。
“dash_port”是服务器仪表盘的端口,按照上面的配置,我们可以在浏览器输入x.x.x.x:7500访问服务器仪表信息。(x.x.x.x为服务器公网ip)。
“token”可以理解成密钥,用于确认客户端和服务端的连接,请务必设置后记住。
“dashboard_user”和“dashboard_pwd”为打开服务器仪表盘网站所需要输入的用户名和密码。
附:进入服务器仪表盘网站的截图
到此处就配置完成了,输入下面的指令可以启动服务端。
./frps -c frps.ini
若有类似下面的输出,则说明服务端启动成功!(画外音:为了得到这几行输出我重启了我的实例,然后导致了一系列蝴蝶效应,累死个人,当然我会在之后附上重启实例之后重新内穿的操作)。
2022/05/12 14:25:36 [I] [service.go:178] frps tcp listen on 0.0.0.0:7000 2022/05/12 14:25:36 [I] [service.go:277] Dashboard listen on 0.0.0.0:7500 2022/05/12 14:25:36 [I] [root.go:209] start frps success
这是前台运行,倘若我们断开与服务器的连接则该进程也会终止,故此处我推荐使用:
nohup ./frps -c frps.ini
若有类似下面的输出,则说明服务端后台启动成功!
nohup: ignoring input and appending output to ‘nohup.out’
这是后台运行,即便我们断开与服务器的连接,他也不会消失,这样我们就不需要一直连接到服务器了!当然这也会带来一定的副作用:
当我们将服务器实例重启时,公网ip会发生变化,但是之前后台运行的进程仍在继续!此时我们不仅需要重新修改frpc.ini的server_addr(后面配置客户端会提到)为现在的新公网ip,还需要输入:
netstat -tanlp
找到端口bind_port(7000)对应的进程,例如下面这个:
tcp6 0 0 :::7000 :::* LISTEN 2920/frps
此时我们再输入:
kill 2920
杀死进程后重新输入nohup指令。
否则如果我们直接运行nohup指令会提示我们之前的7000端口已经被占用了而无法执行。
——配置客户端
配置客户端的步骤与配置服务端的大相径庭,但是为了方便读者,我这里还是帮大家一步一步的操作:
下载frp,在客户端终端输入:
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
下载完成后解压文件。
tar -zxvf frp_0.33.0_linux_amd64.tar.gz
由于每次开启frps/frpc服务都需要cd到解压后的目录,故此处可以选择给上述目录重命名(可选)。
cp -r frp_0.33.0_linux_amd64 frp
此时我们cd到改名后的目录。
cd frp
查看当前目录的文件。
ls .
若输出下述文件,则说明frp下载成功,若缺少若干文件请删除目录后重新下载:
frpc frpc.ini frps_full.ini LICENSE
frpc_full.ini frps frps.ini
由于此时我们是服务端,所以对我们有用的只有frpc*(frpc、frpc.ini、frpc_full.ini),剩下的frps*可以选择性删除,以避免混淆。
使用vim指令修改frpc.ini文件。
vim frpc.ini
将此文件改成下面的形式:
[common] server_addr = x.x.x.x #注1 server_port = 7000 token = 114514 [ssh] type = tcp local_ip = x.x.x.x #注2 local_port = 22 remote_port = 6000
注:
“server_addr”为服务器的公网ip,可以在对应服务器管理页面查看。
后续通过SSH连接到内网的IP即此处的“server_addr”。
“server_port”为表示客户端和服务端连接的端口,要确保和之前服务端配置的一致。
“token”为可以理解成密钥,用于确认客户端和服务端的连接,要确保和之前服务端配置的一致。
[ssh]中的ssh是自己定义的规则,如果实现多个设备(客户端)穿透到同一个服务器(服务端)上,则需要确保规则不重复。
“type”为传输协议类型。
“local_ip”为要实现内穿的设备的内网ip,可以通过以下方式查询:
ifconfig
应该会有类似以下输出:
docker0: ... eth0: ... lo: ... rndis0: ... usb0: ... wlan0: flags=4163mtu 1500 inet x.x.x.x ...
别的都不用管,找到wlan0下inet后的ip,即是此处的 “local_ip”
-若没有wlan0怎么办?
确认自己的板子是否联网,可以参考下面这个文章。
Jetson Nano主板的五种联网方法_牛牛与爸爸的博客-CSDN博客_jetson nano联网
“local_port” 本地端口,一般默认为22,不用去改它(除非你的项目部署在其他端口)
“remote_port” 所希望的通过公网来访问内网的端口。
后续通过SSH连接到内网的端口即此处的“remote_port”。
同样的,你可以选择前台输出:
./frpc -c frpc.ini
或后台输出(推荐):
nohup ./frpc -c frpc.ini
输出成功的提示语句和上面类似,到这里,我们就完成了客户端的配置。此时已经完成了内网穿透,但是我们还需要连接到内网。
——通过SSH连接到内网
在进一步用SSH连接前,我们需要先开放服务器的端口,我们之前用到的server_port、remote_port、dashboard_port(6000、7000、7500)服务器默认都是没有开放的。
故此时我们需要进入到服务器的管理页面,找到安全组,设置入站规则,以我的AWS EC2服务器为例子:(其他服务器也类似)
接下来我们进行SSH连接:
此处我使用的是Xshell7,诸位也可以使用其他的远程连接工具(final shell、royal tsx等)。
左上角工具栏点击文件->新建,会出现下面这个界面:
我们可以将名称改为方便助记的(我的是Jetson Nano,可选)
然后将主机填上服务器公网ip x.x.x.x(也即上文的server_addr)
端口号填上上文中客户端中配置的remote_port
此时我们可以在用户身份验证界面填上自己内网终端的用户名和密码或密钥,这样我们就不需要每次连接都输入用户名和密码或密钥了(可选)
然后我们就可以点击连接了。
成功的话一般会弹出一个密钥接受请求:
此时我们选择一次性接受,就可以进入内网终端了,同时还会有类似以下输出:
Connecting to 68.79.20.43:6000... Connection established. To escape to local shell, press Ctrl+Alt+]. Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.9.140-tegra aarch64) ...
至此,我们已经完美完成了所以内网穿透的操作了!
——使内穿更加方便
我们在配置完客户端和服务端并运行服务后,在使用的过程不难发现,我们一般不会重启服务器,但是我们会经常将我们的客户端重启,每次重启我们都必须重新启动客户端的服务,特别麻烦,在这里我们可以写一个bash脚本,并将其设置开机运行,这样每次上电开机,客户端都会自动启动客户端服务。
在我们客户端终端任意目录输入以下指令:
vim frpc_start.sh
在新建的bash脚本中输入以下代码并保存退出:
cd frp nohup ./frpc -c frpc.ini
此处我的板子连接显示屏并在终端输入:
gnome-session-properties
打开Ubuntu开机自启选项管理
我们点击左边的添加,找到我们写的frpc_start.sh的bash脚本并添加后在控制台输入:
reboot
重启后再通过SSH连接,发现不需要我们手动启动服务即可连接到了!



