内网穿透

291 阅读3分钟

问题引出

众所周知,当前ipv4地址已经几乎用尽,各大ISP几乎不可能再分配公网上的ip给我们,所以我们拿到的ip是经过ISP利用NAT产生的内网ip。

以手机为例子,状态信息中的ip就是一个ISP的内网ip:

10.10.127.12

image.png

但我们通过百度搜索ip,仍然会弹出一个公网ip:

183.95.249.23

image.png

显而易见,这是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借鉴的图中的)

A270F602C871DC0379D7B8DF071F1725.jpg

可我若是偏要让别人能访问到我没有公网ip的计算机呢?

通过内网穿透实现

问题解决

利用内网穿透工具frp

前提

有一个具有公网ip的云服务器

下载地址

github.com/fatedier/fr…

安装

云服务器(服务端)实际上是做一个代理

# curl -zxvf frp_0.45.0_linux_amd64.tar.gz

客户端安装:

# curl -zxvf frp_0.45.0_linux_amd64.tar.gz

image.png

配置

服务器配置:

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服务开始监听:

image.png

主机frp客户端开始连接云服务frp服务(云服务器防火墙不开6666与9999端口的下场):

image.png

主机frp客户端开始连接云服务frp服务:

image.png

云服务器frp服务接收到主机frp客户端的连接:

image.png

拿一个与主机不在同一网段(局域网)的设备ssh主机:

(直接在阿里云上花了15元租了一周debian)

image.png

看看效果:

image.png

内网穿透成功!

参考: juejin.cn/post/697182…