You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
9.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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会特地出几个内网隔离的机器要用跳板除了用NCSSH也算是个不错的选择了。有防火墙直接把靶服务映射到自己机器上打打起来和没防火墙一个手感。再不行直接代理接过去装作目标主机扫描的时候也会方便很多。反弹shell连不到自己主机把自己映射到跳板机上吧各种连接轻松搞定。
就是不打CTF就说在外面突然想下论文学校能上知网挂个树莓派在学校frp连到公网服务器SSH隧道开代理然后就能随便下论文了。
# 总结
我现在又感觉互联的网络回来了看来就是有内网、防火墙也阻挡不了两台逻辑上能连接的主机。SSH真的是很厉害啊……虽然我才知道这一点不过这也就是学习的过程嘛了解了这个也许对网络有了更深入的认识吧……