关于 SSH 端口转发

SSH 的端口转发很实用,但我总觉得难以理解和记忆,直到最近才有所好转。 因为又派上用场了。以前基本只做做内网穿透,现在更多地拿来绕过防火墙。自己的服务器,大多数端口虽然都是被禁用的(至少禁止入网,这也是正常的安全措施),但是想要连接的话直接本地端口转发就可以了。 TL;DR 本地端口转发在当前机器上设置,然后从本机出发,通过另一台机器,连接其他的机器。适用于防火墙的绕过、多重 SSH 登录等。 远程端口转发在当前机器上设置,然后从另外一台机器出发,通过当前机器,连接本机或者其他的机器。适用于 NAT 网络穿透、暴露内部网络服务等。 本质上都是先建立 SSH 会话,形成隧道,然后在上面进行正向或反向的数据传输。 Local Port Forwarding 为什么叫做本地呢,我想有两个原因: 转发的端口在当前(执行 SSH 命令这台)机器上 请求是从当前机器发出的 当前机器就是我的笔记本,另外一台是服务器。比如,在服务器上部署一个应用,开放给 8000 端口,但是被墙掉了,没办法在本地调试,怎么办?防火墙肯定开放了 SSH 登录的端口,比如 22,那么就让请求从本地的端口发送到服务器的 22 端口,再转发到 8000 端口,最后原路返回。我可以设置本地的端口也是 8000,这样直接用 localhost:8000 来访问应用就好了。 转发的重点在于本地的 8000 端口和服务器的 22 端口之间,因为请求到了服务器之后可以给应用的 8000,也可以给其他的机器,只要服务器能连接到: # ssh -L local_port:dest_addr:dest_port server # Local 8000 < -- > Server 22 < -- > Server 8000 # -fNT 让 ssh 不要打开服务器 shell,并且转为后台运行 # server 隐含了使用 22 端口登录,当然也可以在 ssh config 中设置任意登录端口 ssh -fNT -L 8000:localhost:8000 server 注意这里的 dest 对应的 src 是 server,也就是说 localhost 及后面的 8000 都是 server 的 IP 和端口。可以理解为 server 是中介,整条通路是 local -> server -> dest....

12-22 · 2 min

From BitTorrent to Firewall

服务器能做什么?在 Awesome-Selfhosted 里可以找到上百种答案。如果带宽不算太小的话,那么 BT 下载是个不错的尝试。借着 No Time to Die 的上映我开始重温 007 系列,从皇家赌场到幽灵党,在服务器上的下载体验是很好的。 BitTorrent 在此之前,我基本上把 BT、种子、磁力、迅雷下载当成同一种东西。下载电影?先找种子或者磁力链接,打开迅雷下载,然后视速度决定要不要开个会员。 实际上这完全曲解了 BT 下载。 首先 BitTorrent 是一种网络协议。还记得计算机网络一开始就提到过除了 C/S 架构之外,还有 P2P(Peer-to-peer),也就是网络中的各个节点都扮演了同等的角色,既是客户端也是服务器。BT 基于 P2P 实现了去中心化的文件分享,让网络数据的传输不再仅限于服务器的能力,而是共享带宽,每个人下载的同时也在上传,所以越多人参与速度就越快。 类似于 HTTP 和 FTP,BT 也是基于 TCP/IP 的一种应用层协议。基本上它是这么运作的: 我有一部电影,想把资源分享到网络,要先提供一个种子文件 种子文件实际上就是个文本文件,里面主要记录两部分信息 Trackers: 就是 Tracker 服务器的地址,这个服务器不是用来下载资源的,而是用于获取其他 Peers 的联系方式 Files: 一个视频文件会被(逻辑)划分为很多个虚拟分块,每块的索引和验证码都包含在这里 接下来我把种子文件发布出去,等待别人下载 这时候有人获取到种子了,于是开启了 BT 客户端下载 客户端先解析种子文件中的信息,找到 Tracker,然后询问有哪些 Peers 因为是第一个下载者,所以 Tracker 告知 Peer 目前只有我,也就是发布者...

12-20 · 2 min