怎樣把 ssh、http 和 https 放到同一埠?


ssl/ssh multiplexer


這是用 HAProxy 1.5 版本做得簡單實現.
對 SSL TLS協議 各個版本不太熟, 簡單```nc -l 8888 | hexdump -C```, 看了下 payload, 發現可以區分出來 :)

global
log /dev/log local2
pidfile /run/haproxy.pid
maxconn 1000

defaults
timeout http-request 30s
timeout queue 10s
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s

frontend main
mode tcp
bind *:8888
log global
option tcplog
log-format %ft %b/%s

tcp-request inspect-delay 3s
acl is_https req.payload(0,3) -m bin 160301
# G E T P O S P U T D E L etc
acl is_http req.payload(0,3) -m bin 474554 504f53 505554 44454c
acl is_ssh req.payload(0,3) -m bin 535348
tcp-request content accept if is_https
tcp-request content accept if is_http
tcp-request content accept if is_ssh
use_backend https if is_https
use_backend http if is_http
use_backend ssh if is_ssh

backend ssh
mode tcp
server ssh01 127.0.0.1:22 maxconn 10 check inter 3s

backend http
mode tcp
server ngx01 127.0.0.1:8080 maxconn 10 check inter 3s

backend https
mode tcp
server ngx02 127.0.0.1:8443 maxconn 10 check inter 3s


這裡有翻牆的點這個鏈接http://pj.91.com/tech/121220/2519790.html,具體實現按步驟來,我試過沒問題。


寫一個代理工具,根據初始化時的TCP包特徵分辨類型,轉發到不同的埠,用iocp或者epoll做,應該不超過千行。名字我都想好了,叫做七層路由器,就差動手實現了。


不同的虛擬IP同一埠默認就可以。
同一IP同一埠 UDP可以不同進程同時持有。
對ssh,http,https要麼在這個埠上加個轉發,判斷是ssh協議的話轉到一個埠,判斷是http協議轉到另一個埠,判斷是https協議再轉到另一個埠。或者可以試下iptables -m statistic --mode random --probability 0.3 。或者可以考慮下SO_REUSEADDR,但SO_REUSEADDR不是像udp那種廣播包到所有監聽的進程.


推薦閱讀:

如何看待谷歌 Google 打算用 QUIC 協議替代 TCP/UDP?
http是應用層,ip是網路層,那麼http請求頭部的client ip是怎麼獲取到的呢?
基於傳輸層TCP、UDP協議的自定義應用層協議如何實現?
前端工程師應該對 HTTP 了解到什麼程度?從哪些途徑去熟悉更好?
為什麼國內視頻網站多採用HTTP協議傳輸視頻,而國外多使用RTMP等專門的流媒體協議?

TAG:伺服器 | SSH | 計算機網路 | HTTP | 網路埠 |