ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          Using HAProxy to make SSH and SSL available on the same port

          Certain places firewall TCP ports other than the most common ports. There are many techniques for bypassing such restrictions. One simple approach is to run a SSH daemon on port 443, however a downside of this is you need to dedicate an IP address to this SSH service.

          There is quite a neat technique for making SSH and SSL share a port; in the SSL protocol clients should write first, whereas in SSH the server should write first; therefore by waiting to see if the client writes data it is possible to make a guess as to if the client is an SSL client or a SSH client.

          I'm not the first person to think this up, Net::Proxy has a script called sslh and confusingly there is also a C implementation also called sslh.

          I recently switched my web server to use HAProxy to allow me some more flexiblity in how I configure things (especially now the development version has keepalive support). While reading the (incredibly detailed) documentation I noticed it should be able to do the sslh technique.

          Doing this needs the (currently) in development HAProxy 1.4 (support was added for content switching TCP as well as HTTP in this commit -- thanks to Cyril Bonté on the mailing list for confirming that).

          The configuration looks something like the following (global section omitted, you'll want to run it as a user other than root and chroot it if you actually use this).

          defaults

            timeout connect 5s

            timeout client 50s

            timeout server 20s


          listen ssl :443

            tcp-request inspect-delay 2s

            acl is_ssl req_ssl_ver 2:3.1

            tcp-request content accept if is_ssl

            use_backend ssh if !is_ssl

            server www-ssl :444

            timeout client 2h


          backend ssh

            mode tcp

            server ssh :22

            timeout server 2h



          This listens on port 443, forwards it to port 444 (where the actual SSL web server is listening) unless it is not SSLv2, SSLv3 or TLSv1 traffic, in which case it forwards it to the ssh backend listening on port 22.

          Obviously as I said earlier this is only a guess that is subject to network conditions such as packet loss. I'm not recommending you use this technique on a production site, but for a low traffic machine where you want to run both protocols it is very useful. (By increasing the timeout for SSH you increase the chances of a correct result, but also add a potentially annoying delay).

          Sometimes layer 7 filtering techniques are in use and just listening on port 443 is not enough. In this case you can use SSH inside SSL.

          posted on 2014-03-19 01:53 ivaneeo 閱讀(1302) 評(píng)論(0)  編輯  收藏 所屬分類: GNU牛力
          主站蜘蛛池模板: 玉林市| 冕宁县| 彭阳县| 太谷县| 北流市| 沈丘县| 昌黎县| 义马市| 漾濞| 清水河县| 安多县| 海门市| 伊川县| 淮南市| 徐州市| 芮城县| 陵川县| 扶余县| 屏边| 江安县| 电白县| 肇源县| 泽库县| 名山县| 靖江市| 青河县| 大冶市| 乐东| 驻马店市| 泽州县| 扶绥县| 甘泉县| 神农架林区| 龙门县| 吐鲁番市| 海兴县| 杨浦区| 庐江县| 连城县| 偃师市| 淅川县|