唔,似乎刷新了窝博客中最长标题记录呢 QQ图片20150919235138

不过想不到其他又短又可以明确表述意思的标题了,话说这个应该叫映射吗,感觉有点不妥呢。。嘛,先这样吧。

标题会不会把你绕晕了呢?少安毋躁,窝等会慢慢说。

为什么要写这个呢?主要是为了记录一下配置 SSH 端口转发时的坑,也好让后来人少踩点坑。当时真的是走了不少弯路,折腾了好长时间(虽然一大部分时间都是因为叫别人操作的延迟 qwq)

注意,这篇文章可能会有一些你看不懂得词汇,窝会尽量都说明一下,但主要还是要靠你的学习能力(其实窝觉着能靠搜索引擎找到这篇文章的人学习能力都不会差吧~)
那么,文章正式开始吧~


那么这个标题到底是什么意思呢?首先来了解一下如下概念吧:

内网 Minecraft 服务器

所谓 内网 Minecraft 服务器,就是架设在内网机器上的 MC 服务器,这些机器的最大特点,那就是 不能从外网直接访问

不能直接访问的原因有很多,最大的原因就是 没有公网 IP,经过多级 NAT,没有修改 NAT 设备(例如路由器)配置的权限 之类。举个栗子,就像校园网,公司网络这样的。不同于普通家庭 PC 开服,校园网完全访问不到上级 NAT 设备,更不要提什么配置端口转发之类的了,所以很多人就这样放弃了开服,或者使用 花生壳,NAT123 之类的 “端口映射” 软件。

那么这类软件的原理是什么呢?

花生壳端口映射的原理

用过所谓 花生壳 内网版 的都知道,开启了端口映射后,你就可以从花生壳那里拿到一个类似于 diaoxiancheng.6655.la:24000 这样的地址,访问这个地址就相当于直接访问内网机器上的端口了。

噫,不是说不能端口映射吗?花生壳这啥黑科技?

首先你要知道,所谓的路由器上设置端口映射,其实就是将外网访问 NAT 设备某个端口的请求,直接转发给规则中配置的 NAT 网络下的内网设备端口上。不知道说的是不是够严谨,总之差不多就是这个意思。实现方式有很多,譬如 OpenWRT 上使用的 iptables。

而花生壳,就是把 NAT 设备将请求转发到内网机器上 *这一过程及其反向,用花生壳的服务器*来完成了。

这样说说可能有些人还是一头雾水,窝画张图来解释下吧:(提到画图歪一下文,安利下 Gliffy,贼好用)

NAT port forwarding

这是普通的路由器端口映射原理,下面是花生壳 “端口映射” 原理:

oray portforwarding

是不是很熟悉呢。。没错,就是翻墙的原理。花生壳用它自己的服务器与内网机器建立 TCP 连接(穿过 NAT),监听内网机器本地端口,将数据包转发至花生壳服务器,花生壳服务器再将数据包转发至客户端。也就是类似于代理服务器。

那么知道了原理,窝们是不是可以自己实现一个呢?

SSH 端口转发(隧道)

这是个什么鬼?嘛,具体的网上也有很多文章,窝这里就简单讲一下吧。

SSH,Secure Shell,是一项创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境。

稍微会一些运维的人都用过 ssh 连接过远程主机吧,但 ssh 还有一个非常屌的功能——隧道。

不过你只需要知道它可以在内网机器和外网机器之间建立一个连接并且传输数据就可以了。

其实严谨的讲,不应该将 SSH 端口转发(Port Forwarding)称作 隧道(Tunel),在 ssh 的 man page 里也有写,算是普遍的误解了,所以窝也就将错就错吧 qwq

关于 SSH 端口转发的更多信息,详见 Linux Wiki:SSH端口转发(隧道)


文至此,你应该已经懂了窝要干啥子了吧。其实窝搜到过一篇 MCBBS 上使用 VPN 做端口转发的教程,基本原理都是一样的,但是。。Windows Server。。嘛,这个配置过程实在是太不优雅了,使用 ssh -R 的话,就是一行的事儿(好吧其实是窝想装逼 )

知道了这些基本概念,那么 *下一页 *就开始配置吧~

PS. 下一页按钮在下面哦,上次这个阿卡林的 Pagination 就被人无视了 QwQ

准备材料:

  • 可用的,低延迟的国内 VPS 一台
  • 开服用的计算机
  • 足够的带宽
  • 不畏折腾的心

VPS 是作为中转,也就是 SSH Server,要求是与开服的计算机玩家计算机延迟低,推荐阿里云。

ping data

ping server

延迟还算可以接受,毕竟数据要来回两次嘛。

其实窝开始折腾这个也是因为辣a爷搞了个阿里云大学生的优惠 1G VPS 开服玩,但是经常炸,想要用宿舍里电脑开服,又因为有坑爹的校园网 qwq。

VPS 你怎么搞来窝不管,总之准备好就是啦

开启 Minecraft 服务器

这个窝就不说了吧,不会你还看这个干啥子对吧。

1

这里用最新版快照的官服做演示(话说官服加载真快啊)

那么再翻个页吧,后两页会分别介绍在 Linux 和 Windows 下开启 SSH 端口转发的方法。

好,新的一页,首先来介绍在 linux 环境下开启 SSH 端口转发的方法。

Linux 环境下的配置

首先来看看 ssh 的 man page 吧~这永远是了解一个命令的最好方法。

ssh -r man page

前提是你没有鹰文恐惧症的话。。嘛,如果真的不想看的话,不看也成,后面窝会写一篇关于 ssh 端口转发中 -L``-R-D 的区别(大概),这篇文章中只要跟着窝做就好啦

那么,来建立连接吧。打开你心爱的小终端~

ssh -R 0.0.0.0:25567:localhost:25565 root@your-server-ip

好了。

对,你没看错,好了。不信?

2

在输入密码后进入的 VPS shell 上执行 netstat -anp,是不是看到 sshd 已经在监听 25567 了? (虽然你看到的应该是监听在 127.0.0.1 上,具体为啥窝等下讲)

那么这行命令是什么意思呢?

这条命令的格式是这样的:

ssh -R [bind_address:]port:host:hostport

意思是让远程服务器监听 port 端口,使其被访问时像本地电脑在访问 host:hostport 一样。

ssh -R 0.0.0.0:25567:localhost:25565 root@your-server-ip

这样,访问 your-server-ip:25567 就等同于用本机访问 localhost:25565 一样。

通俗地讲,就是将本机的 25565 端口映射至 VPS 的 25567  端口。

那么 bind_address0.0.0.0 是什么呢?因为远程转发的端口默认也只能在远程服务器本机上访问(即 localhost 等本地环回地址),要想允许外部访问,就要将 bindaddress 设为 * 或者 0.0.0.0,并确保在服务器的 sshdconfig 中打开了 GatewayPorts 选项

看到粗体字了吗?这就是坑之一,也是为什么你执行完上面那条命令后,VPS 上显示监听在 127.0.0.1 上,而且 MC 客户端无法连接了。

那么来看一下 GatewayPorts 的 man page 吧:

gateway ports man page

不想看也没关系,总之只有打开了这个,才能在外网访问 VPS 所转发的端口。

在 VPS 上(血的教训),编辑 /etc/ssh/sshd_config,将其中的 GatewayPorts 设置为 on

sshd_config

保存后,重载 sshd ($ service sshd reload),再次执行上述命令,是不是发现端口已经监听在 0.0.0.0 上了呢?

而且 MC 客户端也可以正常访问到了~

mc succeed

液~~ 大☆成★功

小技巧:

像这样 ssh -R,输完密码(或密钥认证)后,会直接进入 VPS 的 Shell,但是窝们只想默默的转发个端口,要咋办呢?

有这些参数来拯救你!锵锵锵~

-f 认证之后,ssh 将自动转至后台运行

-N 不执行脚本或命令,即通知 sshd 不运行设定的 shell

-C 压缩传送的数据

ssh -f

Linux 下的端口转发配置这样就算结束了,是不是很简单呢~

那么下一页将会介绍 Windows 下配置 ssh 端口转发的方法。

好,来讲 Windows 下的配置吧。

其实 Win 下用 Cygwin/Babun 这些在终端里打 ssh -R 照样能建立连接,但是看这里的一般都想有个 GUI 吧?

那么,请出窝们这页的主角 —— PuTTY!(万能的 PuTTY)

1

这个应该都会吧,然后进 SSH – Tunel:

2

最后点 Add 按钮添加规则,去 Session 页,保存成一个配置集,以后就可以直接 Open 了。

putty

至此,你已完成 ssh 端口转发的配置。

除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 进行许可。