技术解析

Linux 如何做到 ssh/http 共用 80 端口?
0
2021-07-05 00:41:16
idczone

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


你可以给 Web 服务做一个点击切换到 SSH 服务的按钮,连完了再切回来。俩同时使用是没可能的。

HAproxy 来实现 TCP 负载均衡行不行?

http://www.rutschle.net/tech/sslh.shtml

那样就会在一定时间内影响到 http 服务。我觉得通过分析请求的协议然后将数据包转发给 http 或者 ssh 服务应该是可行的吧。正在研究,说不定自己写一套这样的东西。

这东西不错,学习一下。

webshell , 23333

自己写,或者干脆开放 http 代理, ssh 通过代理连接。

协议分析不知道效率如何。如果可以用另一台服务器中转的话, iptables 设置通过识别中转 ip 再转发到 ssh 。

为何要把 ssh 端口改用 80 端口啊,没想明白这个必要性

因为只有一个 ip 开放端口,所以不太适合。

见上。

https://github.com/yrutschle/sslh

参考很多端口复用的 backdoor 、 rootkit
自己给自己装个 rootkit 而已

给服务器安装个 webshell 不过这个非常不安全 被入侵的服务器一般会用到这个

已经搞定, sslh 十分好用。

http://www.so-cools.com/?p=661

不可能一個端口被 2 個進程同時使用的吧?

确实是不可以,但是 sslh 可以根据数据包类型判断如何转发数据包到监听不同端口的进程上去

“有一台处于防火墙后的 Ubuntu 服务器,防火墙只开放了 80 端口,在外网管理起来十分麻烦,还没有 VPN 。”
我想设计成这样的本意就是避免 ssh 端口对外暴露所带来的风险。人家花功夫配置防火墙屏蔽了外网 ssh 访问,然后楼主又折腾一番终于加回去了,感觉好逗

你意思是,用 ssh 做前端?
那樣的話,好像 nginx 也可以做一個前端,去代理 ssh 鏈接吧?衹是,好像一樣不能監聽同樣的端口呀 0.0

你想多了。 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.

如果你身处一个效率和政府一样的学校,你就会知道一个端口的珍贵了。

理论上可以劫持 tcp 包,然后分析内容,如果是 ssh 协议,转发给 sshd ,如果是 http 协议,转发给 web service 。不知道有没人这么做过

你的想法已经很多人在做,叫做七层流量分流

nginx 好像有 port reuse 啊

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 规则。

http://zone.wooyun.org/content/24278
用 iptables 直接判断来路 ip

HAproxy 几行配置,基于协议进行转发, 简单粗暴~(不过目前还不知道怎么同时转 3 种,好像只能 2 种

ajax terminal

服务器往外访问有限制不?
要是没有的话,反向端口映射即可。

是么?我还以为 HA 只能做 http 下的负载均衡。

这种方法略有麻烦,所以还是使用 sslh ,下一步可以使用 haproxy 。
不太符合满世界跑。
也是一种思路,不过还得外网一台服务器,增加成本。
确实是这么做的。

shellinabox

我试过转发 ssh 和 http ,或者 ssh 和 https ,也可以 http 和 https 。
但是 ssh+http+https 没成成功。。。(技艺不精

用 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 状态。

ssh 是服务器先打招呼, http 是客户端先打招呼
这俩不可能共用的,别想了

很抱歉,不过建议你看一下上面的讨论。

那你有没有统计过失败率呢

感谢你的提醒,在上线的俩小时内我特意跑到咖啡馆测试外网访问,无论是 http 和 SSH 都没有任何问题。
另,切换到 sslh 后,询问了几个网站重度访问者,并没有任何感知。

唉,看你还是挺嘴硬的。这么说吧,请你看一下 probe.c 的 61 行~ 87 行。在你这个特殊案例里,仅仅是 ssh 效率受点儿影响而已,但它不可能在支持第二个服务器主动类型的协议。另外如果你的客户端超时设置比较严格,就会协商失败

流量分流理论上并不是做不到。
Nginx 本身就支持在 HTTPS 端口收到 HTTP 请求的时候返回 The plain HTTP request was sent to HTTPS port 。
更别说 SSH 和 HTTP 这种只要看客户端有没有发请求就能判断的分流了。

可以试试这个。
https://github.com/paradoxxxzero/butterfly

SSL 和 HTTP 都是服务器被动的协议,分流的实现很简单。看客户端有没有发请求的分流,那只能像上面 sshlh 那样,在多种服务器被动协议以外只能支持一种服务器主动的协议,而不能任意协议的搭配
你能实现两个服务器主动的协议的分流么?洗耳恭听

哦服务器主动的当然不行。

坦率的说,楼主是不是搞了一台服务器想做个后门啊,可以使用 HTTP tunnel 嘛

哥 没有乌云账号呀,你直接把文章发出来么

可以做到 5901 和 ssh 共用么

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服