Tag Archives: ssh

【多图慎入】iOS上的部分ssh客户端的演示

这篇坑了一个多月吧。主要是iOS上的ssh客户端多又贵,又不知道好不好用。于是我先去前面探(cai)个(ge)路(keng)。
本来想写个正儿八经的评测,结果快写完的时候看了下根本就是多图杀猫型网志所以干脆叫演示好了。

环境

  • 应用(名称[链接],价格,评分,IAP)
    • iSSH,$9.99,★★☆,Mosh支持$0.99
    • Prompt,$7.99,★★★★,无
    • Prompt 2,$9.99,★★★★,无
    • Server Auditor,免费,★★★★☆,Pro版 $0.99/month | $5.99/year
  • 系统
    • iPhone 5 with iOS7.1
    • iPad 4 with iOS 6.1.1 jailbreaked
  • 服务器端
    • Debian Wheezy 7.4 openssh标准配置,除了 PasswordAuthentication 为 no
    • ~/.ssh/authorized_keys 中定义了 command=”/usr/sbin/login_duo -f root”

(撰写本文时用的ssh客户端应用皆为正版,Server Auditor已购买一个月Pro。Reflector为试用版。)
Continue reading

【翻訳】技术的杂谈—ssh的-L、-R端口转发是神马?

原文链接:技術的雑談-sshのportForwadingってなあに?

环境

  • ssh的版本:貌似是3.6.1p2
  • OS:大概啥都可以吧

目的

对ssh端口转发的一点点说明

ssh中可以用以下的选项做端口转发。

ssh -l 用户名 -L port:host:port host
又或
ssh -l 用户名 -R port:host:port host

但是读了man还是啥都不懂……(汗)(译者注:我读了man也不懂…这货真是给man看的?) 于是,就实际试了下。

实验

本文作出如下约定,

  • sshd所在的主机为「server」(以下例子中为host1)
  • 运行ssh的主机为「client」(以下例子中为host2)

-L是什么

L选项在man中说明如下:

Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. This works by allocating a socket to listen to port on the local side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine. Port forwardings can also be specified in the configuration file. Only root can for- ward privileged ports.

【适当翻译一下:】
指定了这个选项后,client的端口会指定host的指定server转发数据。
在本地listen这个port后,对这个端口的访问无论是来自哪里都会被转发到指定的server端口云云。以下省略。

就是这种感觉。简明扼要地说,就是「在client侧开个端口,把所有对这个端口的访问全部转发」。(只是,仅有用户为root才能使用)(译者注:没看懂这个root指哪边的用户。总之我实验的时候两边都没用root也成功了。)

于是实验一下:

host2# ssh -l hoge -L 8880:host1:80 host1

运行以上命令之后、

  • host2运行netstat -a之后,发现localhost:8880处于listen状态
  • host1则没啥变化

再从host2运行

# telnet localhost 8880

实际上就和host1的80端口(也就是host1的web服务器)连接起来了。 「GET / HTTP/1.0」然后按两次回车就能显示host1的默认页(top page)。 又或者,把刚才的-L 8880:host1:80用「-L 1234:www.hoge.com:80」代替,则ssh启动的时候(host2的8880端口)会(通过host1)和www.hoge.com的80发起连接。

(译者注:即host2 ssh到 host1之后,访问host2的8880端口,得到结果是以host1视角访问www.hoge.com的80端口的结果)

-R是什么

刚才的-L是在本地建立传送数据用的端口, -R则是把本地的端口映射过去做数据传送用。

于是再次实验:

host2# ssh -l hoge -R 8880:host1:80 host1

运行以上命令之后、

  • host2侧没啥变化
  • host1运行netstat -a之后,发现localhost:8880处于listen状态

再从host1运行

# telnet localhost 8880

发现host1的8880连着host1的80端口了。
(不对,改自己的web服务器端口有什么好玩的…)
但是,这里同样可以指定外部主机端口。(译者注:只不过这里是以host2视角


后记:

  • 这篇文章年代略久远,考虑用ss、curl代替文中的netstattelnet
  • 以我自己的理解
    • -L(local)就是本机上开个新端口,以服务器端的视角把已存在主机:端口的数据拉回来。
    • -R(remote)则是以自己机器为视角把已存在的主机:端口的数据打个洞扔过去。
    • -L和-R决定了视角,自然就决定了在哪边机器上开洞(端口)。
  • -L、-R选项可以这么拆解:
    • ssh -L 客户端端口:某主机:某端口 服务器用户@服务端地址
    • ssh -R 服务端端口:某主机:某端口 服务器用户@服务端地址
  • 如果是ipv6,可以用”/”代替”:”
  • 应用场景举例:
    • ssh -L3128:127.0.0.1:22 user@example.com
      注意这里127.0.0.1并不是只发起ssh连接的localhost,而是example.com的127.0.0.1,即example.com的localhost。
      然后example.com上个squid,然后你懂的…把socksv5转成http某种程度上还是方便不少。
    • 假如有三台主机,c1、c2、s。其中c1和c2都在nat后面,此时c2向c1求助,希望c1能ssh到他的机器当一次好人。在不改变c1 c2所在路由器的端口映射规则,又有临时机器s做中转的情况下可以这么做:
      c2执行ssh -R23333:127.0.0.1:22 s把自己的22端口贴到s的23333端口。
      c1可以先ssh s登录到example.com,然后ssh c2_username@127.0.0.1 -p23333连接到c2的机器,履行他做好人的义务。
      为啥不能直接ssh c2_username@s -p23333呢?在s上ss -anp | grep 23333就知道了,绑的是127.0.0.1,不是0.0.0.0…

【同期】rsync+inotify+ssh==简单的单向文件同步

本文大部分引用自http://heylinux.com/archives/817.html虽然puppet之类的工具也很好用啦,但是仅仅是单向同步,总有种「まだあいつの出番ではない!w」(还没轮到那家伙出场呢!)的感觉。于是小小研究了下rsync+inotify-tools+ssh的方案,简单易行。在这里,暂时把同步的源头叫src,同步到的目的机器叫dst。本文以centos6为例,debian/ubuntu用户请自行把yum之类的脑补成apt-get之类的~

安装软件包

Linux kernel从2.6开始支持inotify-tools。于是src机器

[root@src ~]# yum install rsync inotify-tools

dst机器

[root@dst ~]# yum install rsync

如果提示没找到软件包,请参考 @boypt pt桑这篇博文

设定同步专用帐号

接下来,为两边机器,即srcdst都设定同步专用帐户

[root@src ~]# useradd -m rsync
[root@src ~]# passwd rsync
[root@dst ~]# useradd -m rsync
[root@dst ~]# passwd rsync

最好在dst上编辑/etc/passwd/etc/group使得两边rsync的uid和gid一致。别忘了改完这两个文件之后之后还要chown -R rsync:rsync /home/rsync

接下来作成src的公开键与秘密键,并把src的公开键扔到dst/home/rsync/.ssh/authorized_keys下面。记得authorized_keys权限600,.ssh目录权限700。
最后在两边机器上把想同步的目录的uid:gid也改成rsync:rsync

撰写同步脚本

[root@src ~]# vim dir.rsync

!/bin/sh
SRC=/path/to/dir/ #最后的\很重要! 
DST=rsync@dst's_ip:/path/to/dir
 
#su - rsync
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
        do
                /usr/bin/rsync -ahqzt --delete $SRC $DST
        done

[root@src ~]# chmod +x !$

部分注释引用原文

相关注解如下:
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e create,move,delete,modify,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件

/usr/bin/rsync -ahqzt –delete $SRC $DST
-a 存档模式
-h 保存硬连接
-q 制止非错误信息
-z 压缩文件数据在传输
-t 维护修改时间
-delete 删除于多余文件

要排除同步某个目录时,为rsync添加–exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。
要排除某个目录的事件监听的处理时,为inotifywait添加–exclude或–excludei参数,具体查看man inotifywait。

inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。

然后按照原文我始终不能成功,于是干脆以root权限运行,虽然有安全问题但是……不管了。

!$为bash中上一条命令的最后的参数。因为Meta键总是因为各种原因按不出来所以(ry (emacs什么的最讨厌了 #口亨

最后把dir.rsync&进后台以及cat进/etc/rc.local就ok了。如果中途感觉文件没同步过去记得检查要同步的目录里面的文件权限和各种其他的权限,以及善用bash -x

简易apn代理搭建

参考 @bao3 的 这个和 这个

准备

  • 国内vps一台(上行要够)
  • 国外vps一台
  • 平台推荐ubuntu12.04/centos6.3/freebsd9。本人以第一个为准

步骤

http代理

  • apt-get install squid privoxy #安装squid和privoxy
    参考配置见下一节
  • 可选,用乱序补丁过的ssh,两边机器都要编译)
        git clone https://github.com/brl/obfuscated-openssh
        apt-get install build-essential zlib1g zlib1g-dev libssl-dev autossh
        cd obfuscated-openssh
        ./configure
        make
        make install
    • 国外vps(server侧)
      • vim /usr/local/etc/sshd_config
      • 加上这些

        Protocol 2
        ObfuscatedPort 4096 #你的自定义端口
        ObfuscateKeyword fdb713 #你的乱序密钥

      • 启动服务
          /usr/local/sbin/sshd
    • 国内vps(client侧)
      • 编辑环境变量 vim /etc/environment
      • 为了让autossh使用乱序补丁的ssh,加上

        AUTOSSH_PATH=”/usr/local/bin/ssh”

      • 在国外vps上专门开个ssh -D用帐号,shell就给/bin/false
        或者/usr/sbin/nologin好了,扔好公钥
      • autossh -M 9001 — 你的用户名@国外vps -fxND4444 -p你的端口 -z -Z 你的乱序密钥
        用 — 是为了隔绝autossh和ssh本身参数。比如
        autossh -M 9001 — fdbssh@192.168.1.1 -fxND4444 -p4096 -z -Z fdb713
      • ps aux | grep ssh
        同时看到ssh和autossh启动就算成功,如果失败加vv看调试信息。
      • 监视autossh脚本请自行发挥…

Continue reading

【メモ】八月豆知识

证书掉chain

  • apache: 证书本体和chain可以分开,所以直接在httpd.conf设置 SSLCertificateChainFile即可。
  • nginx: 证书本体与chain必须合体。根据nginx wiki原话:

    if you have a chain of certificates — by having intermediate certificates between the server certificate and the CA root certificate — they’re not specified separately like you would do for Apache. Instead you’ll need to concatenate all the certificates, starting with the server certificate, and going deeper in the chain running through all the intermediate certificates. This can be done with “cat chain.crt >> mysite.com.crt” on the command line.

  • 又,startssl申请的免费证书的chain通常叫sub.class1.server.ca.pem。如果证书提示不掉chain,twidere即使不勾选强制ssl通信也能读取tweet。

Continue reading