返回部落格

在 Linux 中使用 Iptables 進行連接埠轉發:實用指南

在 Linux 中使用 Iptables 進行連接埠轉發:實用指南

連接埠轉發,也稱為連接埠對映,是一種允許遠端裝置連線到您私有區域網路 (LAN) 內特定服務的方法。顧名思義,此程序涉及將特定連接埠的請求轉發到另一個連接埠或網路。它會在傳輸過程中修改封包的目的地,並被視為一種網路位址轉換 (NAT) 操作。

啟用連接埠轉發可以允許那些未與內部網路連線的裝置或主機互相存取,否則在停用時會受到限制。您可以利用連接埠轉發的好處來封鎖目標網站、提升安全性,並在方便時繞過 NAT 防火牆。

在本教學中,我們將引導您完成在 Linux 中使用 iptables 轉發連接埠的步驟。

先決條件

若要跟隨本教學,您將需要:

主機詳細資訊

首先,我們需要了解工作伺服器的介面和位址詳細資訊。讓我們檢查系統的網路介面:

您將會看到以下輸出:

在這裡,醒目提示的輸出顯示了兩個介面,第一個 eth0 分配給位址 192.51.100.45,而第二個 eth1 分配給位址 192.168.1.5。在這兩個介面中,一個是公有介面,另一個是私有介面。我們將執行一個指令來區分這兩者,並找出連接到您預設閘道器的公有介面。若要進行區分,請輸入:

您將會看到以下輸出:

本教學的虛擬數據

在本教學中,我們將使用虛擬位址和介面分配。您可以根據需要自由使用這些數據或替換它們。

網頁伺服器網路詳細資訊:

  • 公有 IP 位址: 203.0.113.2

  • 私有 IP 位址: 192.0.2.2

  • 公有介面: eth0

  • 私有介面: eth1

防火牆網路詳細資訊:

  • 公有 IP 位址: 203.0.113.15

  • 私有 IP 位址: 192.0.2.15

  • 公有介面: eth0

  • 私有介面: eth1

網頁伺服器設定

讓我們從網頁伺服器主機開始。首先,使用您的 sudo 使用者登入。

安裝 Nginx

首先,我們將安裝 Nginx 於我們的網頁伺服器主機上,並將其鎖定,使其僅接聽其私有介面。這將使我們的網頁伺服器僅在我們以正確方式設定連接埠轉發時才可用。

接下來,更新本地套件快取並使用 apt 下載並安裝 Nginx:

新增限制

在我們的網頁伺服器主機上安裝 Nginx 後,我們將鎖定它,以確保它僅接受來自私有介面的輸入,而不接受其他任何地方的輸入。此外,這將確保只有在連接埠轉發設定正確時,我們的網頁伺服器才會處於作用狀態。

若要新增限制,請開啟預設的伺服器區塊設定檔 /etc/nginx/sites-enabled/default 在您選擇的任何文字編輯器上(這裡我們使用 nano 文字編輯器),並輸入:

在輸出中,您會看到 listen 指令出現兩次:

Port Forwarding Nginx Default File

在本教學中,我們使用第一個指令來演示 IPv4 轉發。第二個針對 IPv6 配置的指令可以刪除。在 80 前面加上冒號和您網頁伺服器的私有 IP 位址,以通知 Nginx 僅從私有介面接收輸入。接下來,編輯該指令:

Port Forwarding Nginx Edited Default File

完成後,儲存並關閉檔案。在繼續之前,請確保沒有語法錯誤。讓我們測試該檔案:

Nginx T

如果您沒有看到顯示任何錯誤,就可以重新啟動 Nginx 並啟用新配置:

網路限制驗證

讓我們驗證我們對網頁伺服器的存取權限級別。嘗試使用私有介面並透過 curl 指令進行存取:

您將會看到輸出:

Port Forwarding Nginx Output1

如果我們嘗試使用公有介面,我們將無法連線:

這正是我們所預期的。

配置防火牆以轉發連接埠 80

讓我們繼續在防火牆機器上實作連接埠轉發。

在核心中啟用轉發

預設情況下,大多數系統的連接埠轉發功能是關閉的。我們將進行一些修改以開啟連接埠轉發。此外,還有一個選項可以使用 sudo 權限永久開啟連接埠轉發,如接下來的步驟所示。

要在核心層級開啟流量轉發,請輸入:

要永久開啟連接埠轉發,請編輯 /etc/sysctl.conf 檔案。使用 sudo 權限開啟檔案,並輸入:

在檔案內部,找到並取消註解如下所示的行:

完成後,儲存並關閉檔案。然後,使用 sysctl 指令來套用設定中的變更以使其生效:

基本防火牆設定

首先,請閱讀關於如何設定基本防火牆 的指南。完成後,您將擁有:

  • 已安裝 iptables-persistent
  • 已將預設規則集儲存至 /etc/iptables/rules.v4
  • 使用 iptables 指令新增和修改規則的全面知識

此外,您也可以參考如何列出和刪除 iptables 防火牆規則.

新增轉發規則

我們將配置防火牆,以確保流入我們公有介面( eth0 )上連接埠 80 的流量被轉發到我們的私有介面( eth1)。預設情況下,我們的基本防火牆將 FORWARD 鏈設定為 DROP 流量。新增防火牆規則將允許轉發連線到我們的網頁伺服器。為了增加安全性,我們將鎖定防火牆規則以僅允許轉發請求。

FORWARD 鏈中,我們將接受來自公有介面並前往私有介面、目的地為連接埠 80 的新連線。我們將藉助 conntrack 擴充功能來識別新連線,並以 TCP SYN 封包表示:

您需要允許由傳入連線產生的雙向後續流量。輸入以下指令以允許公有和私有介面之間的 ESTABLISHEDRELATED 流量:

讓我們驗證我們在 FORWARD 鏈上的策略是否已設定為 DROP:

到目前為止,我們已經新增了幾條規則,允許公共介面和私有介面之間的流量通過我們的防火牆。然而, iptables 尚未收到引導流量的通知,因為防火牆規則設定尚未完成。在接下來的步驟中,我們將新增 NAT 規則並調整永久規則集以引導流量。

新增 NAT 規則以引導封包

我們將執行兩個獨立的操作,以便讓 iptables 能夠正確修改封包,並簡化與用戶端和網頁伺服器之間的通訊。

DNAT 是啟動 PREROUTING 鏈的第一個操作,該鏈屬於 nat 表。該操作會修改封包的目的地位址,使其在網路之間傳輸時能夠被正確路由。然而,公共網路上的用戶端將連接到我們的防火牆伺服器,並且不會有關於我們私有網路拓撲的任何資訊。為了與私有網路傳遞資訊,請更改每個封包的目的地位址,以使其能夠正確到達我們的目的地網頁伺服器。

需要特別注意的是,我們專注於設定端口轉發。對到達防火牆的每個封包都執行 NAT 並不屬於本教學的範疇。我們將比對端口 80 的封包,並將其指向我們網頁伺服器的私有 IP 位址:

封包將被正確路由到我們的網頁伺服器,其中包含用戶端的原始位址作為來源位址。儘管伺服器嘗試直接向該位址發送回覆,但將無法建立合法的 TCP 連線。

為了設定正確的路由,我們將修改封包的來源位址。讓我們將來源位址編輯為我們防火牆伺服器的私有 IP 位址。修改後,回覆將被傳送回防火牆,然後由防火牆轉發回用戶端。

要啟用此功能,請在 POSTROUTING 鏈中新增一條規則,該鏈屬於 nat 表,並在封包傳送到網路之前進行評估。然後,透過 IP 位址和端口比對目的地為我們網頁伺服器的封包:

此規則生效後,我們應該可以透過將網頁瀏覽器指向我們防火牆機器的公共位址來存取我們的網頁伺服器:

您將看到以下輸出:

Nginx Output2

我們的端口轉發設定已完成。

調整永久規則集

完成端口轉發設定後,我們將其儲存到我們的永久規則集中。如果您想保留目前規則集中的註解,請使用 iptables-persistent 服務來儲存您的規則:

您也可以開啟它並手動編輯,以保留檔案中的註解:

接下來,設定 filter 表和 nat 表,以分別新增 FORWARD 鏈規則和 ROUTING 規則。調整 nat 表將允許我們新增 PREROUTINGPOSTROUTING 規則,如下例所示:

iptables

service

結論

若要進一步探索可在系統上實作的更多防火牆解決方案,請查看來自以下來源的資源:

我們的部落格

在 Ubuntu 18.04 上使用 UFW 設定防火牆

在 CentOS 7 上使用 FirewallD 設定防火牆UFW 基礎知識:學習基本的防火牆命令:

Happy Computing!

author

Pranay Kapgate

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的創意設計師,專注於透過傳統與創新行銷渠道建立一致的企業形象。他擅長將藝術願景與策略行銷相融合,創造具有影響力的品牌敘事。

留言

目前尚無留言。成為第一個留言的人吧。