---
layout: post
title: 关于内网穿透的笔记
tags: [内网穿透]
---

  为了更好的运用资源，内网穿透是必要的。<!--more-->     
  
# 起因
  最近我的学校给我分配了一些服务器资源，大概在市场上价格基本上在1wCNY/mo的样子。这些资源非常好，但是有一个问题，那就是没有外网IP，想要运用这些资源必须要到机房。像机房那样的地方又冷又吵，不过我不在意，可惜问题不在这里，问题在于它只能在机房用，我又不能常常待在机房，那我到底应该怎么办呢？   
  其实解决方案很简单，那就是搞内网穿透。现在内网穿透的技术已经很多了，不过总体来说主要还是一个东西，那就是隧道。   
  
# 内网穿透的原理
  我大概查了一下相关的资料，一般来说内网是路由器自己划分出来的局域网。正常来说，如果想让所有的机器都登上外网，可以把路由器换成交换机，可惜换不得，毕竟外网IPv4的资源是有限的，就是插了交换机，也需要ISP分配IP地址给机器。   
  根据我的了解，局域网和广域网进行通信的时候会用到一个叫做NAT的技术，大概原理就是路由器在内网访问外网时能把自己伪装成一般的电脑向其他服务器发送数据，发送过去的时候路由器会记住是哪个内网设备发送的数据，最终传回的数据路由器也会按原路转发回请求的主机，通过这样就可以把内网和外网联系起来。   
  这时候就会有一个问题，那就是在这个过程中路由器和其他的电脑没有什么区别，假如在广域网的机器想要访问局域网的机器，那么正常来说就是直接访问那个路由器所在的IP就可以了，但是内网并没有发请求给广域网，路由器也不知道要把数据传给谁，它就会把这个数据丢掉。   
  这个问题应该怎么解决？其实很简单，那就是连之前先由局域网的机器向想要访问这个机器的外网机器发送数据，这样外网机器就能顺理成章的连到内网的机器里面了，这确实是一个不错的解决方案，事实上现在几乎所有的内网穿透都是使用的这个方案。   
  除此之外还有一个叫做UPnP的协议貌似也可以穿透，P2P应该都是用的这种方法，不过需要路由器支持才行。这种协议好像可以自动进行端口映射，大概是通过某种协议让路由器可以在内网机器没有主动发送数据的情况下把数据发送给内网机器吧，具体我也不是很清楚。    
  另外如果有内网与外网相连的路由器的管理权限，也同样可以做到内网穿透，直接搞端口映射就完事，这种就更加简单了，但是一般情况下我们肯定没有路由器的管理权，不然也不至于这么苦恼了。   
  
# 一些实现的方案
  现在内网穿透的技术有很多，不过因为内网机器直接主动连外网这种方法比较简单，所以接下来说到的方法基本上都是通过这种方式的。   
## 利用VPN创建隧道
  VPN的原理是通过由主机主动向VPN服务器连接隧道并通过虚拟一个路由器组成VLAN的一种技术，通过这个介绍也能很明显看出来这是由主机主动发出的吧，通过这种方式即使不在内网中也可以让内网的电脑连自己的VPN来连接内网的电脑，以此再继续连到内网电脑所能连接的网络里面。   
  这种方法算是比较简单，而且很安全的方式，不过可惜中国的好多ISP都屏蔽VPN，用这种方式不是很稳当。   
## SSH隧道
  SSH这个软件很强大，有的功能也很多。既然VPN被屏蔽了那22端口总不至于屏蔽吧，总不能把运维的饭都给抢了吧？通过SSH隧道的方式使用起来也很简单，在公网服务器上打开sshd的GatewayPorts功能，内网设备通过执行类似于`ssh -fN -R 10022:localhost:22 远程用户@远程主机`这样的命令启动隧道，然后其他电脑就可以通过这个公网服务器连这个内网设备了。   
  这种方法很不错，但是还是有一个问题，那就是需要租服务器（刚才的VPN同样需要），所以可以还有更好的方案。   
## 某些服务商提供的frp
  frp从名字上就能听出来它是一种代理吧，这种东西目前有很多服务商都有提供，比如SakuraFrp，还有花生壳啥的，当然如果手头有服务器也可以自己搭。这种的和前面几种不一样的是它反代出来的服务可以让其他用户直接用，很方便，不过有一个限制，就是一台服务器最多只能反代出64551个服务（不考虑tcp和udp的区别），正常人都是够用了。   
## 端口映射
  这是最好的方案，毕竟这样做可以保证不限速，而且也不需要外网服务器，但是路由器的管理权限很难搞，这确实没办法。   

# 后记
  所以最后我用了哪种方案呢？既然端口映射最好那当然是用这个啦！但是有一个问题是我没有路由器管理权，怎么办呢？没关系，这个路由器以前有人做过端口映射，只是现在没人用了而已，于是我就跟着这个配置把服务器设置成和被映射主机一样的IP，然后就可以用了。   
  另外就是运用资源的问题了，这么多资源我自己用都想不出来干什么比较好，所以我考虑要不然搞IDC？总之在资源利用起来之前先让它们为世界做点贡献吧，这些服务器算力确实猛，在WCGrid里目前我的每日排名都能达到世界前200，确实厉害。
