V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
suifengdaren
V2EX  ›  Linux

SSH 隧道与端口转发(v2ex 首发)

  •  1
     
  •   suifengdaren ·
    gitrepo · 2014-08-11 00:16:21 +08:00 · 11613 次点击
    这是一个创建于 3736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SSH隧道与端口转发

    转载让注明出外。

    SSH端口转发(Port Forwarding),是一种隧道技术,流往某端口的数据被加密后传向另一机器,依据转发方式的不同,有多种应用场景。

    1.本地端口转发

    ssh -L localhost:localport:remotehost:remoteport user@ssh-server

    将本地机器上的某个端口转发到远程机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 localport 端口, 一旦这个端口上有了连接, 该连接就经过ssh的安全通道转发出去, 同时ssh服务器和 remotehost的 remoteport 端口建立连接.

    动画图例:
    http://suifengdaren.qiniudn.com/ssh-L.gif

    2.远程端口转发

    ssh -R remotehost:remoteport:host:hostport user@ssh-sever

    将ssh服务器的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, ssh服务器上分配了一个 socket 侦听 remoteport 端口, 一旦这个端口上有了连接, 该连接就经过ssh安全通道转发出去, 同时本地主机和 host 的 hostport 端口建立连接. (此时本地端的host可以是localhost也可以是本地端可以访问的其它主机)

    动画图例:
    http://suifengdaren.qiniudn.com/ssh-R.gif

    3.动态端口转发
    ssh -D localport user@ssh-server
    工作原理是这样的, 本地机器上分配了一个 socket 侦听 localport 端口, 一旦这个端口上有了连接, 该连接就经过ssh安全通道转发出去, ssh服务器根据你本地地器程序访问的远程主机和端口进行转发出去. 目前支持 SOCKS协议, 将充当 SOCKS 服务器.(其实和-L参数原理差不多,只不过-L只能静态指定一个或者多个远程主机和端口,-D参数可以动态处理,不用人为事先指定,一般用来充当廉价vpn)

    动画图例:
    http://suifengdaren.qiniudn.com/ssh-D.gif

    PS:
    ssh一般在做隧道与端口转发时,一般还有其它参数配合。

    -f ssh在后台运行,即认证之后,ssh退居后台

    -T 不要分配tty终端

    -N 不要在服务器执行命令

    -C 压缩数据包

    -i 指定认证密钥文件

    -n 将 stdio 重定向到 /dev/null,与-f配合使用

    -p 指定连接端口

    -X Enables X11 forwarding.

    -q 安静模式

    4.使用实例
    4.1.本地端口转发
    Q:如果你访问不了www.twitter.com里,但是你有一台vps服务器,这台服务器可以访问到到twitter,你将如何处理呢?
    A:通过ssh隧道技术,你可以让你的vps服务器在你的本地机子和twitter.com中间打通一条隧道,让你访问到twitter.com.方法如下:
    ssh -f -N -n -T -C -L localhost:8080:www.twitter.com:80 user@vps

    4.2.远程端口转发
    Q:如果你是一名程序员,你开发的程序运行在80端口,但是可恶的运营商封闭你的80端口,或者你在一台路由器后面,而你没权限来管理路由器来做端口映射,之类的问题很多。但是你有一台在公网上的vps并且你可以访问得到这台vps,你装如何让外面的人访问到你本机的80端口呢?
    A:通过ssh隧道技术,你可以让你的vps服务器和你本机和打通一条隧道,让外面的人访问到vps上的端口再转发到你的本机端口,方法如下:
    ssh -f -N -n -T -C -R *:8080:localhost:80 user@vps

    4.3.动态端口转发
    Q:如果你注意到本地端口转发的例子,你心里就会有个疑问,如果我还要访问facebook,访问youtube这些都不存大的网站,那是不是要一条一条去写进去呢?
    A:ssh提供了动态端口转发就是给这种访问目标没有事先明确使用的,方法如下。
    ssh -f -N -n -T -C -D 8080


    PS:正常的情况下,远程的vps上的phpmyadmin只应该在远程的localhost监听(或者其它一些应用),这时候你应该使用本地端口转发,通过访问本地的一个端口去访问到远程vps上只监听远程机子localhost接口的应该,增加安全性。
    第 1 条附言  ·  2014-08-11 00:54:52 +08:00
    远程转发的端口默认也只能在远程服务器本机上访问,要想允许外部访问,可改写为 -R *:8080:localhost:80 user@vps,并确保在服务器的sshd_config中打开了GatewayPorts选项。(GatewayPorts yes)

    同时本地转发 ssh -f -N -n -T -C -L localhost:8080:www.twitter.com:80 user@vps
    的localhost:8080可以直接写成 -L 8080:www.twitter.com:80。

    远程转发 ssh -f -N -n -T -C -R *:8080:localhost:80 user@vps
    的*:8080可以直接写成 -R 8080:localhost:80。(这时候只能远程本机访问这个8080端口)
    28 条回复    2014-08-12 16:24:37 +08:00
    jerryjhou
        1
    jerryjhou  
       2014-08-11 00:25:20 +08:00
    解释得很详细,但是,你这是给谁看的?
    sdysj
        2
    sdysj  
       2014-08-11 00:35:18 +08:00
    老古董还首发,穿越了么?
    suifengdaren
        3
    suifengdaren  
    OP
       2014-08-11 00:39:47 +08:00
    远程转发的端口默认也只能在远程服务器本机上访问,要想允许外部访问,可改写为 -R *:8080:localhost:80 user@vps,并确保在服务器的sshd_config中打开了GatewayPorts选项。(GatewayPorts yes)

    同时本地转发 ssh -f -N -n -T -C -L localhost:8080:www.twitter.com:80 user@vps
    的localhost:8080可以直接写成 -L 8080:www.twitter.com:80

    远程转发 ssh -f -N -n -T -C -R *:8080:localhost:80 user@vps
    的*:8080可以直接写成 -R 8080:localhost:80。(这时候只能远程本要访问这个8080端口)
    suifengdaren
        4
    suifengdaren  
    OP
       2014-08-11 00:52:30 +08:00
    @sdysj 首发的意思,是这篇文章的第一次是发布在v2ex,ssh隧道技术是很久的技术没错,但并不代表每个人都清楚使用和用法,你懂并不代表别人也懂。
    freetg
        5
    freetg  
       2014-08-11 00:57:55 +08:00
    现在ssh翻墙经常被断
    binux
        6
    binux  
       2014-08-11 01:02:47 +08:00
    好荣幸能在V2EX上看到首发
    jings
        7
    jings  
       2014-08-11 01:03:36 +08:00 via Android
    ssh隧道的确不简单 不过发在V2这种一流穿墙社区就只能被当小白了
    Tink
        8
    Tink  
       2014-08-11 01:07:17 +08:00 via iPhone
    以前那会这么弄,现在早不行了
    XadillaX
        9
    XadillaX  
       2014-08-11 01:30:36 +08:00 via Android
    http://v2ex.com/t/117606#reply16

    之前做的很水的一个东西,没时间维护,有兴趣的可以 fork 贡献一下哈。
    WangYan
        10
    WangYan  
       2014-08-11 01:38:43 +08:00
    被标题进来了,不过楼主撸了那么多字也算有心了。
    O21
        11
    O21  
       2014-08-11 02:08:34 +08:00
    实在想用ssh 加密不就好了。。
    RIcter
        12
    RIcter  
       2014-08-11 02:11:29 +08:00 via iPad
    @binux 嘲讽技能max XD
    jprovim
        13
    jprovim  
       2014-08-11 05:25:42 +08:00
    man ssh
    goodxxx
        14
    goodxxx  
       2014-08-11 07:06:09 +08:00 via Android
    楼主gif用什么做的,不错。
    wuwuyun
        15
    wuwuyun  
       2014-08-11 07:32:41 +08:00
    做做内网穿透不错 用来翻墙效率和可用性都是问题
    Perry87
        16
    Perry87  
       2014-08-11 07:55:38 +08:00
    楼主用心了,加油。
    mengzhuo
        17
    mengzhuo  
       2014-08-11 08:44:24 +08:00
    欢迎LZ来到unix世界~
    只有想不到,没有做不到
    Ellison
        18
    Ellison  
       2014-08-11 09:07:50 +08:00
    被标题进来,嗯,楼主头像不错...
    Aether
        19
    Aether  
       2014-08-11 09:49:11 +08:00
    嗯。。。我想V2EX的风格之一是包容的,为了达到这一目的,我认为有必要让楼主了解这个真实的世界。。。

    这篇文章如果早个七八年发布还是很时新的。现在么,其实一搜之下到处都是。。。

    话说我最开始接触SSH还真是那时从LIVID的blog开始的。。。
    hexor
        20
    hexor  
       2014-08-11 09:50:14 +08:00
    翻译的不错 加油
    xi4oh4o
        21
    xi4oh4o  
       2014-08-11 09:55:22 +08:00
    ssh -nNTf -D
    hellojinjie
        22
    hellojinjie  
       2014-08-11 09:57:22 +08:00
    good 不错,鼓励一下
    usedname
        23
    usedname  
       2014-08-11 09:59:48 +08:00
    ssh流量过大会被掐断链接的,这个真的不适合翻墙
    21grams
        24
    21grams  
       2014-08-11 10:02:07 +08:00
    实现不明白楼主发这一篇的意义何在,这不是浪费大家的时间吗?
    geeti
        25
    geeti  
       2014-08-11 12:46:17 +08:00 via iPad
    我觉得这是会点网络知识的基础
    skyworker
        26
    skyworker  
       2014-08-11 12:48:26 +08:00
    我能说 现在用ssh隧道,会加速IP被封吗?
    heganj
        27
    heganj  
       2014-08-12 12:31:01 +08:00
    laoisaudi
        28
    laoisaudi  
       2014-08-12 16:24:37 +08:00
    good
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2788 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 13:25 · PVG 21:25 · LAX 06:25 · JFK 09:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.