[GFW]我的SSH我做主——秘密握手

2012年6月4日 | 分类: 翻墙相关 | 标签: , ,

恰好今天看到所用的ssh代理服务供应商开始在server上部署和测试Obfuscation功能,以增强抵御某怪物干扰用户正常使用ssh代理的能力。

1. 原理

以下是ISP提供的说明:

那何为Obfuscation?
查了下Wikipedia:

In cryptography, obfuscation refers to encoding the input data before it is sent to
a hash function or other encryption scheme. This technique helps to make brute force
attacks unfeasible, as it is difficult to determine the correct cleartext.

从密码学角度上讲,Obfuscation(混淆)指的是在将所输入的数据发送至哈希公式或者其他加密公式
前对其进行编码,该技术使得暴利破解难以见效,因为要确认正确的明文非常困难。

概念蛮绕口的,然后我那烂翻译也……不过意思还是很清楚的,实际上就是将handshake易容,这样怪物就看不出来数据传输用的ssh协议了,然后ssh代理满血归来。

2. 解决方案
牛人Bruce Leidl为openssh写了个很给力的补丁。它可以在创建加密SSH连接时将握手信号(handshake)进行混淆处理。这样一个加密的握手信号就可以骗过怪物所用的深度包检测设备,顺利完成使命,进而保证了网络的安全性与稳定性。
(1)准备
你需要有一台位于怪物控制范围的Linux服务器,然后在服务器上配置好Obfuscated-openssh补丁。
Obfuscated-openssh点此下载,然后执行下述命令编译安装:

./configure
make
make install

建议将其与常规的SSH守护进程分开安装。
(2)配置
作为SSH代理的话,没有必要让用户通过ssh登陆服务器,因此需要将此部分权限给限制掉,让用户只能使用SOCKS代理。要做到这点,需要创建专用的用户账号。

以下即为添加一个名为“golengssh”而密码为“goleng.com”用户的命令,该用户无法远程登入服务器。

sudo useradd -m -s /usr/sbin/nologin -p goleng.com golengssh

小贴士:useradd命令用法参见此文

下面为大家提供一个samplesshd_config文件共参考使用,使用此文件只允许用户“golengssh”连接服务器。

Linux下安装ssh客户端需要激活sshd,参考此文

Linux下连接服务器的命令是:

ssh -Nfx -D 7070 -z yuanjin golengssh@goleng.com -p 443

这里的“yuanjin”就是在配置文件中的ObfuscateKeyword,ssh的服务器端口为443,最后设置浏览器的SOCKS代理至本地的7070端口,可参考此文
关于SSH命令转发更多的内容可以参考此文,上述命令的例子感谢ISP客服提供的参考。

SSHD_config
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
#
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

# This ssh daemon is meant to be run separately from the regular
# non-obfuscated sshd. A single user account is enough for this purpose.
# You should make sure this user does not have shell access, by changing
# the shell to /usr/sbin/nologin. This example adds a new user "golengssh" with
# password "goleng.com".
# sudo useradd -m -s /usr/sbin/nologin -p goleng.com golengssh
#
AllowUsers golengssh

# To set up a SOCKS proxy, execute an obfuscated-openssh client like so:
# ssh -Nfx -D 7070 -z yuanjin golengssh@goleng.com -p 443
# The client will now be running a SOCKS proxy on localhost:7070 and forwarding
# all traffic to the ssh server port 443. User will need to configure web browsers and
# such to use the SOCKS proxy.
#
Protocol 2
ObfuscatedPort 443
ObfuscateKeyword yuanjin
#Port 22

SyslogFacility AUTH
LogLevel ERROR
LoginGraceTime 2m
PermitRootLogin no
StrictModes yes
MaxAuthTries 6
MaxSessions 10
PermitEmptyPasswords no

AllowAgentForwarding no
AllowTcpForwarding yes
PrintLastLog no
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3
PidFile /var/run/obf_sshd.pid
#MaxStartups 10
#PermitTunnel no
ChrootDirectory /home/golengssh

# no default banner path
#Banner none

参考文章:
[1]Secret Handshake for Iran http://nihilex.com/obfuscated-openssh
[2]Obfuscation http://en.wikipedia.org/wiki/Obfuscation

来源http://www.goleng.com/?p=665

此类技术用于翻墙,据我知道最早是赛风3在用,我在 http://igfw.net/archives/7152 一文中有过详述,有兴趣的看看。

  1. CoTea
    2012年6月4日22:54

    其实我最近一直在考虑到底如何能做到安全的群组聊天,大概少于10个人的规模。gtalk和聊天室加好友的办法貌似也不那么好用,聊天室不能随便建立不提,本身也没有加密。IRC聊天室除了搭建问题外加密还是个问题……本来想借用匿名者的IRC的,不过之前允许自建房间的一个挂掉了,现在彻底没辙了\(^o^)/