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

Linux 如何做到 ssh/http 共用 80 端口?

  •  
  •   dangyuluo · 2016-04-03 19:00:46 +08:00 · 16582 次点击
    这是一个创建于 3148 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一台处于防火墙后的 Ubuntu 服务器,防火墙只开放了 80 端口,在外网管理起来十分麻烦,还没有 VPN 。 有没有什么办法能够使 ssh/http 复用 80 端口?网上搜索了一圈,没太多有用的信息。

    47 条回复    2023-02-14 16:35:54 +08:00
    function007
        1
    function007  
       2016-04-03 19:05:51 +08:00
    你可以给 Web 服务做一个点击切换到 SSH 服务的按钮,连完了再切回来。俩同时使用是没可能的。
    neoblackcap
        2
    neoblackcap  
       2016-04-03 19:08:01 +08:00
    HAproxy 来实现 TCP 负载均衡行不行?
    wwwjfy
        3
    wwwjfy  
       2016-04-03 19:09:54 +08:00   ❤️ 5
    dangyuluo
        4
    dangyuluo  
    OP
       2016-04-03 19:10:43 +08:00
    @function007 那样就会在一定时间内影响到 http 服务。我觉得通过分析请求的协议然后将数据包转发给 http 或者 ssh 服务应该是可行的吧。正在研究,说不定自己写一套这样的东西。
    dangyuluo
        5
    dangyuluo  
    OP
       2016-04-03 19:11:26 +08:00
    @wwwjfy 这东西不错,学习一下。
    phttc
        6
    phttc  
       2016-04-03 19:12:28 +08:00
    webshell , 23333
    gamexg
        7
    gamexg  
       2016-04-03 19:12:38 +08:00
    自己写,或者干脆开放 http 代理, ssh 通过代理连接。
    thekll
        8
    thekll  
       2016-04-03 19:43:41 +08:00 via iPhone
    协议分析不知道效率如何。如果可以用另一台服务器中转的话, iptables 设置通过识别中转 ip 再转发到 ssh 。
    LINAICAI
        9
    LINAICAI  
       2016-04-03 19:48:23 +08:00
    为何要把 ssh 端口改用 80 端口啊,没想明白这个必要性
    dangyuluo
        10
    dangyuluo  
    OP
       2016-04-03 19:54:08 +08:00
    @thekll 因为只有一个 ip 开放端口,所以不太适合。


    @LINAICAI 见上。
    clino
        11
    clino  
       2016-04-03 19:54:39 +08:00 via Android   ❤️ 4
    pimin
        12
    pimin  
       2016-04-03 19:56:16 +08:00
    参考很多端口复用的 backdoor 、 rootkit
    自己给自己装个 rootkit 而已
    xjp
        13
    xjp  
       2016-04-03 20:28:11 +08:00
    给服务器安装个 webshell 不过这个非常不安全 被入侵的服务器一般会用到这个
    dangyuluo
        14
    dangyuluo  
    OP
       2016-04-03 20:28:55 +08:00
    已经搞定, sslh 十分好用。
    mandymak
        15
    mandymak  
       2016-04-03 21:00:51 +08:00
    JerningChan
        16
    JerningChan  
       2016-04-03 21:42:35 +08:00
    不可能一個端口被 2 個進程同時使用的吧?
    DesignerSkyline
        17
    DesignerSkyline  
       2016-04-03 21:51:20 +08:00
    @JerningChan 确实是不可以,但是 sslh 可以根据数据包类型判断如何转发数据包到监听不同端口的进程上去
    AlexaZhou
        18
    AlexaZhou  
       2016-04-03 22:00:12 +08:00
    “有一台处于防火墙后的 Ubuntu 服务器,防火墙只开放了 80 端口,在外网管理起来十分麻烦,还没有 VPN 。”

    我想设计成这样的本意就是避免 ssh 端口对外暴露所带来的风险。人家花功夫配置防火墙屏蔽了外网 ssh 访问,然后楼主又折腾一番终于加回去了,感觉好逗
    JerningChan
        19
    JerningChan  
       2016-04-03 22:07:29 +08:00
    @DesignerSkyline 你意思是,用 ssh 做前端?
    那樣的話,好像 nginx 也可以做一個前端,去代理 ssh 鏈接吧?衹是,好像一樣不能監聽同樣的端口呀 0.0
    DesignerSkyline
        20
    DesignerSkyline  
       2016-04-03 22:10:48 +08:00
    @JerningChan 你想多了。 sslh accepts connections on specified ports, and forwards them further based on tests performed on the first data packet sent by the remote client.Hence sslh acts as a protocol demultiplexer, or a switchboard. Its name comes from its original function to serve SSH and HTTPS on the same port.
    dangyuluo
        21
    dangyuluo  
    OP
       2016-04-03 22:16:50 +08:00
    @AlexaZhou 如果你身处一个效率和政府一样的学校,你就会知道一个端口的珍贵了。
    owt5008137
        22
    owt5008137  
       2016-04-03 22:45:14 +08:00
    理论上可以劫持 tcp 包,然后分析内容,如果是 ssh 协议,转发给 sshd ,如果是 http 协议,转发给 web service 。不知道有没人这么做过
    scys
        23
    scys  
       2016-04-03 23:33:13 +08:00
    @owt5008137 你的想法已经很多人在做,叫做七层流量分流
    kookxiang
        24
    kookxiang  
       2016-04-03 23:39:09 +08:00
    nginx 好像有 port reuse 啊
    extreme
        25
    extreme  
       2016-04-04 00:03:27 +08:00
    SSH listen 22, HTTP listen 80
    iptables -t nat -I PREROUTING -s IP_WANT_TO_CONNECT_TO_SSH -p tcp --dport 80 -j REDIRECT --to-ports 22

    我的思路是,用 SSH 服务的 IP 比用 HTTP 服务的 IP 少……
    甚至可以在 80 端口的网页弄个东西,访问,输入密码,自动根据你的访问 IP 添加 NAT 规则。
    just1
        26
    just1  
       2016-04-04 00:04:41 +08:00 via Android
    http://zone.wooyun.org/content/24278
    用 iptables 直接判断来路 ip
    dphdjy
        27
    dphdjy  
       2016-04-04 09:11:54 +08:00 via Android
    HAproxy 几行配置,基于协议进行转发, 简单粗暴~(不过目前还不知道怎么同时转 3 种,好像只能 2 种
    rootsir
        28
    rootsir  
       2016-04-04 10:28:44 +08:00
    ajax terminal
    wizardoz
        29
    wizardoz  
       2016-04-04 10:36:20 +08:00
    服务器往外访问有限制不?
    要是没有的话,反向端口映射即可。
    dangyuluo
        30
    dangyuluo  
    OP
       2016-04-04 13:00:39 +08:00
    @dphdjy 是么?我还以为 HA 只能做 http 下的负载均衡。
    dangyuluo
        31
    dangyuluo  
    OP
       2016-04-04 13:05:01 +08:00
    @extreme 这种方法略有麻烦,所以还是使用 sslh ,下一步可以使用 haproxy 。

    @just1 不太符合满世界跑。

    @wizardoz 也是一种思路,不过还得外网一台服务器,增加成本。

    @owt5008137 确实是这么做的。
    beyondsoft
        32
    beyondsoft  
       2016-04-04 13:59:31 +08:00
    shellinabox
    dphdjy
        33
    dphdjy  
       2016-04-04 14:09:24 +08:00 via Android
    @dangyuluo 我试过转发 ssh 和 http ,或者 ssh 和 https ,也可以 http 和 https 。
    但是 ssh+http+https 没成成功。。。(技艺不精
    tywtyw2002
        34
    tywtyw2002  
       2016-04-04 16:32:17 +08:00
    用 iptables 就可以

    首先设置一条检查 http host 的规则 如果检查到该 string 在 http 包中那么 log 该访问者的 ip 到文件。
    crontab 定时 parse log 获得第一步中的 ip 地址,然后运行 ssh passtrough 程序。
    ssh passtrough 程序 call iptables 去 redirect 该 ip 地址到 80 口的数据包到 ssh port 。
    ssh passtrough 程序检查该 ssh 连接是否结束,如果结束清理 iptables 中的 redirect ,恢复 block 状态。
    julyclyde
        35
    julyclyde  
       2016-04-04 17:38:31 +08:00
    ssh 是服务器先打招呼, http 是客户端先打招呼
    这俩不可能共用的,别想了
    dangyuluo
        36
    dangyuluo  
    OP
       2016-04-04 17:39:30 +08:00
    @julyclyde 很抱歉,不过建议你看一下上面的讨论。
    julyclyde
        37
    julyclyde  
       2016-04-04 17:42:09 +08:00   ❤️ 1
    @dangyuluo 那你有没有统计过失败率呢
    dangyuluo
        38
    dangyuluo  
    OP
       2016-04-04 17:46:21 +08:00
    @julyclyde 感谢你的提醒,在上线的俩小时内我特意跑到咖啡馆测试外网访问,无论是 http 和 SSH 都没有任何问题。
    另,切换到 sslh 后,询问了几个网站重度访问者,并没有任何感知。
    julyclyde
        39
    julyclyde  
       2016-04-04 17:52:05 +08:00
    @dangyuluo 唉,看你还是挺嘴硬的。这么说吧,请你看一下 probe.c 的 61 行~ 87 行。在你这个特殊案例里,仅仅是 ssh 效率受点儿影响而已,但它不可能在支持第二个服务器主动类型的协议。另外如果你的客户端超时设置比较严格,就会协商失败
    msg7086
        40
    msg7086  
       2016-04-04 21:34:46 +08:00
    @julyclyde 流量分流理论上并不是做不到。
    Nginx 本身就支持在 HTTPS 端口收到 HTTP 请求的时候返回 The plain HTTP request was sent to HTTPS port 。
    更别说 SSH 和 HTTP 这种只要看客户端有没有发请求就能判断的分流了。
    lijianying10
        41
    lijianying10  
       2016-04-04 21:55:00 +08:00
    julyclyde
        42
    julyclyde  
       2016-04-05 10:34:37 +08:00
    @msg7086 SSL 和 HTTP 都是服务器被动的协议,分流的实现很简单。看客户端有没有发请求的分流,那只能像上面 sshlh 那样,在多种服务器被动协议以外只能支持一种服务器主动的协议,而不能任意协议的搭配

    你能实现两个服务器主动的协议的分流么?洗耳恭听
    msg7086
        43
    msg7086  
       2016-04-05 19:59:32 +08:00
    @julyclyde 哦服务器主动的当然不行。
    tylerdurden
        44
    tylerdurden  
       2016-04-07 14:25:03 +08:00
    坦率的说,楼主是不是搞了一台服务器想做个后门啊,可以使用 HTTP tunnel 嘛
    yuedingwangji
        45
    yuedingwangji  
       2016-05-20 01:22:34 +08:00
    @just1 哥 没有乌云账号呀,你直接把文章发出来么
    yuedingwangji
        46
    yuedingwangji  
       2016-05-20 01:36:01 +08:00
    可以做到 5901 和 ssh 共用么
    ab1072074029
        47
    ab1072074029  
       2023-02-14 16:35:54 +08:00
    @dangyuluo 大佬赐教下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   957 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:33 · PVG 05:33 · LAX 13:33 · JFK 16:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.