利用ssh隧道解决登录vps服务器慢的问题

0. 背景

linode的vps在某些网络下访问比较慢,甚至还有丢包的情况。但是从国内的服务器ping过去,一切正常。之前听说过ssh端口转发及隧道特性,于是考虑在通过正常的国内服务器去登录vps。

1. 传统做法

先登录稳定服务器,然后在上面再通过ssh登录到目标机器。虽然简单直接,但这样的缺点也显而易见,证书管理不方便。

2. SSH隧道方式

这里是基于稳定服务器将vps的端口转发到了本地。

step1 先登录稳定服务器
ssh -L 36000:VPS-IP:22 稳定服务器IP
这里通过稳定服务器,将VPS的22端口转发到了本地的36000端口

step2 登录本地端口
ssh -p 36000 localhost
由于是转发,这里之前在VPS上配置的证书依然可以使用,只是换了一个端口和IP而已。

3. 其他使用场景
本地端口转发还有一个比较实用的场景,就是可以将服务器的内网端口转发到本地。比如,有些开发同学习惯通过本地的IDE连接远程的mysql,这样将数据库的远程访问权限打开有一定安全隐患。体验下另外一种方式:

# 先将远程服务器的192.168.2.110:3307端口映射到本地33070
ssh -L 33070:192.168.2.110:3307 跳板机IP

#登录本地33070端口,注意将host指定为127.0.0.1
mysql -P 33070 -h127.0.0.1 -uusername -p'password'

4. 其他转发方式

除了将远程端口转发到本地(Local Forwarding),还有两种方式:
– 动态端口转发(Dynamic Forwarding)
ssh -D [bind_addr]:port user@server
适合代理方式

– 远程端口转发(Remote Forwarding)
ssh -R [bind_addr]:port:host:hostport user@server
相当于将host:hostport映射到了server:port上

5. 参考资料
SSH端口转发以及应用实例
三种不同类型的ssh隧道
SSH隧道简洁介绍以及SSH隧道实际应用
实战ssh端口转发

将博客转回了wordpress

当初选择drupal是因为它是一个CMS系统,除了blog以外还有其他扩展功能。但是一直以来就使用了blog的功能,而且模块、系统的更新比较频繁,有些是有安全更新。稍不注意,就会错过几个重要更新。最近帮同学搭建了一个团队博客,试用了wordpress,给人耳目一新的感觉。于是就考虑转换。

之前从wordpress转到durpal的时候,有一个免费的模块,很方便;wordpress插件中心虽然也提供转换服务,但是第三方收费的。所以考虑升级sql的方式,有两种版本(23),其实大同小异,我采用的是方法3,不过有几个地方需要注意:

– 那不是个可执行的sql文件,需要将行首的#替换成–
– 需要将comment_parent置为1
– 需要指定博客作者
– 我这里term_data.vid为1的是分类,其他的是tag,创建分类时需要指定下
– 由于是多行,可以在phpMyadmin里直接执行sql

另外,
为了兼容之前的地址,我将rewrite规则也改成了node/xxx形式。

enjoy it!

参考链接:
Drupal 转 WordPress
Drupal to WordPress migration

冬意渐浓

0 历时两年半的拉锯终于拿到驾照了-_-
正如科目三时一教练所言,学车本身不难,而是你的态度,是否重视它

1 团队激情不足,个人仍须积累
后面一段时间的主要任务是带团队提升战斗力,当然个人知识深度广度也需要积累,技术路线很忌讳眼高手低

2 换房子,理想与现实的选择
虽然去年咬咬牙入手了一套一局,但下午中介一番介绍后让人觉得水涨船高换房子有点遥远。好在中介说我们这小户型的利用率在90%以上,老婆和我顿时感觉到冬日温暖。
不是选择过多而是现实没有选择,努力吧!后面要带领兄弟姐妹练练手。fighting!

3 前天晚上小侄子看《天天向上》时非要说戴眼镜的主持人是他大大爷
难道没发现那晚的嘉宾和他大大娘有点像吗:)

4 上周五携家人一起看了场刘德华的演唱会,拉近了现实与年少梦想之间的距离。
同时也发现我空间里的背景音乐《峰回路转》是历年演唱会的主打歌:)

学会换气了

一直以为小时候在”三角坑”里和小伙伴们会使用狗刨,就是学会游泳,但最近发现每次下水后总是被呛。特别是上次去普吉岛看到二小在游泳池和5米深的海水里得瑟,很是羡慕。

二小其实也是半路出家,据说是主卧室友教会游泳的。二小教的是蛙泳姿势,所以我总是呛水。

受二妹指点,我今天主要练习憋气、换气和放松,有点像练绝世武功前的呼吸大法一样。调整好呼吸之后,没想到一切那么自然!轻松从1.6m跨越到2.2m,就像鱼儿水中游:)

今天第一次游完50m泳道,花了3’56”。下一步是学习标准姿势。

巴厘岛会议感想

– 过程要有邮件总结与输出,定期向boss汇报
– KPI是手段,但更是入场券、分数线
相对于业务里的亮点,KPI是必要条件。
– boss的想法就像狐狸,是跟着狐狸尾巴跑,还是跟着脑袋,这是个问题
– 一味模仿、一味追随很忙很累,也容易被人远远甩在后面
– 管理boss预期
要相信你在业务上是专家,当然,最好要有依据支撑
– 我平常有些事情答应太快,同时也缺乏持续的目标

三国笔记之彝陵之战

新版三国拍得不错,比起初中时那本永远也看不完后来也没时间看的岳麓出版社的原著,它更适合现代人熟悉历史。后续我会将读后感简单成笔记。不当之处敬请指正。

彝陵之战陆逊巧用火攻解决了刘备70w大军,这里有些地方值得思考:
– 孙权力挺陆逊
尤其是在犒军时带来了满朝积累的弹劾奏折,适当将压力传递下去。不知道孙权打仗怎样,但他绝对慧眼识英才。并在适当的时候放权、支持,甚至荣辱与共。
– 陆逊以退为进出奇制胜
陆逊一直在等待天时地利人和的机会,首先树立威信制定并遵守严格的游戏规则,然后在故意连败四场之后用骄傲麻痹了敌人并亮出底牌,带动将领同仇敌忾反败为胜。将力气用在了刀刃上,让人相信天助自助者。可以说陆逊拼的是战略战术,游刃有余中带领大家找回了自信和士气,他十分清楚事情的底线。而刘备更多的则是骄傲大意与独断。
自古江东多才俊。孙权的人才阶梯培养得不错!
– 将帅就是队伍里的产品经理
如果搞不清状况又不采纳忠言,就只能带领团队走弯路了。
– 再完美的系统也会致命的弱点
十分怀疑诸葛亮是猫头鹰性格的,十分严谨,运筹帷幄
– 东吴使者诸葛瑾与兄弟重逢也停有意思
原来古代也会有避嫌做法,但不会像某公司A类B类敏感人群那么敏感。
– 阿斗果然扶不起,爹地都病危了居然还想着你的蛐蛐。
相对曹操孙坚,我只能说刘备输在了起跑线上!

smzz comes back

我回来啦!

距离上次写博客有半年之余,最近一直作为旁观者猎取别人的博客,发现写博客真是一件利人利己的事情,尤其是在微博盛行又低迷的今天:
– 不断思考,并提炼自己的思想
– 培养一个好习惯
– 锻炼表达能力
– 不断学习,并与人分享

当然,之前长时间不写也是有顾虑的:
– 对别人有没有用
– 别人怎么看
– 观点是不是够犀利,技术是不是够新颖
– 没有时间
尤其是最后一点,很容易成为做很多很多事情的重要理由。

临渊羡鱼,不如退而结网。不管怎样,这是一个开始。

一个ssh登录多个服务器的脚本

看到老刘每登录一个服务器,都得在~/bin目录下搞一个命令,很是不方便。分享一下我之前从网上收藏的一个交互式登录脚本,略有改进。它有如下特性:

– 支持自定义协议版本、端口、用户名
– 如果版本是2,则用ssh2进行登录
– 支持登录newsmth的bbs

详细如下:

#! /bin/bash

declare -A HOSTS

# 格式 HOST:USER:协议版本:PORT
HOSTS[mydev-110]=”:10.0.1.110″
HOSTS[mydev-39]=”:10.0.1.39″
HOSTS[DevNet-220]=”user_01:10.6.207.220:2:36000″
HOSTS[DevNet-220strongzhou]=”strongzhou:10.6.207.220:2:36000″
HOSTS[DevNet-32]=”user_02:10.6.222.32:2:36000″
HOSTS[smzz]=”:smzz.org:”
HOSTS[newsmth]=’newsmth’

PS3=”host to connect> ”

#select i in “${!HOSTS[@]}”
#do
# ssh $USER@${HOSTS[$i]}
# break;
#done

select i in “${!HOSTS[@]}”
do
LINE=${HOSTS[$i]}
HOST=`echo “$LINE”|awk -F: ‘{print $2}’`
USER=`echo “$LINE”|awk -F: ‘{print $1}’`
VERSION=`echo “$LINE”|awk -F: ‘{print $3}’`
PORT=`echo “$LINE”|awk -F: ‘{print $4}’`

CMD=”ssh”
if [ “$VERSION” = “2” ] ; then
CMD=”ssh2″
fi

if [ “$PORT” != “” ] ; then
CMD=”${CMD} -p $PORT”
fi

if [ “$USER” != “” ]; then
CMD=”${CMD} $USER@”
else
CMD=”$CMD ”
fi

CMD=”${CMD}$HOST”
if [ “$i” = “newsmth” ] ; then
CMD=’luit -encoding gbk ssh -1 xxx@newsmth.net’
fi

echo $CMD
$CMD
break;
done

可以放在你的bin目录下,比如命名为s,效果如下:

$ s
1) DevNet-220		 4) DevNet-32		  7) mydev-39
2) smzz			 5) newsmth
3) mydev-110		 6) DevNet-220strongzhou
host to connect> 

pptp的vpn客户端拨通后可以ping通无法打开网页

在Linux配置好pptp的vpn客户端后,可以成功连上

$ sudo pptpsetup –create comsenz –server $VPN_IP –username $VPN_USER –password “$VPN_PASSWD” –encrypt –start
Password:
Using interface ppp0
Connect: ppp0 <--> /dev/pts/3
CHAP authentication succeeded
MPPE 128-bit stateless compression enabled
Cannot determine ethernet address for proxy ARP
local IP address 10.0.0.70
remote IP address 10.0.0.252

手动添加路由

route add -net 10.0.1.0/24 gw $VPN_GW

发现可以ping通目标主机,却无法正常访问其web、ssh服务,google了一下发现可能是MTU值设置不当导致的。pptp客户端可以在 /etc/ppp/options 里进行设置,于是将初试的MTU由1496反复调整至396后才正常。

$ ifconfig ppp0 | grep mtu
ppp0: flags=4305 mtu 396


vpn客户端控制脚本

$ cat /etc/rc.d/rc.dzvpn
#!/bin/sh
#
# /etc/rc.d/rc.dzvpn
#
# Start/stop/restart Comsenz VPN(PPTP)
#

VPN_IP=YOUR IP
VPN_USER=YOUR USER
VPN_PASSWD=YOUR PASSWD
VPN_GW=YOUR GW # todo

dzvpn_start() {
pptpsetup –create comsenz –server $VPN_IP –username $VPN_USER –password “$VPN_PASSWD” –encrypt –start
route add -net 10.0.1.0/24 gw $VPN_GW
}

dzvpn_stop() {
killall pppd
}

dzvpn_restart() {
dzvpn_stop
sleep 1
dzvpn_start
}

case “$1” in
‘start’)
dzvpn_start
;;
‘stop’)
dzvpn_stop
;;
‘restart’)
dzvpn_restart
;;
*)
echo “usage $0 start|stop|restart”
esac

参考
Linux 通过 pptp 连接 VPN 网络
搭建ppp之类的服务器,千万不能忽略mtu值的设定
单网卡 Ubuntu 服务器打造 PPTP Server

在同一个mysqld上运行多个端口

服务器的3306端口上已经运行了一个mysql服务,配置文件位于默认的/etc/my.cnf下,现在需要再开一个端口运行mysql服务,希望能重用当前mysql的配置(修改某项共用配置时只需要修改一处即可)。

网上有一篇通过mysqld_multi在同一个mysql下运行多个示例的文章,它是在配置文件的[mysqld_multi]里指定程序路径,[mysqld1]、[mysql2]里分别指定相应的配置。但我还是想直接通过mysqld_safe方式启动,不想在公共配置里指定每一个datadir目录。经过一番摸索,可以这样做:

0. 当前默认端口3306的配置和启动方式:

/etc/my.ini中的配置:

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock

通过如下方式启动

cd /usr/local/stow/mysql-5.0.51a-linux-i686-icc-glibc23
./bin/mysqld_safe 

1. 配置3307端口mysql

1.1 创建数据库

cd /usr/local/stow/mysql-5.0.51a-linux-i686-icc-glibc23
./scripts/mysql_install_db --datadir=/home/zhouguoqiang/tmp/mysql_3307/data

不必理会其中的warning、ERROR信息。此外,如果没有特殊说明,下文均是在当前目录下操作。

1.2 指定3307专有的配置

编辑文件/home/zhouguoqiang/tmp/mysql_3307/my.cnf,添加如下内容:

[mysqld]
port		= 3307
socket		= /tmp/mysql_3307.sock
datadir		= /home/zhouguoqiang/tmp/mysql_3307/data
innodb_data_home_dir = /home/zhouguoqiang/tmp/mysql_3307/data
innodb_log_group_home_dir = /home/zhouguoqiang/tmp/mysql_3307/data

注意,如果使用了innodb类型的数据库或者/etc/my.cnf里指定了innodb目录相关的参数,这里一定要重新指定成适当位置,否则将会共用3306中的innodb_data_home_dir和innodb_log_group_home_dir,进而导致3307端口的mysql启动失败(没有权限或者文件被锁)。

1.3 启动3307端口的数据库

./bin/mysqld_safe --defaults-extra-file=/home/zhouguoqiang/tmp/mysql_3307/my.cnf

需要注意的是,还有一个参数–defaults-file,二者是有区别的:

–defaults-file
加载指定的配置文件,将会完全覆盖/etc/my.cnf中的配置
–default-extra-file
加载配置文件中指定的项,不会完全覆盖/etc/my.cnf中的配置。如果同时在/etc/my.cnf中配置过,将会优先使用指定配置文件里的。

1.4 访问3307端口的数据库

由于默认是3306端口,因此需要指定端口号

mysql -uroot -P 3307 -h 127.0.0.1

必须指定-h,而且不能使用localhost

1.5 停止3307端口的数据库

 mysqladmin  -uroot -S /tmp/mysql_3307.sock shutdown 

参考资料:

  • http://hi.baidu.com/baoobaoo/blog/item/3bd94f2a9432dc3c5343c199.html
  • http://dev.mysql.com/doc/refman/5.1/en/option-files.html