月份: 2019 年 12 月

Virtualbox port forwarding

No Comments

通訊埠轉向 - Port Forwarding

虛擬機器內的作業系統也要有網路卡才能使用網路,我們一般使用 virtualbox 提供的以 NAT 的方法模擬出來的虛擬網路卡,其 ip 是區域性的而且主機不可知/不在同一網域,也沒有橋接器。

往後我們簡稱主機為 host (機),虛擬機器為 client (機)。

因此,client 只能”主動向外“地使用(主機所擁有的)網路資源而無法“被動向內”地處理網路訊息。即,client 可以主動地存取與溝通網際網路,但卻無法被動地讓網際網路存取與溝通。為了突破這項限制,virtualbox 提供了 port forwarding 機制;通訊埠前饋/埠映射。

也就是 virtualbox 可幫我們在 host port A 與 client port B 這兩點之間建立通道。

假設建立通道 host port,編號 10,及 client port 100,那麼我從 host:10 丢入 3,即可在 client:100 收到 3。

直接切入主題來講,http 網站使用 80 和 443 port,這是在主機上的。在這兩個 port 未被使用的前提之下,我讓 virtual box 替我們建立 host:80 <–> client:80 及 host:443 <–> client:443。那麼之後,http 網際網路透過 host:80 和 host:443 在我們主機上存取網頁,實際上就已被導到 client:80,client:443,也就是虛擬機器內的 web server 的網頁內容。以上,本文的主題就談完了。

不過天不從人願,virtualbox 無法使用主機上的 編號 1 到 1024 的埠。因此,我們只能例如 host:1025 <–> client:80 及 host:1026 <–> client:443。那豈不是白搭,host 的 80/443 是我們唯一的來源啊(http(s) 的門戶啊)。

解決的方式筆者知道兩種:

一。 主機上使用 caddy web server 提供的 reverse proxy 功能,將 host:80/host:443 轉向到 host:1025/host:1026,再由 virtualbox port forwarding

二。Linux 系統便已提供內部的埠/本地埠之間,的映射指令。以下兩行指令便可完成所求。再由 virtualbox port forwarding

  • sudo socat TCP4-LISTEN:80,fork TCP4:localhost:1025 &
  • sudo socat TCP4-LISTEN:443,fork TCP4:localhost:1026 &

請注意執行後埠便被佔用。要釋放就是結束上面指令的背景執行。下 fg 可拉回前景。

下命令:ps aux | grep socat,查看它的 pid 再把它 kill 掉。

或是一個命令一個終端來執行。要釋放埠就 ctrl-c 結束執行。

Virtualbox 的 port forwarding 設置也很簡單,按圖施工。開啟該 VM 的設定,找到啟用的網路卡,新增兩條連接埠轉送 rules,名稱可自訂。Client 埠需是 80/443,host 埠可自訂大於 1024 的,但要跟主機的本地埠轉送目的地一致。

最後,可以很輕易地實測:

  • 先從 virualbox 建立 host:1028 到 client:1111port forwarding
  • 建立主機本地埠 host:1027 <–> host:1028 的轉送通道 sudo socat TCP4-LISTEN:1027,fork TCP4:localhost:1028
  • 建立本機輸出入窗口 1027 埠 netcat localhost 1027
  • 建立 client 的 1111 埠傾聽窗口 netcat -l -p 1111
  • Host enter 9 結果 client 出現 9
PHP Code Snippets Powered By : XYZScripts.com