---
layout: post
title: 网络任意互联指南
tags: [网络, SSH, 指南]
---

  SSH真的是太厉害了！<!--more-->     
  
# 起因
  最近一段时间我对网络的各种连法很感兴趣，比如说内网穿透，端口映射或者说打隧道之类的。一般来说做这些事情应该都要装一些软件才行，不过最近我发现居然平时很常用的SSH竟然包含所有我想要的这些功能，真的是让我感觉很神奇。所以也许我已经火星了，但是今天我还是想记录一下。   
  
# 万能的SSH
  如果你以为SSH就只是加密了的Telnet，那可真是大错特错，我感觉SSH想做的事情要更厉害，它可能是想做一个加密的TCP，上面可以跑各种应用，而且防火墙还不知道里面跑的内容是什么。   
  不过最终它也没能取代TCP，毕竟它本来就是基于TCP的，而且其他很多功能用的人也很少，这让我感觉很可惜……不过确实，SSH啥都能干，就是速度慢了亿点点……   
  所以我今天就来说一说它的功能和一些上位替代。   
## 内网穿透
  假如我有一台电脑在家，然后我还租了一个垃圾云服务器，服务器的性能很差但是家里的电脑性能很好。假如有一天我想在外面去玩我的电脑要怎么办呢？   
  一般来说家里的电脑都是在内网之中，而服务器都是在公网，任何一个地方都能访问，现在我如果想访问家里的电脑直接连难度很大，几乎是做不到的对吧，于是这时候我们可以让家里的电脑去连服务器，这样我们就有一条链路连接到家里的电脑了，然后我们再用别的设备去连服务器，这样我们就能间接访问我们的电脑了。   
  具体要怎么做呢？很简单，用SSH就能解决这个问题，首先一般服务器上都装的是Linux系统，一般都是自带OpenSSH的，而且还是SSH服务端，现在的Windows 10也是默认自带OpenSSH的，只不过是客户端。所以首先我们要做的就是用家里的电脑去连服务器。这时候的连接不能直接SSH连过去，普通的连没有任何作用，只是登录到远程服务器上了而已，我们必须要加上一些参数，就像这样：
```
ssh -R 3389:127.0.0.1:3389 root@remote-ip
```
  执行这条指令之后系统仍然会正常的去连接到远程服务器上，但是你如果执行一下`netstat -nlp`的话，就可以发现SSH在本地也监听了一个3389的端口。不过默认的配置下SSH只会在服务器上映射这个端口，在服务器外是连不上的，另外如果说我只想穿透而不想打开服务器终端要该怎么办呢？   
  首先默认不登录终端这个方法很简单，加点参数就可以，就像这样：
```
ssh -CfNR 3389:127.0.0.1:3389 root@remote-ip
```
  这样启动穿透之后就不会在家里的电脑上一直开着服务器终端了，只会有一个黑框而已，当然因为用了`-f`参数，你即使把黑框关了也不会影响。另外还有就是映射到服务器外这个问题，其实这个问题也很好解决，在sshd配置文件里把`GatewayPorts no`改成`GatewayPorts yes`，设置好了之后别忘了在服务器的防火墙和服务器托管商的防火墙那里放行端口。
## 端口映射
  假如上面的穿透你设置好了，但是你说你不知道sshd配置文件在哪里？防火墙关不掉？服务器不是你的？好家伙，那内网穿透还搞什么？没关系，SSH比你想象的要厉害，假如你没办法开服务器的端口，那你可以把服务器上面的端口映射到本机上。   
  那么现在内网穿透已经搞好了，但是由于各种各样的原因你访问不到服务器的端口，这时候你在外面，可以在外面用电脑执行以下命令：
```
ssh -CfNL 3390:127.0.0.1:3389 root@remote-ip
```
  这样一波操作，你家里的那台电脑上的3389端口就被映射到了你现在用的电脑上的3390端口了，当然效率很低这个没办法，毕竟SSH这些功能没有完全流行起来也是因为它的效率确实低，而且还容易断，也没个自带的断线重连……    
## 代理隧道
  虽然说我现在很想吐槽一下SSH并且想要赶紧说说它的一些上位替代，不过我还是先把所有的SSH厉害的功能讲完吧。   
  SSH更厉害的功能就是随手开代理，又叫做动态端口映射，一般来说如果想要在服务器上配置一个代理很麻烦而且也很费时间，但是如果用SSH隧道开一个代理就只用一条命令，而且还不需要在服务器上做任何配置，真的是非常的方便。
  具体是什么命令呢？很简单，就是这样：
```
ssh -CfND 127.0.0.1:1080 root@remote-ip
```
  执行这条命令之后就会在本机开一个监听地址为`127.0.0.1:1080`的socks5代理，你可以使用Proxifier之类的socks5客户端去连接它，然后就能直接通过这个代理用服务器上网了。假如你还想把这个代理共享给其他同在局域网的人用，可以把`127.0.0.1`改成`0.0.0.0`并且加一个`-g`的参数，这样同网络的人也就可以通过你的电脑连接到隧道上了。   
  当然这个相比于上面那个端口映射要厉害一些，不过如果没有socks5客户端就只能用上面那个了。   
  另外如果有国外的服务器，也可以使用这种方式穿过防火长城，而且因为它是走的SSH隧道，基本上很难通过流量分析看出来你在做什么，可惜就是效率太低，很慢，所以即使它抗封锁能力不错，但是用的人不是很多……   
  所以呢，SSH作为系统自带的软件，功能已经是非常强大了，有这些功能基本上可以在一定程度上无视防火墙，随便穿，轻松透，而且再加上scp、sftp等功能，连接不同的电脑真的是从未如此轻松。   
  很可惜，这么好的软件效率太低了，我试了一下用把同网络下的树莓派做成代理，速度基本上只能达到10Mbps左右，可能看1080p的直播没有问题，再高一些的蓝光视频还是不太行，会时不时的卡，另外就更不用说连接国外的服务器了，看网页确确实实没有问题，视频的话也只是勉强能看，体验还是不够好。虽然它作为默认安装的软件很不错，但是我们还是要考虑体验的嘛，所以我就来说说它的一些上位替代品吧。
  
# SSH部分功能的上位替代
## 内网穿透
  假如想要自己做一个内网穿透，目前以我自己的感受来说，感觉还是[frp](https://github.com/fatedier/frp)最好用，应该说不愧是Golang写的程序，配置简单，即开即用。下载一个frps的程序放在公网的服务器上，基本上用默认的配置就可以直接使用，不过为了安全还是建议稍微改一改，默认情况下是没有验证和加密的。内网机器的话就用frpc连接就可以了，具体怎么搭建官方文档已经说的很清楚了，这里就不再多描述。另外如果没有公网服务器也可以试试SakuraFrp，不过他们家貌似看起来快凉了，国内节点要花1CNY实名认证，国外节点目前凉的差不多了，而且貌似经常受到攻击，现在想充钱也充不了，还是挺糟糕的。   
  不过他们倒是挺良心的给了个[友商列表](https://www.natfrp.com/peer_vendors.php)，如果自己没服务器的话用这些服务商也是个不错的选择。   
## 代理隧道
  要是整正儿八经的隧道，还是得用Shadowsocks或者是V2ray之类的，一是反检测还是很厉害的，二是效率高，这些隧道软件速度是真的没话说，确实相比SSH隧道而言要快很多。如果要搭Shadowsocks-libev可以看看[这篇文章](https://gfw.report/blog/ss_tutorial/zh/)，V2ray的话GitHub上有很多那种一键脚本，直接用的话也没问题，包括也有更稳当的Cloudflare+ws+tls模式非常的不错。   
  还有就是个人经验吧，如果真想好好上，最好不要自己租云服务器，因为大多数人没经验，不知道哪个线路好，搭出来性价比没有机场高，速度也没机场快，节点少，而且被封的成本更高，所以真要用还是去租机场比较合适。   
  因为我实际上对搞这些隧道并没有什么特别厉害的经验 ~~（不然我为啥不去开机场😂？）~~ ，所以这里就不再过多描述了。   

# 任意互联示例
  既然目前已经有办法任意访问或者映射端口，那么内网对于我们来说就不会有太多阻碍了（不过如果完全没有公网IP我确实真想不出来怎么搞，就是nat穿透还要一个接线的服务器）。这些东西假如以后打CTF还是蛮有用的，有时候CTF会特地出几个内网隔离的机器，要用跳板，除了用NC，SSH也算是个不错的选择了。有防火墙？直接把靶服务映射到自己机器上打，打起来和没防火墙一个手感。再不行直接代理接过去装作目标主机，扫描的时候也会方便很多。反弹shell连不到自己主机？把自己映射到跳板机上吧，各种连接轻松搞定。   
  就是不打CTF，就说在外面突然想下论文，学校能上知网？挂个树莓派在学校，frp连到公网服务器，SSH隧道开代理，然后就能随便下论文了。   
  
# 总结
  我现在又感觉互联的网络回来了，看来就是有内网、防火墙也阻挡不了两台逻辑上能连接的主机。SSH真的是很厉害啊……虽然我才知道这一点，不过这也就是学习的过程嘛，了解了这个也许对网络有了更深入的认识吧……
