# 穿牆術
如何在受防火牆限制的環境下提供服務
---
## 基本概念介紹
----
防火牆
* 限制連入連出
* 在這裡以限制 IP:port 的類型為主
----
要介紹的穿牆層級
- 應用層:SSH、其他程式
- L3:VPN
- L2:*略*
----
穿牆方法
* 開洞(建立 Tunnel)
* Proxy
* Relay
---
### SSH Tunnel
透過 SSH 協定轉送來自其他 port 的流量(TCP)
----
適用情境
* 其他 port 被封鎖
* 任何一方的機器有開放 SSH
* Public IP
----
Tunnel 類型
* Local
* 遠端服務映射至本機 Port
* Remote
* 本機服務映射至遠端 Port
* Dynamic
* SOCKS Proxy
----
Local Tunnel
將遠端主機的服務透過隧道對應到本機,常用於連回 Lab 進行開發
```
ssh -L <local port>:<target ip>:<target port> user@domain
```
* `<local port>`: 本機提供的埠口
* `<target ip>:<target port>`: 要連線到的遠端主機 IP 與對應埠口
* 可以將其作為跳板連接
* 例:無線路由器 Web UI (192.168.0.1:80)
----
Remote Tunnel
將本機的流量透過隧道傳輸到遠端主機,常用於需要公開 Demo 時
```
ssh -R <target port>:<local ip>:<local port> user@domain
```
* `<target port>`: 遠端主機服務的埠口
* `<local ip>:<local port>`: 要連線到的本機 IP 與對應埠口
----
Dynamic Tunnel
動態意指不是從固定伺服器的流量,通常當 Proxy 使用
```
ssh -D <port> user@domain
```
* `<port>`: 要對應到的本機埠口
接著就可以將 Client 設定 SOCKS 連線使用 Proxy
---
以上前提是必須**其中一端有 Public IP**
----
沒有的話......
需要 Relay Server(透過有公開 IP 的中間人)
* A <---> B
* A <---> Relay <---> B
---
相關服務與軟體
* [ngrok](https://ngrok.com)
* [cloudflare tunnel](https://developers.cloudflare.com/pages/how-to/preview-with-cloudflare-tunnel/)
---
現場 Demo(?)
---
長期跨域內網?
* VPN
* Wireguard
* SSL VPN: OpenVPN
---
More
* 軟體:Tor
* L3: Wireguard
* L2: ZeroTier
To be continue......
{"metaMigratedAt":"2023-06-16T21:15:55.110Z","metaMigratedFrom":"Content","title":"穿牆術","breaks":true,"contributors":"[{\"id\":\"640dcc6d-b761-4cd0-95c7-20bb26add618\",\"add\":1511,\"del\":115}]"}