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

2016-04-03 19:00:46 +08:00
 dangyuluo

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

16358 次点击
所在节点    Linux
47 条回复
dangyuluo
2016-04-03 22:16:50 +08:00
@AlexaZhou 如果你身处一个效率和政府一样的学校,你就会知道一个端口的珍贵了。
owt5008137
2016-04-03 22:45:14 +08:00
理论上可以劫持 tcp 包,然后分析内容,如果是 ssh 协议,转发给 sshd ,如果是 http 协议,转发给 web service 。不知道有没人这么做过
scys
2016-04-03 23:33:13 +08:00
@owt5008137 你的想法已经很多人在做,叫做七层流量分流
kookxiang
2016-04-03 23:39:09 +08:00
nginx 好像有 port reuse 啊
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
2016-04-04 00:04:41 +08:00
http://zone.wooyun.org/content/24278
用 iptables 直接判断来路 ip
dphdjy
2016-04-04 09:11:54 +08:00
HAproxy 几行配置,基于协议进行转发, 简单粗暴~(不过目前还不知道怎么同时转 3 种,好像只能 2 种
rootsir
2016-04-04 10:28:44 +08:00
ajax terminal
wizardoz
2016-04-04 10:36:20 +08:00
服务器往外访问有限制不?
要是没有的话,反向端口映射即可。
dangyuluo
2016-04-04 13:00:39 +08:00
@dphdjy 是么?我还以为 HA 只能做 http 下的负载均衡。
dangyuluo
2016-04-04 13:05:01 +08:00
@extreme 这种方法略有麻烦,所以还是使用 sslh ,下一步可以使用 haproxy 。

@just1 不太符合满世界跑。

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

@owt5008137 确实是这么做的。
beyondsoft
2016-04-04 13:59:31 +08:00
shellinabox
dphdjy
2016-04-04 14:09:24 +08:00
@dangyuluo 我试过转发 ssh 和 http ,或者 ssh 和 https ,也可以 http 和 https 。
但是 ssh+http+https 没成成功。。。(技艺不精
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
2016-04-04 17:38:31 +08:00
ssh 是服务器先打招呼, http 是客户端先打招呼
这俩不可能共用的,别想了
dangyuluo
2016-04-04 17:39:30 +08:00
@julyclyde 很抱歉,不过建议你看一下上面的讨论。
julyclyde
2016-04-04 17:42:09 +08:00
@dangyuluo 那你有没有统计过失败率呢
dangyuluo
2016-04-04 17:46:21 +08:00
@julyclyde 感谢你的提醒,在上线的俩小时内我特意跑到咖啡馆测试外网访问,无论是 http 和 SSH 都没有任何问题。
另,切换到 sslh 后,询问了几个网站重度访问者,并没有任何感知。
julyclyde
2016-04-04 17:52:05 +08:00
@dangyuluo 唉,看你还是挺嘴硬的。这么说吧,请你看一下 probe.c 的 61 行~ 87 行。在你这个特殊案例里,仅仅是 ssh 效率受点儿影响而已,但它不可能在支持第二个服务器主动类型的协议。另外如果你的客户端超时设置比较严格,就会协商失败
msg7086
2016-04-04 21:34:46 +08:00
@julyclyde 流量分流理论上并不是做不到。
Nginx 本身就支持在 HTTPS 端口收到 HTTP 请求的时候返回 The plain HTTP request was sent to HTTPS port 。
更别说 SSH 和 HTTP 这种只要看客户端有没有发请求就能判断的分流了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/268329

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX