Monthly Archives: April 2013

【翻訳】技术的杂谈—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…

【挂傻逼】一直在犯2,从未有提升

这几天傻逼的事情真的没少做。

首先,3月31日转移CDN数据的时候,那台机器上还有个FTP要配置。FTP嘛,想着yum install vsftpd之后chroot锁一下,基本就ok了。结果一开始ftp根本就连不上,好,iptables关掉先。然后报530,找了半天发现我很傻逼地把ftp的用户写进了/etc/vsftpd/user_list。这个修了之后又发现chroot没锁住,最后总算找到了是chroot_local_user=YES的问题。完整配置如下:

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=NO
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
pasv_min_port=30001 pasv_max_port=31000

那天半夜本来写完中二满满的错误页面就关机睡觉的,因为在终端,就直接敲sudo shutdown -h now了,结果没出现让我输入sudo密码而是直接提示系统准备关机,心里就咯噔了–ssh还没登出呢!还好本来就是维护状态,没什么太大损失,找另外一台前端机器重写错误页面就完事了。不过这直接给我造成了再也不敢用命令行关机的阴影。

然后4月1日各种被电信坑。迁移机房前端后端各种改IP,最关键是TMD前端的机器和后端的不能互通,表现为前端机ping后端机器,抓包显示后端机器发出ICMP echo但是前端收不到回显。后来查明是电信的问题(大概是路由策略?)。这还没完,之后继续各种犯2,比如改了error_log但是log就是不显示,连文件都没创建。再一看我修改的文件根本没被ln -ssites-enabled。再比如xxx不能访问,这种事情就绝壁是iptables姿势不对了。以前记得改过的规则ssh上去一看不知道为什么就变了,于是又必须重新来。最后主站好不容易跑起来,dns指向还不对,于是某些ip访问我们主站就会得到大姨妈页面。监控宝持续报错(忘记改ip)。mysql主从同步binlog报错#$!@$#^%#^$%^(同步到xx表的时候就#$@$$)…

主服挂的时候流量全跑匿名版,于是现在匿名版流量也快爆了,过几天要是上不去的话千万别惊讶=.=

最坑爹的是!昨天下班之后和主程闲聊说我们后端不应该能ping通,于是我想某些后端服上有iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited,就给主服加上了,结果大家都知道了…后来一想明明就是一个-p ICMP的问题,我干嘛脑抽去reject所有INPUT啊,简直就是作得一手好死(。联系机房前后花了一个多小时才搞定,以后动iptables先扔虚拟机的arch测完了再扔上去比较保险。

说到底上面尽是一些低级错误,我都怀疑自己是否真的适合搞运维了。不过原来运维说就算我转行写程序,爆个漏洞几万就没了,心里也就释然了。(哪里应该释然了啊混蛋!!!)

果然我这种半吊子 #实习生 就是拖垮工作效率……

唉我到现在都只能望着基米神喵pt等巨巨们的背影前进,简直弱爆了…