突破校園限制!Kali on Docker × SSH Tunnel × Nginx Reverse Proxy × Cloudflare 打造遠端 Kali Linux 實戰環境

專案背景與目標

資安社在教授駭客技術時,面臨一個關鍵挑戰:大部分學員無法攜帶電腦進行實作練習,導致無法實際操作基礎的 Kali Linux 系統。為解決此問題,本專案透過自架伺服器並運行多個 Docker 容器來提供遠端 Kali Linux 環境。由於校園網路限制大多數埠口,需要將所有 Docker 容器的流量統一導向 80 埠口。

專有名詞說明

  • Kali Linux: 基於 Debian 的 Linux 發行版,預裝多種資訊安全與滲透測試工具,專為資安專業人員設計。
  • Docker: 開源的容器化平台,允許將應用程式與其依賴項打包成獨立的容器,實現輕量級虛擬化。
  • SSH (Secure Shell): 一種加密的網路協議,用於安全地遠端登入和檔案傳輸。
  • Proxy: 代理伺服器,作為客戶端和目標伺服器之間的中介,轉發請求和回應。
  • Nginx: 高性能的 Web 伺服器軟體,常用於反向代理、負載平衡和 Web 加速。
  • DNS (Domain Name System): 將域名轉換為 IP 地址的網路服務系統。

技術實作流程

1. SSH 遠端管理設定

首先建立安全的遠端管理環境:

  • 在家中路由器設定 port forwarding:將 public IP 的 2222 埠口映射至伺服器的 22 埠口
  • 加強 SSH 安全性設定:
    • 停用密碼登入,僅允許 SSH 金鑰認證
    • 修改 /etc/ssh/sshd_config 設定:​​​​
      PubkeyAuthentication yes ​​​​
      PasswordAuthentication no
  • SSH 金鑰結構:
    ​​~/.ssh/ ​​
    ├── authorized_keys
    ​​├── id_rsa
    ​​├── id_rsa.pub ​​
    ├── known_hosts ​​
    └── known_hosts.old

2. SSH Tunnel 與 Proxy 設定

SSH 連線指令:

ssh -i server_ssh_id_rsa kali@IP -p 2222 -D 9050

設定說明:

  • -i 用 id_rsa
  • -p 指定端口
  • -D 啟動一個本地 SOCKS 代理伺服器
  • ProxyChains: SSH 主要是用來進行命令行交互的,但是當需要在遠端伺服器上進行一些如設定 router port fowording ,直接通過終端無法滿足這些需求。這時候,利用 proxychains 來將流量通過你已經建立的 SSH 連線進行轉發,從而實現對流量的控制。
  • EX: proxychains firefox,透過這樣開起來的 firefox 就可以在遠端透過 SSH 流量,訪問內網,因此就可以去到 router 設定頁面去設定 port forwording

3. Docker 容器部署

image
使用 kalilinux-docker 專案建立多個 Kali Linux 環境:

  • 建立多個容器目錄:
    ​​kalilinux-docker0/ 到 kalilinux-docker10/
​​┌──(kali㉿kali)-[~/kali_pc] 
​​└─$ l ​​
kalilinux-docker/ kalilinux-docker2/ kalilinux-docker6/ nginx/ ​​
kalilinux-docker0/ kalilinux-docker3/ kalilinux-docker7/ note.txt ​​
kalilinux-docker1/ kalilinux-docker4/ kalilinux-docker8/ setup.sh* 
​​kalilinux-docker10/ kalilinux-docker5/ kalilinux-docker9/ unset.sh*
  • 自動化部署腳本(setup.sh):
​​for i in $(seq 0 10) ​​do ​​ cd "kalilinux-docker$i" && docker-compose up -d ​​ cd .. ​​done
  • ./setup.sh 執行起來
┌──(kali㉿kali)-[~/kali_pc]
└─$ ./setup.sh
[+] Running 2/2
 ✔ Network kalilinux-docker0_default        Created                   0.1s
 ✔ Container kalilinux-docker0-kalilinux-1  Started                   0.3s
[+] Running 2/2
 ✔ Network kalilinux-docker1_default        Created                   0.1s
 ✔ Container kalilinux-docker1-kalilinux-1  Started                   0.3s
[+] Running 2/2
 ✔ Network kalilinux-docker2_default        Created                   0.0s
 ✔ Container kalilinux-docker2-kalilinux-1  Started                   0.3s
[+] Running 2/2
 ✔ Network kalilinux-docker3_default        Created                   0.1s
 ✔ Container kalilinux-docker3-kalilinux-1  Started                   0.3s
[+] Running 2/2
 ✔ Network kalilinux-docker4_default        Created                   0.1s
 ✔ Container kalilinux-docker4-kalilinux-1  Started                   0.4s
[+] Running 2/2
 ✔ Network kalilinux-docker5_default        Created                   0.1s
 ✔ Container kalilinux-docker5-kalilinux-1  Started                   0.4s
[+] Running 2/2
 ✔ Network kalilinux-docker6_default        Created                   0.1s
 ✔ Container kalilinux-docker6-kalilinux-1  Started                   0.6s
[+] Running 2/2
 ✔ Network kalilinux-docker7_default        Created                   0.1s
 ✔ Container kalilinux-docker7-kalilinux-1  Started                   0.8s
[+] Running 2/2
 ✔ Network kalilinux-docker8_default        Created                   0.1s
 ✔ Container kalilinux-docker8-kalilinux-1  Started                   0.8s
[+] Running 2/2
 ✔ Network kalilinux-docker9_default        Created                   0.1s
 ✔ Container kalilinux-docker9-kalilinux-1  Started                   0.8s
[+] Running 2/2
 ✔ Network kalilinux-docker10_default        Created                  0.2s  
 ✔ Container kalilinux-docker10-kalilinux-1  Started                  1.0s

4. Nginx 反向代理設定

配置 Nginx 使所有容器通過 80 埠口訪問:

server {
    listen 80;
    server_name kali0.chengyunpu.com;
    location / {
        proxy_pass http://127.0.0.1:8000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

#剩下的以此類推
  • listen 80:監聽 HTTP 80 埠。
  • server_name:指定子域名(例如 kali0.chengyunpu.com)。
  • proxy_pass:反向代理到容器的指定 Port(如 8000)。

5. DNS 設定與 Cloudflare 整合

在 Cloudflare 上設定 DNS A 記錄,將各個子網域(kali0~kali10.chengyunpu.com)指向家中 public IP。
image

Cloudflare 優勢:

  • 提供 CDN 服務加速訪問
  • DDoS 防護功能
  • SSL/TLS 加密支援
  • DNS 管理介面直觀易用

結論

透過以上設定,成功建立了一個可供多人同時使用的 Kali Linux 實作環境,解決了學員無法攜帶設備的問題。該系統具有以下特點:

  • 安全的遠端管理機制
  • 統一的 80 埠口訪問
  • 可擴展的容器化架構
  • 方便的子網域存取方式
  • 完整的安全防護體系

實際使用

image

後續改進

後來發現更好的方法,直接用 cloudflare tunnel ,只要在電腦裝好 tunnel ,就可以在不用有 public ip 的情況下去使用,更是不用麻煩的設定 host 跟 router 的端口映射,重點是把原本不能用 https 這點給補上,原本的如果強制上 https 很大機率會爛掉無法使用 websocket 連線會有問題,現在全部改用 tunnel 方便安全又簡潔。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端