ssh tunneling
微微介紹
ngrok

bottender
外網應該沒辦法直接找到在內網下的電腦...

port forwarding
ssh port forwarding

SSH (Secure Shell)
主要功能為建立電腦之間 (經過加密) 的 tunnel
- 遠端登入、下 command
- 檔案傳輸
- port forwarding
- ...
是一個協定 (約定)
什麼是 tunnel
HTTPS 也有加密
利用 HTTPS 溝通的話,可以算是 tunnel 嗎

HTTP/HTTPS 不被認為是 tunneling protocol
的原因可能是他主要不是被用來傳送別的協定
ssh
將其他應用層的協定封裝在負載部分
ssh 是基於 TCP 的
(大部分)
TCP 是另外一個協定
什麼是基於
layer 的概念
A
B
A 寄信給 B
樓層信件管理員
辦公室信件管理員
大樓信件管理員
郵局
樓層信件管理員
辦公室信件管理員
大樓信件管理員
郵局
郵差送信
layer 的概念
上層基於下層
A 和 B 的溝通是基於辦公室信件管理員的服務
辦公室信件管理員的服務是基於樓層信件管理員的服務
樓層信件管理員的服務是基於大樓信件管理員的服務
...
每一層知道下層幫他完成什麼跟他要幫上層完成什麼

基於

借會議室基於


網際網路協定套組



https://upload.wikimedia.org/wikipedia/commons/0/0f/Ssh_binary_packet_alt.svg
ssh 的 packet (data)

ssh 的 packet (data)
將其它應用層的協定 (例如 HTTP)
封裝在負載部分
tunnel
A
A1
B1
B
A 想要寄明信片給 B
但是他可能不想或是不能直接寄給他
A1 和 B1 就是 ssh connection 的兩端
server & client
A 把明信片寄給 A1
B1 拿到打開來
把明信片寄給 B
A 利用 A1 和 B1 間的「通道」來和 B 溝通
A1 把 A 的信包起來傳給 B1


因為訊息有加密,所以像「通道」
因為可以穿透,所以像「通道」

client - server 架構
3 個階段
- 確認 server、建立加密通道
- client 權限確認
- 在通道上做事情
1 確認 server
(server authentication)
可能會用 public key & private key
client 用 server 的 public key 加密一段訊息 傳給 server
server 解開來傳給 client 證明他有相對應的 private key
第一次的話有風險
client 要事先知道 server 的 public key
才能避免可能有人騙他
client 要確認自己有找對 server
1 建立加密通道
(key exchange)
雙方要協調出 shared secret (key) 跟 hash function
對稱加密 vs 非對稱加密
對稱加密 (shared secret)
用同一把 key 加解密
要想辦法讓參與的人知道 key
非對稱加密 (public key & private key)
用對方的 public key 加密
用自己的 private key 解密
public key 公開,private key 只有自己留著
非對稱加密
因為 public key 是公開的
public key 跟 private key 又有一定的關聯性
要達到跟 shared secret 差不多的強度
key 的長度需要長很多
所以加解密會慢很多
怎麼產生 shared secret 又不會被別人知道
Diffie-Hellman
2 client 權限確認
- public key 事先放在 server
- password
- 憑證
- ...
3 在通道上做事情
一個 ssh connection 下還有分 channel
可以同時做很多事
- 開 shell、下 command
- TCP port forwarding
- X forwarding
- ...

用 layer 的角度來看
ssh port forwarding
Appication
Client
Appication
Server
ssh
ssh
tunnel
Listen 端
Forward 端
local forwarding
Appication
Client
Appication
Server
ssh
client
tunnel
ssh
server
Local 端
Server 端
ssh -L [local_port]:[forward_to_host]:[forward_to_port] [ssh_user]@[ssh_host]
local forwarding
Appication
Client
Database
Server
ssh
client
tunnel
ssh
server
Local 端
Server 端
受保護的網路
但可以 ssh 到某一台
remote forwarding
Appication
Server
Appication
Client
ssh
client
tunnel
ssh
server
Local 端
Server 端
ssh -R [remote_port]:[forward_to_host]:[forward_to_port] [ssh_user]@[ssh_host]
remote forwarding
Appication
Server
Appication
Client
ssh
client
tunnel
ssh
server
Local 端
Server 端
私人網路
公開位址
VS Code Remote Develepment

只要可以 ssh 到遠端機器
就可以用遠端機器的資源來開發
(chi 介紹的)
如果我想要用公司的 mac mini 來開發...
就要 ssh 到 公司的 mac mini...
但是公司的 mac mini 沒有直接對外開 ssh 的 port...
VS Code Remote Develepment
mac mini
ssh
server
ssh
client
雲端 server
ssh
server
家裡電腦
ssh
client
remote
forwarding

local
forwarding
參考資料
Barrett, D. J. , & Silverman, R. E. (2001).
SSH, the Secure Shell: The definitive guide. Cambridge, MA: O’Reilly & Associates, Inc.
...
補充一下 ssh 的 MAC
message authentication code

TCP 的特性
已經可以保證資料完整性了?
還需要防止別人更改或亂丟訊息
或是重送攻擊
ssh tunneling
By luyunghsien
ssh tunneling
- 514