标签:
也不知道怎么了,一些网站访问总是不稳定, 速度也不能令人满意(呵呵,你懂的),总是上演道高一尺魔高一丈的激情攻防游戏。最近又学习了obfuscated ssh,作者08年开发出来但一直没受到重视,甚至连openssh都不接受作者的提交,然而谁也不知道路在何方,巧的是由于祖国的日益强大,obfuscated ssh近几年火了,还火的一塌糊涂。不多说,更多详情自己google、baidu吧,下边只讲一下安装使用过程。
项目地址:https://github.com/aligo/obfuscated-openssh
编译安装的话最好不要覆盖现有版本的ssh,使用时便于自主选择,下边的主要操作基于mac,linux下类似不多说,据说ubuntu已经默认支持了(没验证),windows就不提了装个potty就可以了。
一、以下是obfuscated ssh mac下的安装配置过程
下载源码:
https://github.com/brl/obfuscated-openssh/archive/master.zip
配置参数设置新目录:
?  brl-obfuscated-openssh-ca93a2c  ./configure  --prefix=/usr/local/newssh --sysconfdir=/etc/newssh
make:
? brl-obfuscated-openssh-ca93a2c make
在mac下make好像很多人都遇到了这个问题,解决方法很简单:
先make clean
找到Makefile的57行最后加入-lresolv,然后在进行make & make install
?  brl-obfuscated-openssh-ca93a2c  cat -n Makefile|grep LDFLAGS=
    57	LDFLAGS=-L. -Lopenbsd-compat/  -fstack-protector-all -lresolv
安装后效果如下:
使用:
/usr/local/newssh/bin/ssh -fCN  -Z obfuscate_keyword  ssh_user_name@ssh_server -p 110  -D 127.0.0.1:7070
这样就建立了完全的加密连接(初始化handshake的加密、ssh session的加密),设想如果有多个server的话,如何选择最快的server?
重点来了,那么可以结合ping、traceroute等检测手段选择最快的server进行连接(精华都在下边的脚本里,自己看),然后在结合crontab定期检测proxy的可用性,自动重连,呵呵,爽不,这里只贴出自己的脚本,详见https://github.com/LaiJingli/fastproxy
?  fastproxy  cat fastproxy_v2.sh
#!/bin/bash
###port forwarding support obfuscated ssh handshak using ssh as socks proxy server for fast access intranet web sites behind firewall from anywhere.
###by lai
###备选服务器列表
ssh_servers=(vip01.tttt.cn
vip02.tttt.cn
vip03.tttt.cn
vip04.tttt.cn
vip05.tttt.cn
vip06.tttt.cn
)
###备选端口列表
ssh_server_ports=(80 110 11231 10813)
###ssh相关参数定义
ssh_user_name=sshuser1
ssh_user_pass=123456
sshpass_cmd="/bin/sshpass -p$ssh_user_pass "
ssh_obf_cmd="/usr/local/newssh/bin/ssh -o StrictHostKeyChecking=no -p 110 -fCND 127.0.0.1:7070 -Z keyworks "
###定义运行此脚本所在os的ping返回结果格式
ping_os_type_macos="round-trip"
ping_os_type_linux="rtt"
ping_os_type=$ping_os_type_macos
#######以下内容不需要用户修改,自定义参数见上文变量定义部分
###parallel background detect which ssh server is the fastest according round-trip-time using ping and traceroute(for further support)
for i in `seq 0 $((${#ssh_servers[@]} - 1))` ;do
	ip=${ssh_servers[$i]}
	#echo $i $ip
	###get the average round-trip-time
	###ping 3次,每次间隔0.1s,超时1s
	ping -c 2 -i 0.1 -t 1 $ip |grep $ping_os_type|awk -F/ ‘{print $5}‘ > /tmp/${ip}_rtt.log 2>&1 &
	###记录每次ping进程的pid,以便后续根据pid是否存在判断进程是否早学完
	pids[$i]=$!
	#echo pid of $ip ${pids[$i]}
done
####循环检查pids数组中的pid是否运行结束的函数
pids_length=${#pids[@]}
array_check () {
   for i in `seq 0 $((${#pids[@]} - 1))` ;do
      #echo -------------------------------------array for loop----------------------
      if [  ${pids[$i]} == 0 ] ;then
         echo NULL >/dev/null
      else
      ####通过ps动态检查pid是否结束,返回0说明进程还没有结束
         ps aux|awk ‘{print $2}‘ | grep  ^${pids[$i]}$ 2>&1 >/dev/null
         pidstatus=$?
         ###if pids is not exists,that indecates the process is over,and display execute result,clean respective array elements
         if [ $pidstatus != 0 ] ;then
            ####进程结束后,打印执行结果log
	    ip=${ssh_servers[$i]}
	    rtt=`cat /tmp/${ip}_rtt.log`
	    rtts[$i]=$rtt
	    echo  "[$i] ping detect of ${ssh_servers[$i]} is over,and it‘s rtt is ${rtts[$i]} ms"
	    #####同时pids数组中对应pid重置为0
            pids[$i]=0
	    ####进程结束,返回200供后续判断
	    return 200
	    break
	 fi
      fi
	###wait for 1 seconds to check whether the pids is over
	#sleep 0.1
   done
}
####如果完成任务数complete_num不等于pids数组长度,则循环直到所有任务结束
complete_num=0
while [ ${complete_num} != ${pids_length} ] ;do
	#echo =================================while loop=======================================
	for ((j=0;j<${pids_length};j++)) ;do
		array_check
		####根据array_check函数返回值是否成功来确定complete_num数的增加
		if [ $? == 200 ] ;then
			complete_num=$((${complete_num}+1))
			####打印最近任务完成的数量
			echo -e "\033[35m\033[05m Ping Detect Report: complete_tasks/total_tasks:[${complete_num}/${pids_length}]\033[0m"
		fi
	done
done
###比较取到rtt最小的server地址
###初始化最小平均round-trip-time
min_rtt=10000
for i in `seq 0 $((${#ssh_servers[@]} - 1))` ;do
	rtt=${rtts[$i]}
	###如果当前rtt比最小的min_rtt还小,则min_rtt=$rtt
	if  [[ $(echo "$rtt < $min_rtt" |bc) = 1 ]];then
		min_rtt=$rtt
		min_ip=${ssh_servers[$i]}
	fi
done
echo ------------------------------
echo the fastest response time is $min_rtt ms of $min_ip ,to connect this server,plese wait a moment......
###kill the ssh session if it‘s pid is exist.
#ps aux|grep $ssh_user_name
ps aux|grep $ssh_user_name|grep -v grep|awk ‘{system("kill -9 "$2)}‘
#ps aux|grep $ssh_user_name|grep -v grep|awk ‘{print $2)}‘|xargs kill -9
#echo ------------------------------
###make connection to the fastest server
$sshpass_cmd$ssh_obf_cmd$ssh_user_name@$min_ip
pidstatus=$?
if [[ $pidstatus = 0 ]];then
	echo Good luck,you have alredeay connect to the fastest server!
else
	echo ERROR OCCUR,PLEASE CHECK.
fi
#echo ------------------------------
ps aux|grep $ssh_user_name
?  fastproxy
配合混淆ssh(obfuscated)的proxy智能线路选择
标签:
原文地址:http://blog.csdn.net/xuyaqun/article/details/42970627