如何突破网络审查
ar en es fa fr my ru vi

SSH隧道加密技术

SSH即安全外壳(Secure Shell),是一种标准协议,可对你的计算机和服务器之间的通信内容进行加密。该加密技术可以防止通信内容被网络运营商查看或修改。SSH可广泛应用于安全通信应用,最常见的就是安全登录服务器,以及安全文件转移(安全复制协议SCP或安全文件传输协议,SFTP)。

SSH尤其适用于绕开网络审查,因为它可以提供加密隧道,充当一个通用代理客户端。审查者不能完全屏蔽SSH,因为它不仅仅用来绕开网络审查;比如系统管理员也会使用SSH通过网络管理服务器。

使用SSH时需要一个服务器上的账户,通常使用UnixLinux服务器。为了绕开审查,该服务器需要能自由访问网络,并且提供者最好是信得过的人。有些公司也销售服务器账户,并且很多网络虚拟主机服务可以提供SSH访问。你可以在这里找到一个外壳账户提供商名单:http://www.google.com/Top/Computers/Internet/Access_Providers/Unix_Shell_Providers/,每个账户每月收费2-10美元。

大部分UnixLinux,和Mac OS计算机上已经预装了一个叫做OpenSSHSSH程序,作为一个命令行程序,从终端计算机上输入“ssh”就可以运行。Windows用户也可以使用一个叫做PuTTY的免费SSH工具。

所有新版SSH都支持创建防火墙安全会话转换协议(SOCKS)代理,允许网页浏览器和很多其它软件通过加密SSH链接使用未经屏蔽的网络。在本例中,我们仅讨论SSH的这种应用。下列步骤将在计算机的本地1080端口上设置一个SOCKS代理。

Linux/Unix 以及 MacOS 命令行 (以 OpenSSH 为例)

你可以从http://www.openssh.com/得到OpenSSH,但一般Linux/UnixMac OS计算机上会预装该程序。
你将运行的ssh命令包括一个本地端口号(典型的是1080),一个服务器名称和一个用户名(帐户名)。如下所示:

ssh -D localportnumber accountname@servername

例如:

ssh_1

然后会提示输入密码,接着就可以登录到服务器。通过使用-D选项,可以建立一个本地SOCKS代理,只要的计算机连接在服务器上,该代理就不会消失。注意:现在可以验证主机密钥并配置你的程序了,否则你将不能使用你创建的隧道!

Windows图形用户界面(以PuTTY为例)

你可以从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载到PuTTY。你可以把putty.exe程序保存到你的硬盘上,以备将来使用,或者你也可以直接从网站上运行该程序(通常,你可以在共用或公共的计算机上实现,比如图书馆或者网吧里的计算机)。

 

启动PuTTY后,可以看到一个配置对话框。首先,要输入打算连接SSH服务器的主机名(地址)(这里比如example.com)。如果你只知道IP地址,或者DNS屏蔽让你无法使用主机名,你可以用IP地址代替。如果你需要经常进行此操作,你可以创建一个PuTTY档案,这样就可以保存这些选项及后续选项以便将来使用。

PuTTY_config_1

接下来,在目录(Category)列表选择连接(Connection--> SSH,然后选择隧道(Tunnels)。

在源端口(Source port)后输入1080,然后选中动态(Dynamic“Ipv4”选项框。

PuTTY_config_2

现在点击添加(Add)按钮,接着点击打开(Open按钮。之后会建立一个到服务器的连接,然后会弹出一个窗口,提示你输入用户名(username)和密码(password)。

输入这些信息后你就可以登录到服务器,然后会收到一条来自服务器的命令行提示。这样就建立了SOCKS代理。注意:现在可以验证主机密钥并配置你的程序了,否则你将不能使用你创建的隧道!

主机密钥验证 

当你第一次连接到服务器时,会提示你确认该服务器的主机密钥指纹(host key fingerprint)。主机密钥指纹是一长串可以安全识别特定服务器的字母和数字(十六进制),比 如:57:ff:c9:60:10:17:67:bc:5c:00:85:37:20:95:36:dd。检查主机密钥指纹是一项安全措施,可以确保你是 在和你认为你连接的服务器进行通信,并且加密后的连接无法破解。

SSH并不提供自动验证方法。为了享用该安全机制带来的好处,你应该和服务器提供者一起核对主机密钥指纹,或者让一个信得过的人连接同一台服务器,看其是否可以看到同样的指纹。

如果你想确保让SSH保护你的通信内容不被窃听,验证主机密钥指纹就很有必要;但如果你只想绕开审查,而不在乎网络运营商时候可以看到你的通信内容,则没有必要验证指纹。

配置程序,使用代理

只要你不关闭SSH程序,通过以上步骤建立的代理会一直有效。但如果你的网络连接被中断了,你需要重复上面的步骤,重新激活代理。 

启动并运行代理之后,你需要设置软件以使用代理。通过以上步骤,你得到的是一个位于本地主机(localhost)的SOCKS代理,端口为1080(也即127.0.0.1,端口1080)。你应该确保软件设置可以阻止DNS泄漏,否则SSH的隐私保护和审查绕行效果可能会受到影响。

更多选项

到目前为止,所有这些命令都显示在远程计算机上,接着你可以从该远程计算机执行其提供给你的任何命令。有时你可能想要在远程计算机上只执行一个命令,随后返回你的本地计算机上的命令行。这可以通过将要在远程计算机上执行的命令放在单引号中实现。

$ ssh remoteusername@othermachine.domain.org 'mkdir /home/myname/newdir'

有时,你需要在远程计算机上执行耗时命令,但你不能确保你当前的ssh会话有足够的时间。如果你在命令执行完成前关闭远程连接,那么该命令将被中 止。为了防止你的任务丢失,你可以通过ssh启动一个远程窗口会话,然后断开它,并在你想的任何时候重连它。要断开一个远程窗口会话,只要关闭ssh连接 即可:断开的窗口会话将仍运行于远程计算机上。

ssh提供了许多其他选项。你也可以设置你最喜爱的系统允许不用每次输入你的密码就可以登录或运行命令。该设置是复杂的,但可以节省你很多的输入工作;尝试对“ssh-keygen”、“ssh-add”和“authorized_keys”做一些网络搜索。

 

scp: file copying

SSH协议超出了基本ssh命令。一种基于SSH协议的特别有用的命令是scp,即安全复制命令。下面的例子从你本地计算机上的当前目录复制一个文件到远程计算机上的目录/home/me/stuff

$ scp myprog.py me@othermachine.domain.org:/home/me/stuff

请注意,该命令将覆盖已存在于name /home/me/stuff/myprog.py的任何文件。(或者当已有该名称的文件且你无权重写它时,你将得到一个错误信息。)如果/home/me是你的主目录,那么目标目录可以被缩写。

$ scp myprog.py me@othermachine.domain.org:stuff

在另一个方向,你也可以如此简单地复制:从远程计算机到你的本地计算机。

$ scp me@othermachine.domain.org:docs/interview.txt yesterday-interview.txt

远程计算机上的文件是你主目录的docs子目录中的interview.txt。这个文件将被复制到你本地系统主目录中的yesterday-interview.txt。

scp可被用于从一个远程计算机向另一个远程计算机复制文件。

$ scp user1@host1:file1 user2@host2:otherdir

要循环复制一个目录中的所有文件和子目录,可以使用-r选项。

$ scp -r user1@host1:dir1 user2@host2:dir2

查看scp手册页以获得更多选项。

rsync: 自动批量传输和备份

rsync是一个非常有用的命令,其可以使远程目录和本地目录保持同步。我们在此提到它是因为其像ssh一样是进行网络活动的有用的命令行形式,同 时也因为SSH协议被推荐为rsync的底层传输。以下是一个简单而有用的例子。其从你的本地/home/myname/docs目录向system quantum.example.edu上你的主目录中名为backup/的目录复制文件。实际上,rsync减少了通过各种复杂检查必须的复制量。

$ rsync -e ssh -a /home/myname/docs me@quantum.example.edu:backup/

指向ssh的-e选项使用被推荐的底层传输SSH协议。-a选项(代表“存档”)复制指定目录内的一切东西。如果你想在本地系统上的文件被复制后将其删除,那么要包含一个--删除选项。

经常使用SSH使你的生活更容易

如果你使用SSH连接到许多不同的服务器,你经常会出现误输用户名或者甚至是主机名的错误(试想要尝试记住20个不同的用户名/主机的组合)。值得庆幸的是,SSH提供了一种简单的方法来通过一个配置文件管理会话信息。

该配置文件隐藏在.ssh目录(完整路径可能类似/home/jsmith/.ssh/config-如果该文件不存在,你可以创建它)下你的主目录中。使用你最喜爱的编辑器打开这个文件,并像这样指定主机:


Host dev
HostName example.com
User fc

你可以像这样在你的配置文件里设置多个主机,在保存以后,通过运行以下命令连接到你成为“dev”的主机。

$ ssh dev

请记住,你经常使用这些命令越多,你节省的时间也就越多。