Shell's Home

openvpn auth with google authentication

Jan 24, 2014 - 2 minute read - Comments

client config # base config client dev tun proto udp remote 192.168.1.122 1194 nobind user nobody group nogroup persist-key persist-tun mute-replay-warnings comp-lzo # authentication config ca ca.crt cert shell.crt key shell.key ns-cert-type server tls-auth ta.key 1 auth-user-pass Group should be nogroup, not nobody in debian. auth-user-pass is needed for google auth. pam config account [success=2 new_authtok_reqd=done default=ignore] pam_unix.so account [success=1 new_authtok_reqd=done default=ignore] pam_winbind.so account requisite pam_deny.so account required pam_permit.so auth required pam_google_authenticator.so In /etc/pam.d/openvpn.

lxc和virtualbox和物理机的简单性能测试和对比

Jan 23, 2014 - 7 minute read - Comments

说明 测试各种虚拟化系统下的虚拟机性能。 测试使用sysbench。 CPU采用如下指令测试。 sysbench --test=cpu --num-threads=2 --cpu-max-prime=50000 run 文件IO采用如下指令测试。 sysbench --test=fileio --file-total-size=10G prepare sysbench --test=fileio --file-total-size=10G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run 内存采用如下指令测试。 sysbench --test=memory --num-threads=2 --memory-access-mode=seq run sysbench --test=memory --num-threads=2 --memory-access-mode=rnd run 线程采用如下指令。 sysbench --test=threads --num-threads=2 run sysbench --test=mutex --num-threads=2 --mutex-locks=1000000 run 裸硬盘测试采用如下指令。 hdparm -tT <dev> 物理机上有三个文件系统,ext4/xfs/btrfs,前两者仅做fileio测试以对比性能。 另外做两个特殊文件系统对比,aufs带复制和aufs无复制。前者在只读层上准备好测试文件,而后进行随机读写测试。其中就附带了文件复制开销。后者在aufs建立后初始化测试文件,因此消除了文件复制开销。 所有测试都是测试数次,取最高者(因为低者可能受到各种干扰)。一般是2-3次。 物理机是一台DELL Intel 64位桌面系统,支持硬件虚拟化,有4G内存。系统采用debian jessie,测试于2014年1月17日-20日执行,内核3.12.6-2 (2013-12-29) x86_64。 虚拟机lxc是使用lxc切分的一台虚拟机,没有做资源限制。 虚拟机vbox是使用virtualbox切分的一台虚拟机,分配了所有CPU,打开了硬件虚拟化,分配了1G内存。 文件系统 ext4 Operations performed: 21311 Read, 14207 Write, 45440 Other = 80958 Total Read 332.98Mb Written 221.98Mb Total transferred 554.97Mb (1.8499Mb/sec) 118.39 Requests/sec executed Test execution summary: total time: 300.0044s total number of events: 35518 total time taken by event execution: 168.4761 per-request statistics: min: 0.00ms avg: 4.74ms max: 118.67ms approx.

在PAM中使用google authentication

Jan 22, 2014 - 1 minute read - Comments

PAM是linux系统身份验证的核心,在用户登录/ssh身份校验中均有很大用途。但是很少有人想到,其实这个东西还可以用google authentication来进行身份校验。 安装 sudo apt-get install libpam-google-authenticator 设定 使用前,需要对用户做一个用户级配置,生成配置文件。这个文件就是这个用户的身份验证凭证。配置请使用用户执行google-authenticator。 上来先会问你是否使用基于时间的验证,肯定选是。但是注意,基于时间的验证要求服务器时间必须精确。更准确的说,是服务器时间和手机时间校准在30秒以内。由于手机一般都采用GSM校时,因此只需要在意服务器时间。建议是使用ntpdate来校准时间。特别注意,linux的时钟是会漂移的,必须按天级校准。 然后程序会给出一个url,还可能有QR码(真够不容易的,Console级别的QR码。。。)。记住,一定要用url去获得QR码给程序扫描。因为url获得的QR码算法是最新的,而直接生成的有可能不能跑。 下面是secret key和verification code,一般来说这两个不用关心。但是你需要记住emergency scratch codes。libpam-google-authenticator默认给你生成了5个,一般都够用了。通常用到3个就更新一遍吧。 是否生成配置,选是。 是否拒绝使用同一个token的人登录。如果选是,30秒内只能登录一个人。建议选是。 是否放送时间验证,从1分30秒到4分钟。如果选是,允许更大的服务器时间偏差。看你服务器时间是不是够准。 是否防止暴力破解,30秒内尝试不超过3次。建议选是。 OK,你的配置就完成了。如果有多个用户,请多次配置。 手机app 按照系统安装以下app,下面以android版为例介绍。 Google Authenticator Android Google Authenticator iOS Authenticator for Windows Phone Blackbarry 选择setup account,然后scan a barcode。程序会要求你使用barcode扫描软件扫描(推荐barcode scanner)。这时去扫描设定一节中访问url显示的那个qr码。 pam配置 对于ssh而言,请在/etc/pam.d/sshd的最后一行增加这句。 auth required pam_google_authenticator.so 注意,这样其实是密码/校验码双重验证。如果你不需要密码请注释掉下面这句。 @include common-auth 或者其他包含以下这句的地方。 auth required pam_permit.so 如果你希望增强sudo安全性,也可以把这句加入/etc/pam.d/sudo后面。如果同样不需要密码,请注释上面那句。 sshd配置 保证/etc/ssh/sshd_config里面,以下参数都处于正确的配置。 ChallengeResponseAuthentication yes PasswordAuthentication no UsePAM yes 如果你使用openssh6.2以上版本,请额外加入这句以开启publickey和验证同时启用。 AuthenticationMethods publickey,keyboard-interactive sudo 注意,如果是NOPASSWORD,则没有校验。 参考和鸣谢 Why enable SSH Two-Factor Authentication on your server?

golang和nginx的简单性能对比

Jan 15, 2014 - 2 minute read - Comments

说明 测试都是ab做的,中等并发量,统一采用10000并发,100000个请求。都是本机请求本机,避免公司内网IDS的干扰。 机器是一台双核CPU的DELL:Intel® Pentium® CPU G2030 @ 3.00GHz。配4G内存。 第一组数据是ab测试nginx,nginx的配置如下: worker_processes 4; pid /run/nginx.pid; worker_rlimit_nofile 30000; events { worker_connections 20000; multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; ... } 第二组是ab测试golang,返回固定是个OK。 第三组是ab测试golang,返回某个目录或文件。 err := http.ListenAndServe(":8080", http.FileServer(http.Dir("/home/shell/photo"))) nginx Concurrency Level: 10000 Time taken for tests: 5.720 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 172100000 bytes HTML transferred: 160000000 bytes Requests per second: 17482.47 [#/sec]

lxc简单介绍

Jan 2, 2014 - 1 minute read - Comments

基本安装 安装lxc包。 注意修改/bin/sh,链接到/bin/bash。lxc在某些版本上有一个bug,声明为/bin/sh却使用bash语法,导致不如此链接会出现错误。 lxc on debian wiki 镜像和设定 使用lxc-create -n name -t template生成镜像。 在/usr/share/lxc/templates可以看到可用的模板。 在/var/cache/lxc/debian会缓存生成过程的临时文件。 生成的镜像需要在镜像内安装lxc,否则无法使用lxc-execute。 资源限制 在config文件内,写入cgroup限定规则。注意,使用内存限定的话,需要在内核参数中加入cgroup_enable=memory。 在debian下,可以修改/etc/default/grub文件,使用update-grub重新生成规则。 GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory quiet" 在config文件中可以如下限定。 lxc.cgroup.memory.limit_in_bytes = 512M # 限定内存 lxc.cgroup.cpuset.cpus = 0 # 限定可以使用的核 lxc.cgroup.blkio.throttle.read_bps_device = 8:0 100 # 读取速率限定 lxc.cgroup.blkio.throttle.write_bps_device = 8:0 100 # 写入速率限定 lxc.cgroup.blkio.throttle.read_iops_device = 8:0 100 # 读取频率限定 lxc.cgroup.blkio.throttle.write_iops_device = 8:0 100 # 写入频率限定 cgroups blkio-controller cpusets memory 执行 lxc-start -n name /bin/echo hello 还可以用以下指令,在已经启动的container里执行进程。 lxc-attach -n name

一个神奇的故事——为什么程序能够工作

Dec 30, 2013 - 1 minute read - Comments

故事的原因 今天被一个妹子问到一个专业问题。每天看你们在写程序,为什么你们写一些东西,就会出现很多神奇的功能。 好吧,这是很多“外行”很难理解的问题。大多数职业非职业程序员,只要写过一点程序,就不会对这种事情表示惊奇。然而问题是,很多人并没有深刻的认识到,这个问题其实非常难解答,可以算是计算机本质性问题之一。 我当时的解答有点奇怪和玄幻色彩。我打了个比方,例如你有个萝卜头,你扇它一下,它会往前蹦一下。你又有个电灯,按一下开关就亮,按一下开关就灭。那么你把两者组装起来,在旁边立个牌子,扇一下萝卜头灯就亮,再扇一下就灭。事情看起来就很神奇了。至于萝卜头为什么会这么做,这个事情我并不了解。 实际上,这个回答很让人莫名其妙。什么萝卜头和奇怪的世界观阿,这不是在讲程序吧。好吧,我把整个故事讲的稍微完整一点。作为对所有有这个问题的人的解答。 原型 在讲整个故事前,让我们稍微的放开一点想象力。例如我们有一个老鼠,一盒一碰就会掉下奶酪的奶酪盒,一个转笼(就是老鼠经常在里面跑的那种),一个小的皮带环,一个风扇,一个导轨,就是扔个铁球,就能沿着导轨滚动的那种。 我们把转笼和风扇用皮带环连接起来,然后里面放上白老鼠,上面放上奶酪盒,旁边放一个导轨,然后用黑盒子罩住,旁边放一张纸。这是一个神奇的设备,当你向里面投入一块钱,就会有风吹出来。因为钱沿着导轨滚下来,会碰到奶酪盒。老鼠就会开始跑,带动风扇吹出风来。 好像很神奇的样子哎,投币式风扇。 哎哎等等,你弄了那么复杂的一堆东西,就是为了吹风扇?那为什么不用电风扇呢? 其实我们的老鼠盒子和电风扇具有一样的结构。老鼠是动力源,奶酪盒是开关,皮带环是传动系统,风扇负责执行。我们只要正确的将每个具备功能的部件组合起来,就可以产生奇妙的效果。至于每个部件为什么能达到他自己的功能,这个我们并不关心。设计部件的人会为我们做出合适的实现。 同样的组合,如果是电扇,我想大部分人都不会表示不理解。然而如果换成老鼠盒子,大家就会觉得很神奇,如果换成程序,就会觉得更神奇了。 其实程序和老鼠盒子非常类似。程序的每个部件都有自己独特的功能,我们只要负责将这些部件以合适的逻辑连接起来,就可以完成新的功能。当然,如何连接部件是一个非常有技术含量的问题,需要专门的培训。 然而,程序比老鼠盒子更加复杂,更加让人觉得神秘莫测的地方是。程序经常出现一些我们听不懂的东西。同样用老鼠盒子做比方,请想象一下以下事件: 不可往复 这个系统还没上线,就被产品经理吐槽了一把。这个系统的第一个问题,就是能开不能关。一旦老鼠开始跑,直到没有力气之前系统是不会停的,无论人在不在。为了修正这点,我们再弄了一个传送带,用皮带环和转笼连接。当老鼠跑上一分钟后,传送带就会把奶酪传送到老鼠面前,老鼠就会吃掉奶酪,从而停止奔跑。 白老鼠的不稳定性 系统终于上线了,不过有奇怪的问题。系统不知道为什么,有的时候工作有的时候不工作。 经过工程师的检测,这主要是老鼠会吃饱。一旦老鼠吃饱了,奶酪就失去了吸引力。因此每隔三四块奶酪就会停止工作。不过老鼠饿的很快。所以十分钟后又恢复了工作。所以表现就是不稳定。 工程师为了紧急修复这个问题,让每次掉出来的奶酪减小到了很小的尺度,大约是原来的三分之一。这样就算十分钟连续工作,也不会吃饱。 老鼠盒子的黑客事件 没多久,这个盒子碰到了黑客。有个人掀开盒子看了一眼,发现导轨只辨识撞击,不辨识是否是货币。因此出现了大量铁球替代硬币的事情,扔个铁球就开始吹风。市场部表示工程师需要紧急解决这个问题。 工程师巧妙的将轨道绕了几个弯,并减小了弯上的轨道宽度。如果投入物是硬币,那么他的重量和形状就会使得他正确的通过弯。而铁球或轻或重会从导轨上掉下去。从而解决了这个问题。 并发请求 很快,系统又遇到了一个问题。有人一次性的投入了两个硬币,因此击中了奶酪盒两次。老鼠只跑了一分钟就吃了两块奶酪。因此这个人又重复的连续投了多次货币。这导致老鼠吃饱了,因此盒子不工作了。客户大发雷霆,打电话到售后骂人,老板很生气。 工程师发现这是因为奶酪被连续放置的缘故。于是他们设计了一个连杆。当老鼠开始工作的时候,就会启动连杆,关闭投币口。这样就不会引起老鼠连续吃东西了。而老鼠停下的时候,连杆就会打开。就可以继续投币。 老鼠饿死了 经过了一个圣诞节,大家都不去玩老鼠盒子,老鼠饿死了,老板把运营骂了一顿。 运营乖乖去换了一只老鼠,并让工程师在盒子里装了一个摄像系统,可以让他们看到老鼠是否存在。 现状 现在我们有一个神奇的盒子,投币就可以吹风。这个盒子是由一个带着摄像系统的黑色外壳,一个盘旋的及其复杂的导轨,一个奶酪盒子,一个传送带,一个连杆,两组皮带环,一个转笼,一只老鼠,一个风扇组成。为什么会这样?一个妹子问。。。

KK行——第四日

Dec 3, 2013 - 1 minute read - Comments

第四天也是自由行动,总算能玩到一些好玩的了。 鉴于有些人已经去过加亚岛了,所以我们去的是另一个岛。上去后发现这里居然有降落伞,而且可以两人乘坐。上次去普吉岛的时候被鄙视太重,这次总拖的起来吧? 在海上坐降落伞其实是个非常不错的体验,你可以明显感到风的流动,并且看到海水从碧蓝到碧绿的变化。如果不会超重的话(不许笑),我下次打算体验一下热气球。 船老大还提供下水和不下水的选项。如果你有兴趣,他们会开的慢一点,让降落伞在水面擦过。然后就可以半截身子浸在水里。道哥和他老婆享受了一把这个待遇。整个水全溅起来,满头满脸。我当时没带泳裤,所以干脆的放弃了,还是在天上看看就好了。。。 降落伞的宣传价是100RM,但是讲一下价就到70RM左右了。剩下能谈到多少就看个人功力了。我们近20个人,拿到了65RM的价格。 回到岛上,换一批人出去被吊起来,剩下的人就去堆沙子和浮浅。实话说,KK作为浮浅来说比puhket和maldive差很多。鱼都是比较小的种类,而且密度比较稀疏。当然,珊瑚礁比puhket漂亮的多,而能见度也比maldive好。但是我没带泳装,而且背已经严重的晒伤了。所以还是没有下水。 当晚我们在酒店附属的酒吧里面呆到很晚,和台上的一帮国际友人唱歌玩,最后还送了人家两个牛小七。 最后是关于机场的重点。马来西亚禁止贝壳和珊瑚出口,所以如果被发现带贝壳或者珊瑚走的话,抱歉,重罚加没收。所以要带贝壳珊瑚什么的就别想了。至于海星之类的活物更没指望。原则上贝壳工艺品并不受限,但是必须在购买时索要凭证证明你是购买的,否则也不能放行。 而且他们的安检很奇怪。第一道口在办理登机的counter那里。国内出去的时候,我们只称托运重量。马来是称量所有物品,包括随身的。而春秋的额度又特别低,只有15。所以我们一帮人就紧急分配重量,谨防超标。我把公司的东西交给别人带,自己带自己东西。最后我上去的时候,能穿的都穿了,在热带穿的像只北极熊一样,还偷背着一只相机包。最后一称,16公斤。理论上一公斤45RM,合95RMB。不过还不错,没找我要。 第二道安检在过海关前,第三道在海关那里,不安检,只办理手续。在办理手续的时候,居然碰到了第一天来的时候碰到的两个妹子。和她们聊了一下。结果他们发现我们是公司出钱全包到这里来玩的时候,当场就称呼我们为土豪公司。后来我们的人就直接被叫做“土豪的同事”了。 下面就是他们安检比较奇怪的地方了。在候机厅进入另一个候机厅的时候,居然又安检一次。这次才夸张,水都不让带,必须喝光,要么留下。春秋又是不供水的。这个机场的政策让人怀疑春秋是不是买通他们了。还有这次贝壳在机场免税店里面购买了一个大贝壳(好像有点绕),结果在最后一道安检的时候被拦下。保安问我要购物凭证,我说没有,我就在你们机场里面买的。他先说不行。我说你可以打开看看。然后他打开一看——贴着一个标。当时后面有个人说这个标是我们机场的,我就被放行了。所以为了省麻烦,要买工艺品还是索要凭证的好。不过后面两个买了同样贝壳的人连开包都不用,估计是因为保安已经在我这里看到贝壳的形状了,所以后面的就没检。 后来我们讨论,安检这么严一定有什么事。前面两个妹子就说有两个游客在仙本那出事了,被人杀了。然后我就有点小庆幸,我们的运气还是不错的。

KK行——第二三日

Dec 2, 2013 - 1 minute read - Comments

第二天的行程是美人鱼岛,基本就是跟团运动。跑到美人鱼岛,浮浅一次,吃午饭,浮浅第二次,回去。 比较无语的是,第一次出发的时候,跑到海里才发现少了两个妹子。回去一看这俩换衣服比较慢,硬生生没赶上第一次浮浅。第二次我好歹跟着,结果一个不靠谱的给我们指到另一个船上去了。我们三个带着N贵的水下相机,只有三个人在那里浮浅。。。 所以团队出门注意随时数人,个人注意紧跟领队。否则后果很严重。 需要特别注明的是(虽然第二次说这个了),这里的深潜,需要提前预约,和泰国不一样。 第三天的行程是看长鼻猴和萤火虫,实话说很一般。因为长鼻猴距离比较远,拿着望远镜也看不清楚。这毕竟是野外,不是动物园,不能追求最好的展示效果。而萤火虫——去,初中的时候门口一大片的全是萤火虫,见太多就没感觉了。 第三天晚上我发现一个严重的问题——我的令吉严重的过多了。这次我为深潜保留了300-500RM。结果两次都没深潜成。现在这笔钱带不回去只能花掉。而且团里很多人都有类似的问题(虽然不完全是因为深潜)。所以,当晚某大陆游客团的疯狂购物传奇就开始了。 当晚我买了一堆榴莲酥(记得,生鲜水果不得上飞机),数盒红茶巧克力,还有几包咖啡。实际吃下来,榴莲酥和咖啡广受欢迎,严重不足。红茶巧克力反响一般。榴莲味咖啡则是被我当猎奇产品送了出去。好吧,幸好原来也是买着玩的。 要去的朋友可以多入榴莲酥。凯诚附近有家榴莲王,里面打工的妹子很不错。老板祖上是福建过去的,一口台湾腔。可以先试试他们的油炸冰冻榴莲,再买点新鲜的榴莲酥回来。 另外我又跑去做了个泰式按摩。按摩的妹子英文很奇怪,仔细一问原来是从泰国来打工的。我的右手大拇指原来有点摔伤,痛了很久了没法动。她拿精油推了一会,居然基本没事了。我顿时感到很惊奇,就问老板推拿的精油有没有在卖。老板说不好意思他们都是自用的,不卖的。很可惜。

KK行——第一日

Dec 1, 2013 - 1 minute read - Comments

第一天的行程很郁闷。我们0点降落在KK,然后就被导游拉着上了bus,结果我没买到电话卡——这注定了后面的悲剧。 晚上到酒店,不想那么早就睡觉,就一帮人跑出去吃东西。我想要办手机卡,所以就往酒店后面走。碰到两个和我们一飞机过来的妹子要取钱,就一起过去。取完钱我们找了半天,所有人都说在7-11那里办电话卡,可是那里就是没有。 出发前我联系过潜店,得知他们的潜水都是早上8点半出门的。所以我7点半起床,去叫道哥和王伟伟。结果他们通通起不来。我只好叫上徐立去吃早饭,吃完去碰碰运气。 到了潜店那里,他们说,不好意思,你需要昨晚预约。问了数家都是这样。由于我们到的第一天是全自由行动,而且只有一天的全自由行动,所以没办法,这次没法去潜水了。 然后我们就一路逛回了酒店。在大厅里面发现韩大哥一行正要去博物馆,就跟着去了。 实话说,博物馆没啥好玩的。更那啥的是出博物馆的时候又下雨了,我们被困在博物馆动弹不得。好容易叫了三辆出租,还是分别叫的。其中一个司机还不会讲华语,又不认得地方。等到了jalan gaya,一群人分成了三份在暴雨里面凑不起来。最后只凑了两拨人,各自吃饭找地方玩。 中午吃的是其中某一家的肉骨茶,味道,一般般啦。当地并没有什么让人眼前一亮的美食,大多都是水平以上好吃一点和水平以下凑合一点的区别。唯一在国内吃不大到的只有海鲜而已。 下午在某商场的地下餐厅街吃的下午茶。我吃了半只烤鸡和鸡肉肠。这里的黑胡椒烤鸡味道不错,有兴趣的可以试试。 晚餐就是吃的海鲜。我们没点贵的要死的大龙虾,所以只有72令吉一个人。合国内大概150人民币的样子。以吃的东西而言,基本和上海持平吧。不过东西肯定要新鲜一些。

KK行——第零日

Nov 27, 2013 - 1 minute read - Comments

刚刚来七牛没几天,就被告知一件好事。公司组织去沙巴和普吉旅游,可带家属。想想普吉已经去过了,这次选了沙巴。当然,傻喵为了去西藏已经请过假了,这次就没有同行。 沙巴位于菲律宾南面,文莱旁边。从中国地图上看,中国南海牛舌线最下面就是。沙巴是世界知名的潜水圣地。当然,这次我们没有去最佳潜水场所——仙本娜,而是去的首府Kota Kinabalu,Kinabalu是附近知名的神山,KK的意思就是神山之城,中文叫做亞庇。没鱼虾也好,KK对面好歹有个东姑阿都拉曼公园(Tunku Abdul Rahman National Park),潜水也不错。不过有意思的是,理论上说这个公园坐落在南中国海。。。 去大马首先要换钱。令吉和人民币的比值大约在2左右,2元人民币合1令吉。令吉不在中国银行的服务范围之内,所以我们从货币兑换点换了一把令吉回来。据兑换点的服务人员说,我们提空了他们能约到的所有令吉。 种族宗教 KK当地伊斯兰教盛行,随处可见包着头巾的妇女和清真寺高耸的圆顶。当地饮食也是偏清真的,大部分地方只提供鸡肉和牛肉,偶尔能看到羊肉。 当地各种人群混杂,能明显看出区别。我碰到了很多华裔。据他们自己说,他们都是祖上三五代从大陆过来的。按时间算下来,差不多就是民国的样子。有很多当地族群,皮肤偏黑,一看就不像是中国人,却能说一口流利的中文。我曾经问过一个华裔,他说当地推行华语教育,有很多学校坚持华语教学——不限中国人。还有一些皮肤偏白,碧眼,我实在想不出解释,只能猜想是前殖民者后裔。 语言沟通 KK当地有几家手机公司,我办的是calcom的卡。17令吉一张,合35人民币左右的样子。里面有15令吉的费用,基本足够4天的所有短信和电话。如果在当地收发短信多的话,可以考虑入一张,比漫游便宜。道哥收发短信和电话不多,查下来是25人民币,办卡就亏了。 KK当地通行马来语和英语,但是华语也是非常盛行。基本上讲英语就完全能和当地人沟通。经常让人想吐血的是,你和当地人说着说这英语,他和你讲,OK,没问题。然后你发现——他会说华语。只是你和他讲英文,他就和你讲英文。而且这种现象不限于长的像华人的。。。 衣食住行 KK的饮食比较清真化,所以大部分都是鸡肉餐。去了几天,我们吃的最多的就是麦当劳和海滩BBQ。号称海滩BBQ,但是实际上并不算很好吃,也根本不是BBQ。主要食物是炒面,米饭和咖哩。唯一和烧烤有关的只有烤鸡翅。我们自己出去吃则经常去双天海鲜楼去吃海鲜大餐,里面的椰子布丁味道不错。卖椰子布丁的美女也很不错,我们中的某人很感兴趣。 吃东西当地司机和我们推荐加亚街。我们也就去吃了一顿肉骨茶。味道还不错,我带了一包药材回来烧着玩玩。 KK的出租并不好打,所以出门基本靠腿。幸好KK也不大,纵穿整个KK也不过半个小时不到的样子。只是KK作为前英国殖民地,这里的车辆行驶方向和大陆相反。因此经常担心车辆从意想不到的方向冲出来。 潜水 沙巴是潜水的好地方,但是要潜水的人需要注意。请务必在潜水的头一天电话预约。而且最后一天不要潜水(坐飞机前18小时不得潜水)。因此,推荐的行程是第一天看萤火虫(萤火虫是晚上看的,所以可以睡到中午,不受第一天到达劳累的影响),第二天去美人鱼岛,第三天去潜水。 即使要跟随去美人鱼岛的团队潜水,也请务必提前预约。这次上了岛我才知道,深潜是需要预约的。中计了,普吉岛那次完全不需要预约。