问题引出
众所周知,当前ipv4地址已经几乎用尽,各大ISP几乎不可能再分配公网上的ip给我们,所以我们拿到的ip是经过ISP利用NAT产生的内网ip。
以手机为例子,状态信息中的ip就是一个ISP的内网ip:
10.10.127.12
但我们通过百度搜索ip,仍然会弹出一个公网ip:
183.95.249.23
显而易见,这是ISP的一个私有的公网ip,会有很多用户的内网ip经过NAT映射到该公网ip上,所以不仅我自己百度搜索ip会显示这个ip,也会有其他的客户会显示这个同样的ip
问题便浮现了:
如何通过外网直接访问到我们的内网?
比如说我想让我异地朋友直接ssh到我主机,如何做到?
做不到。因为我们在公网上根本没有拥有ip。朋友顶多能ssh到哪里呢?也就是百度搜索ip弹出来的那个ip,可那是人家ISP的。
想过VPN那种形式的数据报,就是外网数据报里封装一层内网数据报,以便数据报从公网(23.23.2.20)到达DNS服务器通过解包来实现虚拟内网的形式上网。可想了下,ISP的路由器可不是DNS服务器(23.23.2.2),并且朋友也不具有DNS那种分配得到的内网ip(10.0.0.8)。
DNS原理图:(上面的一些ip借鉴的图中的)
可我若是偏要让别人能访问到我没有公网ip的计算机呢?
通过内网穿透实现
问题解决
利用内网穿透工具frp
前提
有一个具有公网ip的云服务器
下载地址
安装
云服务器(服务端)实际上是做一个代理
# curl -zxvf frp_0.45.0_linux_amd64.tar.gz
客户端安装:
# curl -zxvf frp_0.45.0_linux_amd64.tar.gz
配置
服务器配置:
frps.ini文件:
[common]
bind_port = 9999 # 表示frp服务监听着9999端口
客户端配置:
frpc.ini文件:
[common]
server_addr = 我自己的阿里云服务器ip
server_port = 9999 # 表示云服务器的frp服务所监听的端口
[ssh] # 配置ssh穿透
type = tcp
local_ip = 127.0.0.1 # 固定写法
local_port = 22 # 表示客户端上的ssh服务监听着自己的22号端口
remote_port = 6666 # 表示云服务器上对访问内网客户端所代理的端口
服务端、客户端运行
先启动服务端:
# ./frps -c ./frps.ini
再启动客户端:
# ./frpc -c ./frpc.ini
两者都启动以后,外网用户便可以通过 ssh root@阿里云服务器ip -p 6666 来访问我的主机了
关于防火墙
阿里云上:
开放了6666端口用于访问主机22端口的代理
开放了9999端口用于主机frp客户端连接监听着9999端口的frp服务端
实验现象
云服务器frp服务开始监听:
主机frp客户端开始连接云服务frp服务(云服务器防火墙不开6666与9999端口的下场):
主机frp客户端开始连接云服务frp服务:
云服务器frp服务接收到主机frp客户端的连接:
拿一个与主机不在同一网段(局域网)的设备ssh主机:
(直接在阿里云上花了15元租了一周debian)
看看效果:
内网穿透成功!