SSH 端口轉(zhuǎn)發(fā)
本文用于記錄一下 SSH 端口轉(zhuǎn)發(fā)功能的學(xué)習(xí)筆記,以做備忘,主要參考文章如下:
- 徹底搞懂SSH遠(yuǎn)程轉(zhuǎn)發(fā)命令
- SSH端口轉(zhuǎn)發(fā)
- An Illustrated Guide to SSH Tunnels
SSH 不僅可以遠(yuǎn)程登錄,還有一個(gè)非常實(shí)用的功能:端口轉(zhuǎn)發(fā)。
SSH 端口轉(zhuǎn)發(fā)又叫 SSH 隧道(tunnel),是在 SSH 連接的基礎(chǔ)上,通過(guò)將客戶端或服務(wù)器端的某個(gè)端口的數(shù)據(jù)放到 SSH 連接中加密傳輸,從而在不安全的網(wǎng)絡(luò)中安全的傳輸數(shù)據(jù)或者繞過(guò)防火墻的限制實(shí)現(xiàn)對(duì)目的主機(jī)目的端口的訪問(wèn)的一個(gè)功能。
端口轉(zhuǎn)發(fā)有兩個(gè)主要作用:
(1)將不加密的數(shù)據(jù)放在 SSH 安全連接里面?zhèn)鬏?,在不安全的網(wǎng)絡(luò)或不受信任的網(wǎng)絡(luò)提供安全連接,比如通過(guò)端口轉(zhuǎn)發(fā)訪問(wèn) Telnet、FTP 等明文服務(wù),數(shù)據(jù)傳輸就都會(huì)加密,或者在不安全的公用網(wǎng)絡(luò)中,利用信任的 SSH 服務(wù)器訪問(wèn)網(wǎng)絡(luò)或郵件服務(wù)器。
(2)繞過(guò)防火墻的限制實(shí)現(xiàn)對(duì)目的主機(jī)的訪問(wèn)。
端口轉(zhuǎn)發(fā)有三種使用方法:本地端口轉(zhuǎn)發(fā),遠(yuǎn)程端口轉(zhuǎn)發(fā),動(dòng)態(tài)端口轉(zhuǎn)發(fā)。
本地端口轉(zhuǎn)發(fā)(本地隧道)
本地端口轉(zhuǎn)發(fā) 是指在 SSH 連接的基礎(chǔ)上,將遠(yuǎn)程的 SSH 服務(wù)器作為中介,建立一個(gè)本地客戶端主機(jī)到目的主機(jī)(第三臺(tái)主機(jī))的連接,將對(duì)于本地客戶端主機(jī)指定端口的訪問(wèn)通過(guò) SSH 連接轉(zhuǎn)發(fā)給 SSH 服務(wù)器,再由 SSH 服務(wù)器發(fā)到目標(biāo)主機(jī)的目標(biāo)端口,同時(shí)將結(jié)果傳回。由于被轉(zhuǎn)發(fā)的端口位于本地客戶端,所以就叫做本地端口轉(zhuǎn)發(fā)。本地被轉(zhuǎn)發(fā)的端口類似于隧道的的入口,目標(biāo)主機(jī)的目標(biāo)端口類似于隧道的出口。
創(chuàng)建本地端口轉(zhuǎn)發(fā)的命令格式如下:
ssh -L 本地端口:目標(biāo)主機(jī):目標(biāo)端口 uesr@host [-N]
- 這個(gè)命令在本地客戶端主機(jī)執(zhí)行,它在建立端口轉(zhuǎn)發(fā)的同時(shí)也建立了基本的 SSH 連接;
- -L 選項(xiàng)表示建立本地端口轉(zhuǎn)發(fā),在之后本地端口、目標(biāo)主機(jī)、目標(biāo)端口之間用 :(冒號(hào))隔開(kāi);
- user@host 是登錄 SSH 服務(wù)器的用戶名與地址;
- -N 選項(xiàng)(可選)表示這個(gè) SSH 連接只進(jìn)行端口轉(zhuǎn)發(fā),不登錄遠(yuǎn)程 Shell,不能執(zhí)行遠(yuǎn)程命令,只能充當(dāng)隧道;
- 目標(biāo)主機(jī)不一定必須是第三臺(tái)主機(jī),也可以是 SSH 服務(wù)器本身,此時(shí)目標(biāo)主機(jī)就是 localhost;如果目標(biāo)主機(jī)是第三臺(tái)主機(jī),那么端口轉(zhuǎn)發(fā)只能保證本地主機(jī)至 SSH 服務(wù)器之間的連接是安全的,并不能保證 SSH 服務(wù)器至目標(biāo)主機(jī)間的連接是安全的,這取決于 SSH 服務(wù)器與目標(biāo)主機(jī)的連接方式。
應(yīng)用場(chǎng)景1
(1)臺(tái)式機(jī) B 上運(yùn)行著虛擬機(jī) C,虛擬機(jī)使用虛擬機(jī)軟件搭建的虛擬網(wǎng)絡(luò)與宿主主機(jī) B 相連接,但在主機(jī) B 以外無(wú)法直接訪問(wèn)該虛擬網(wǎng)絡(luò)。想要通過(guò) SSH,用與臺(tái)式機(jī) B 處于同一 WiFi 下的筆記本 A 來(lái)遠(yuǎn)程控制虛擬機(jī) C,(在A上)執(zhí)行端口轉(zhuǎn)發(fā)命令:
ssh -L 22022:虛擬機(jī) C 地址:22 desktop_user@臺(tái)式機(jī) B 地址
這個(gè)命令中,22022 是一個(gè)主機(jī) A 上未被占用的端口,desktop_user是登錄到臺(tái)式機(jī) B 的用戶名,注意此時(shí)臺(tái)式機(jī) B 需要開(kāi)啟 ssh 服務(wù)器端服務(wù)。
在虛擬機(jī) C 上也開(kāi)啟 ssh 服務(wù)器端服務(wù)后,在主機(jī) A 上執(zhí)行:
ssh -P 22022 vitual_user@localhost
這個(gè)命令以 SSH 協(xié)議訪問(wèn)本機(jī)的 22022 端口,這個(gè)請(qǐng)求會(huì)通過(guò)主機(jī) A 和臺(tái)式機(jī) B 之間的 SSH 連接到達(dá)臺(tái)式機(jī) B,臺(tái)式機(jī) B 將這個(gè)請(qǐng)求轉(zhuǎn)變?yōu)閷?duì)虛擬機(jī) C 的 22 端口的訪問(wèn)請(qǐng)求,并為 主機(jī) A 返回結(jié)果,這樣就可以在主機(jī) A 上以 SSH 協(xié)議登錄虛擬機(jī) C。
在這個(gè)命令中,-P 選項(xiàng)指定訪問(wèn)特定端口,而不是默認(rèn)的 22 端口,vitual_user 是登錄到虛擬機(jī)的用戶名,因?yàn)橹鳈C(jī) A 是訪問(wèn)自己的端口,所以地址是 localhost,也可以利用其它主機(jī)訪問(wèn)主機(jī) A 的 22022 端口達(dá)到訪問(wèn)虛擬機(jī) C 的目的,此時(shí) localhost 就改為 主機(jī) A 的 ip 地址或域名。
(2)加密訪問(wèn)郵件服務(wù)器
想要通過(guò) SSH 連接安全的訪問(wèn)郵件服務(wù)器,在本地主機(jī)執(zhí)行以下命令:
ssh -L 1100:mail.example.com:110 mail.example.com
這個(gè)命令中,1100 是本機(jī)未被占用的端口,mail.example.com 是郵件服務(wù)器,這個(gè)命令將對(duì)本機(jī)的 1100 端口的訪問(wèn)轉(zhuǎn)發(fā)到郵件服務(wù)器 mail.example.com 的 110 端口(郵件獲取協(xié)議 POP3 協(xié)議的默認(rèn)端口)。端口轉(zhuǎn)發(fā)建立以后,POP3 郵件客戶端只需要訪問(wèn)本機(jī)的 1100 端口,請(qǐng)求就會(huì)自動(dòng)轉(zhuǎn)發(fā)到 mail.example.com 的 110 端口。
在這種情況下,郵件服務(wù)器 mail.example.com 本身作為中介,必須運(yùn)行 SSH 服務(wù)器,否則,就必須通過(guò)另一臺(tái) SSH 服務(wù)器作為中介,命令如下:
ssh -L 1100:mail.example.com:110 other.example.com
這個(gè)命令中,本機(jī)的 1100 端口還是綁定 mail.example.com 的 110 端口,但是由于 mail.example.com 沒(méi)有運(yùn)行 SSH 服務(wù)器,所以必須通過(guò) other.example.com 中介。本機(jī)的 POP3 請(qǐng)求通過(guò) 1100 端口,先發(fā)給 other.example.com 的 22 端口(sshd 默認(rèn)端口),再由后者轉(zhuǎn)給 mail.example.com,得到數(shù)據(jù)以后再原路返回。
注意,采用上面的中介方式,只有本機(jī)到 other.example.com 的這一段是加密的,other.example.com 到 mail.example.com 的這一段并不加密。
遠(yuǎn)程端口轉(zhuǎn)發(fā)(遠(yuǎn)程隧道)
遠(yuǎn)程端口轉(zhuǎn)發(fā) 是指在建立 SSH 連接的基礎(chǔ)上,將本地客戶端主機(jī)作為中介,建立一個(gè) SSH 服務(wù)器到目的主機(jī)(第三臺(tái)主機(jī))的連接,將對(duì)于 SSH 服務(wù)器指定端口的訪問(wèn)通過(guò) SSH 連接轉(zhuǎn)發(fā)給客戶端,再由客戶端主機(jī)發(fā)到目標(biāo)主機(jī)的目標(biāo)端口,同時(shí)將結(jié)果傳回。由于被轉(zhuǎn)發(fā)的端口位于遠(yuǎn)程 SSH 服務(wù)器,所以就叫做遠(yuǎn)程端口轉(zhuǎn)發(fā)。遠(yuǎn)程 SSH 服務(wù)器上被轉(zhuǎn)發(fā)的端口類似于隧道的的入口,目標(biāo)主機(jī)的目標(biāo)端口類似于隧道的出口。
創(chuàng)建遠(yuǎn)程端口轉(zhuǎn)發(fā)的命令格式如下:
ssh -R 遠(yuǎn)程端口:目標(biāo)主機(jī):目標(biāo)端口 uesr@host [-N]
- 這個(gè)命令同樣在客戶端主機(jī)執(zhí)行;
- -R 選項(xiàng)表示建立遠(yuǎn)程端口轉(zhuǎn)發(fā),在之后遠(yuǎn)程端口、目標(biāo)主機(jī)、目標(biāo)端口之間用 :(冒號(hào))隔開(kāi),遠(yuǎn)程端口是一個(gè)在遠(yuǎn)程 SSH 服務(wù)器上的端口;
- user@host 是登錄 SSH 服務(wù)器的用戶名與地址;
- -N 選項(xiàng)(可選)表示這個(gè) SSH 連接只進(jìn)行端口轉(zhuǎn)發(fā),不登錄遠(yuǎn)程 Shell,不能執(zhí)行遠(yuǎn)程命令,只能充當(dāng)隧道;
- 目標(biāo)主機(jī)不一定必須是第三臺(tái)主機(jī),也可以是本地客戶端主機(jī)本身,此時(shí)目標(biāo)主機(jī)就是 localhost;如果目標(biāo)主機(jī)是第三臺(tái)主機(jī),那么端口轉(zhuǎn)發(fā)只能保證 SSH 服務(wù)器至本地主機(jī)之間的連接是安全的,并不能保證本地客戶端主機(jī)至目標(biāo)主機(jī)間的連接是安全的,這取決于本地客戶端主機(jī)與目標(biāo)主機(jī)的連接方式。
- 注意:OpenSSH 服務(wù)器對(duì)于遠(yuǎn)程端口轉(zhuǎn)發(fā)的設(shè)定,默認(rèn)只接受遠(yuǎn)程服務(wù)器主機(jī)本機(jī)上的應(yīng)用發(fā)起的請(qǐng)求,想要從其他連接到服務(wù)器的設(shè)備發(fā)起請(qǐng)求,需將 /etc/ssh/sshd_config 配置文件中 GatewayPorts 選項(xiàng)后的 no 修改為 yes。
應(yīng)用場(chǎng)景2
(1)臺(tái)式機(jī) B 上運(yùn)行著虛擬機(jī) C,虛擬機(jī)使用虛擬機(jī)軟件搭建的虛擬網(wǎng)絡(luò)與宿主主機(jī) B 相連接,但在主機(jī) B 以外無(wú)法直接訪問(wèn)該虛擬網(wǎng)絡(luò)。想要通過(guò) SSH,用與臺(tái)式機(jī) B 處于同一 WiFi 下的筆記本 A 來(lái)遠(yuǎn)程控制虛擬機(jī) C,在 B 上執(zhí)行端口轉(zhuǎn)發(fā)命令:
ssh -R 22122:虛擬機(jī) C 地址:22 desktop_user@筆記本 A 地址
這個(gè)命令中,22122 是一個(gè)筆記本 A 上未被占用的端口,desktop_user是登錄到筆記本 A 的用戶名,注意此時(shí)筆記本 A 是遠(yuǎn)程 ssh 服務(wù)器,此時(shí)與本地端口轉(zhuǎn)發(fā)的例子是不同的,在本地端口轉(zhuǎn)發(fā)的例子中,臺(tái)式機(jī) B 是遠(yuǎn)程 ssh 服務(wù)器。
在虛擬機(jī) C 上也開(kāi)啟 ssh 服務(wù)器端服務(wù)后,在筆記本 A 上執(zhí)行:
ssh -P 22122 vitual_user@localhost
-P 選項(xiàng)指定訪問(wèn)特定端口,vitual_user 是登錄到虛擬機(jī)的用戶名,因?yàn)橹鳈C(jī) A 是訪問(wèn)自己的端口,所以地址是 localhost。
這樣,筆記本 A 對(duì)本機(jī) 22122 端口的 SSH 訪問(wèn)請(qǐng)求經(jīng)過(guò)臺(tái)式機(jī) B 和筆記本 A之間的 SSH 連接轉(zhuǎn)發(fā)到臺(tái)式機(jī) B,再由臺(tái)式機(jī) B 發(fā)送給虛擬機(jī) C,這樣就建立了筆記本 A 和虛擬機(jī) C 之間的 SSH 連接。
(2)內(nèi)網(wǎng)計(jì)算機(jī) A 運(yùn)行著 http 服務(wù),但 A 沒(méi)有公網(wǎng) IP,其他設(shè)備不能使用該服務(wù)。恰好云服務(wù)器 B 有公網(wǎng) IP(甚至域名),便于被訪問(wèn)。在不將 http 服務(wù)遷移至云服務(wù)器 B 的前提下,可以使用 SSH 端口轉(zhuǎn)發(fā)使其他設(shè)備通過(guò)訪問(wèn) B 的方式訪問(wèn) A 上的 http 服務(wù)。在 A 上執(zhí)行端口轉(zhuǎn)發(fā)命令:
ssh -R 80:localhost:80 cloud_user@server.example.com
這時(shí)目標(biāo)主機(jī)是 A 本身(localhost),80 號(hào)端口是 http 默認(rèn)端口,cloud_user 是 B 上的用戶名;server.example.com 是 B 的域名。
于是其它人就可以通過(guò)訪問(wèn) http://server.example.com
來(lái)訪問(wèn)內(nèi)網(wǎng)計(jì)算機(jī) A 提供的 http 服務(wù)了。
動(dòng)態(tài)端口轉(zhuǎn)發(fā)
動(dòng)態(tài)端口轉(zhuǎn)發(fā) 是指在本機(jī)與 SSH 服務(wù)器之間建立一個(gè) SSH 連接,然后本機(jī)內(nèi)部針對(duì)某個(gè)端口的通信,都通過(guò)這個(gè)加密連接轉(zhuǎn)發(fā),但這種轉(zhuǎn)發(fā)不規(guī)定目標(biāo)主機(jī)和目標(biāo)端口,而是去讀取應(yīng)用發(fā)起的請(qǐng)求,從請(qǐng)求中獲取目標(biāo)信息。在這種情況下,SSH 服務(wù)器要去訪問(wèn)哪一個(gè)網(wǎng)站,完全是動(dòng)態(tài)的,取決于原始通信,所以就叫做動(dòng)態(tài)端口轉(zhuǎn)發(fā)。
相對(duì)的,本地端口轉(zhuǎn)發(fā)和遠(yuǎn)程端口轉(zhuǎn)發(fā)在建立時(shí)要指定目標(biāo)主機(jī)目標(biāo)端口,可以統(tǒng)稱為固定端口轉(zhuǎn)發(fā)。
創(chuàng)建動(dòng)態(tài)端口轉(zhuǎn)發(fā)的命令格式如下:
ssh -D 本地端口 user@host [-N]
這個(gè)命令中,-D 表示動(dòng)態(tài)端口轉(zhuǎn)發(fā),user@host 表示登錄到 SSH 服務(wù)器的用戶名和地址,-N 表示這個(gè) SSH 連接只進(jìn)行端口轉(zhuǎn)發(fā),不能執(zhí)行遠(yuǎn)程命令。
需要注意動(dòng)態(tài)端口轉(zhuǎn)發(fā)只綁定本地端口,并沒(méi)有指定目標(biāo)主機(jī)目標(biāo)端口,而是在通信到達(dá) SSH 服務(wù)器時(shí)使用 SOCKS4 或 SOCKS5 協(xié)議動(dòng)態(tài)確定。所以,如果要使用動(dòng)態(tài)端口轉(zhuǎn)發(fā)訪問(wèn)網(wǎng)絡(luò),需要在系統(tǒng)或應(yīng)用(瀏覽器等)中設(shè)置一個(gè)使用SOCKS5 協(xié)議、服務(wù)器為 localhost、端口為綁定的端口的代理,利用代理使請(qǐng)求走綁定的端口。
舉例來(lái)說(shuō),如果本地端口是2121,那么動(dòng)態(tài)轉(zhuǎn)發(fā)的命令就是下面這樣。
ssh -D 2121 user@host -N
下面是動(dòng)態(tài)端口轉(zhuǎn)發(fā)建立后的一個(gè)使用實(shí)例:
curl -x socks5://localhost:2121 http://www.example.com
上面命令中,curl 的 -x 參數(shù)指定代理服務(wù)器,即通過(guò) SOCKS5 協(xié)議的本地 2121 端口,訪問(wèn) http://www.example.com
。
多級(jí)端口轉(zhuǎn)發(fā)
端口轉(zhuǎn)發(fā)可以有多級(jí),以達(dá)到繞過(guò)多個(gè)防火墻的效果。比如建立兩個(gè)端口轉(zhuǎn)發(fā),第一個(gè)端口轉(zhuǎn)發(fā)的出口作為第二個(gè)端口轉(zhuǎn)發(fā)的入口,通過(guò)第二個(gè)端口轉(zhuǎn)發(fā)訪問(wèn)目標(biāo)主機(jī)目標(biāo)端口。
例如,本地主機(jī) A 想訪問(wèn) 目的主機(jī) D,但因?yàn)榉阑饓Φ南拗疲瑹o(wú)法直接連接,現(xiàn)在知道主機(jī) A 可以連接到服務(wù)器 B,而服務(wù)器 B 可以連接到服務(wù)器 C ,服務(wù)器 C 可以直接訪問(wèn)目標(biāo)主機(jī) D,在這種情況下,就可以建立兩級(jí)連接。
先在主機(jī) A 建立到服務(wù)器 B 的本地端口轉(zhuǎn)發(fā):
ssh -L 本地端口:localhost:2999 user_b@服務(wù)器 B ip 地址
這個(gè)命令在本地主機(jī) A 和 服務(wù)器 B 之間建立一個(gè)端口轉(zhuǎn)發(fā),2999 是服務(wù)器 B 上一個(gè)空閑的端口,localhost 表示服務(wù)器 B 接收到主機(jī) A 的請(qǐng)求后轉(zhuǎn)發(fā)到自己的 2999 端口。這個(gè)命令沒(méi)有加 -N 參數(shù),因?yàn)檫€需要登錄服務(wù)器 B 建立第二個(gè)端口轉(zhuǎn)發(fā)。
在登錄服務(wù)器 B 之后,建立服務(wù)器 B 經(jīng)過(guò)服務(wù)器 C 到目標(biāo)主機(jī) D 的端口轉(zhuǎn)發(fā):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-467847.html
ssh -L 2999:目標(biāo)主機(jī) D:目標(biāo)端口 user_c@服務(wù)器 C ip 地址 -N
這個(gè)命令將對(duì) 2999 端口的訪問(wèn)請(qǐng)求經(jīng)由服務(wù)器 C 轉(zhuǎn)發(fā)到目標(biāo)主機(jī) D。
這樣,最終就通過(guò)兩級(jí)端口轉(zhuǎn)發(fā)實(shí)現(xiàn)訪問(wèn)主機(jī) A 的端口相當(dāng)于訪問(wèn)目標(biāo)主機(jī) D 的目標(biāo)端口的效果。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467847.html
到了這里,關(guān)于SSH 端口轉(zhuǎn)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!