Pages

Saturday, 31 December 2011

SSH via HTTP Proxy

这是一个困扰我许久的问题,因为自己比较懒所以一直没有去就寻根问底,需要用到 SSH Tunnel 时就用 PuTTY 来绕过这个问题。

问题的产生:公司的网络环境需要走 HTTP Proxy 才能访问外部 Internet。工作机用 Ubuntu ,无论是在 Terminal 中手动设置 http_proxy 还是用 gnome-network-properties GUI 设置全局环境变量,对在命令行中用 ssh 都不起作用。

解决方法: Debian/Ubuntu 下可以安装 connect-proxy 包,以下是包描述:


Description: Establish TCP connection using SOCKS4/5 or HTTP tunnel
connect-proxy is a simple relaying command to make tunnel TCP connection
via SOCKS or HTTPS proxies.
It is mainly intended to be used as proxy command of OpenSSH.

安装后编辑一下 ~/.ssh/config 例如:

## Servers outside the firewall, use HTTP proxy
Host my-ssh-server.com
ProxyCommand connect -H proxy.my-ssh-server.com:80 %h %p
## Sites inside the firewall, do NOT use proxy
Host *
ProxyCommand connect %h %p

保存,再试一下ssh 到我的ssh server搞定!

更多 connect-proxy 的用法请 RTFM 哈。

注意:这样的话也带来了另外一个问题,若切换到家中或其它不需要代理的环境,就会出现连不上我的ssh server 的情况。至于如何解决,大家自行动脑筋吧;-)
还是那句话:世上无难事,只怕有心人。

from http://terrywang.net/archives/1321
--------------------------------------------
利用 SSH over HTTP 突破 http Proxy Firewall

話說上次順利用 Linux Server 連上 IEEE 802.1x Ethernet 後,
整個工作效率可說是提升許多.

不用在 Windows, Linux 兩邊 copy 來 copy 去的,
直接在我的 NB checkout CVS/SVN repositories......
心情整個都好了起來!!

不過公司大概是因為顧慮到資訊安全的關係,
所以現在的網路環境是採用 Proxy Firewall, 而非 NAT.
也就是說要上 Internet 都得透過 Proxy, 內網無法直接 Routing 出去.
基本上只會開放 80 (http), 443(https), 及 21(FTP), 這幾個 Proxy 支援的 Ports.

所以無法 SSH, IRC, checkout GIT repository(除非走http), ......等等.
一般 Linux User 常見的工作需求.

上次與 Yuren 見面時提到了這個不方便處
, 他跟我開玩笑的說找找看有沒有什麼 "SSH over HTTP" 之類的東西.
所以在 IEEE 802.1x 搞定之後, 便上 Google 打了 "SSH over HTTP" 這樣的關鍵字.
結果沒想到還真的有這種東西勒!!

詳情請參考: ProxyTunnel http://proxytunnel.sourceforge.net/

經過我犧牲一夜沒睡, 第二天照常上班的苦戰後.
整理出以下心得:

1) 如果你在 Internet 上的主機, 可以讓 SSH listen 443 port
, 那樣或許可以直接使用內網 Proxy 連上. (關鍵在於內網那台 proxy)

2) 如果你 443 已經有跑東西了(如: apache https), SSH 不方便轉過去 443 的話.
那你將會需要把 apache 的 proxy 功能打開, 並記得要載入 proxy CONNECT module.

3) 關鍵其實是在於 HTTP CONNECT method 的支援. 依照 SPEC. 的講法, 這個 method 本來
是留給 proxy 用來建立 SSL tunnel 的.
所以感覺上有別於 POST, GET 這種 connectionless 的方式. (我猜的...沒看完 SPEC.)
故可以被利用來建立 SSH Tunnel.

4) 講清楚一點就是, proxy 可以設定欲支援的 CONNECT method 的 ports.
而一般 Proxy 通常會支援 443(HTTPS), 568(NNTP) 這兩個 ports.
所以如果你內網的 proxy 支援 CONNECT method 到 443 port 的話.
那你在 Internet 上的 SSH 只要 Listen 443 port 即可.

5) 要不就是你 Internet 上的 apache 要 listen 443 port, 並開啟 proxy functionality.
另外我試過開 SSL(https), 但是 MS ISA Proxy 會一直說不 support (??!!)
所以我整夜沒睡的經驗是, Apache listen 443 port, 但要關掉 SSL (https).
也就是說, 在 443 port 跑一般 HTTP 服務.

6) 至於你自己架的 proxy, APACHE 有提供一個 AllowCONNECT 參數.
也就是該 proxy 打算 support CONNECT 的 ports. (如: ssh 是 22)
(其實你也可以連別的 ports, 只要記得設定進來就可以了)

7) 最後, Squid 也可以做到同樣功能, 不過記得 Listen 443 port.
而且 Squid 的設定會比 apache 來的靈活.
但這樣你又沒 apache https 了 (很想殺人吧?).

相關設定範例請參考, http://dag.wieers.com/howto/ssh-http-tunneling/

你可以先用下面 commands 測試, OK 後才寫進 ~/.ssh/config:

proxytunnel -v -p local_proxy:3128 -d your_ssh:443
(如果你可以將 SSH Listen 443 port 的話, 另外內網的 proxy 可以讓你 CONNECT)

proxytunnel -v -p local_proxy:3128 -r your_proxy:443 -d your_ssh:22
(如果你家主機 apache 有開 proxy 在 443, 跑 HTTP 協定)


結語:
1) 如果你的 local proxy 是 MS ISA proxy, 並需要認證的話, 這 tool 有支援.
不然你可以再多架一個 ntlmaps.

2) 其實 proxytunnel 本身有支援 SSL(https), 但我的 local MS ISA proxy 會有問題.
不然你可以用 -X 要求 local_proxy 跟 your_proxy 間使用 SSL.
或是 -E 可以要求 "你的電腦" 與 local_proxy 間使用 SSL.

3) your_proxy 請用 IP 擋掉全部, 只開你工作地方的 IP.

並請不要開 Http Auth, 因為這 tool 還沒支援第二台 proxy http 認證.

出处:http://merckhung.blogspot.com/2008/08/ssh-over-http-proxy-proxy-firewall.html

No comments:

Post a Comment