連接埠轉發,也稱為連接埠對映,是一種允許遠端裝置連線到您私有區域網路 (LAN) 內特定服務的方法。顧名思義,此程序涉及將特定連接埠的請求轉發到另一個連接埠或網路。它會在傳輸過程中修改封包的目的地,並被視為一種網路位址轉換 (NAT) 操作。
啟用連接埠轉發可以允許那些未與內部網路連線的裝置或主機互相存取,否則在停用時會受到限制。您可以利用連接埠轉發的好處來封鎖目標網站、提升安全性,並在方便時繞過 NAT 防火牆。
在本教學中,我們將引導您完成在 Linux 中使用 iptables 轉發連接埠的步驟。
先決條件
若要跟隨本教學,您將需要:
- 已安裝 Ubuntu 於您的系統中。
- 兩台位於相同資料中心且已啟用私有網路.
- 在每台機器中設定了具有 sudo 權限的非 root 使用者帳戶 於每台機器中。
主機詳細資訊
首先,我們需要了解工作伺服器的介面和位址詳細資訊。讓我們檢查系統的網路介面:
|
1 |
ip -4 addr show scope global |
您將會看到以下輸出:
|
1 2 3 4 5 6 7 8 9 |
範例輸出 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
在這裡,醒目提示的輸出顯示了兩個介面,第一個 eth0 分配給位址 192.51.100.45,而第二個 eth1 分配給位址 192.168.1.5。在這兩個介面中,一個是公有介面,另一個是私有介面。我們將執行一個指令來區分這兩者,並找出連接到您預設閘道器的公有介面。若要進行區分,請輸入:
|
1 |
ip route show | grep default= |
您將會看到以下輸出:
|
1 2 3 |
輸出: ip route show | grep default |
本教學的虛擬數據
在本教學中,我們將使用虛擬位址和介面分配。您可以根據需要自由使用這些數據或替換它們。
網頁伺服器網路詳細資訊:
-
公有 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:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
新增限制
在我們的網頁伺服器主機上安裝 Nginx 後,我們將鎖定它,以確保它僅接受來自私有介面的輸入,而不接受其他任何地方的輸入。此外,這將確保只有在連接埠轉發設定正確時,我們的網頁伺服器才會處於作用狀態。
若要新增限制,請開啟預設的伺服器區塊設定檔 /etc/nginx/sites-enabled/default 在您選擇的任何文字編輯器上(這裡我們使用 nano 文字編輯器),並輸入:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
在輸出中,您會看到 listen 指令出現兩次:

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

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

如果您沒有看到顯示任何錯誤,就可以重新啟動 Nginx 並啟用新配置:
|
1 |
sudo service nginx restart |
網路限制驗證
讓我們驗證我們對網頁伺服器的存取權限級別。嘗試使用私有介面並透過 curl 指令進行存取:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
您將會看到輸出:

如果我們嘗試使用公有介面,我們將無法連線:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
這正是我們所預期的。
配置防火牆以轉發連接埠 80
讓我們繼續在防火牆機器上實作連接埠轉發。
在核心中啟用轉發
預設情況下,大多數系統的連接埠轉發功能是關閉的。我們將進行一些修改以開啟連接埠轉發。此外,還有一個選項可以使用 sudo 權限永久開啟連接埠轉發,如接下來的步驟所示。
要在核心層級開啟流量轉發,請輸入:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
要永久開啟連接埠轉發,請編輯 /etc/sysctl.conf 檔案。使用 sudo 權限開啟檔案,並輸入:
|
1 |
sudo nano /etc/sysctl.conf |
在檔案內部,找到並取消註解如下所示的行:
|
1 |
net.ipv4.ip_forward=1 |
完成後,儲存並關閉檔案。然後,使用 sysctl 指令來套用設定中的變更以使其生效:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
基本防火牆設定
首先,請閱讀關於如何設定基本防火牆 的指南。完成後,您將擁有:
- 已安裝 iptables-persistent
- 已將預設規則集儲存至 /etc/iptables/rules.v4
- 使用 iptables 指令新增和修改規則的全面知識
此外,您也可以參考如何列出和刪除 iptables 防火牆規則.
新增轉發規則
我們將配置防火牆,以確保流入我們公有介面( eth0 )上連接埠 80 的流量被轉發到我們的私有介面( eth1)。預設情況下,我們的基本防火牆將 FORWARD 鏈設定為 DROP 流量。新增防火牆規則將允許轉發連線到我們的網頁伺服器。為了增加安全性,我們將鎖定防火牆規則以僅允許轉發請求。
在 FORWARD 鏈中,我們將接受來自公有介面並前往私有介面、目的地為連接埠 80 的新連線。我們將藉助 conntrack 擴充功能來識別新連線,並以 TCP SYN 封包表示:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
您需要允許由傳入連線產生的雙向後續流量。輸入以下指令以允許公有和私有介面之間的 ESTABLISHED 和 RELATED 流量:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
讓我們驗證我們在 FORWARD 鏈上的策略是否已設定為 DROP:
|
1 |
sudo iptables -P FORWARD DROP |
到目前為止,我們已經新增了幾條規則,允許公共介面和私有介面之間的流量通過我們的防火牆。然而, iptables 尚未收到引導流量的通知,因為防火牆規則設定尚未完成。在接下來的步驟中,我們將新增 NAT 規則並調整永久規則集以引導流量。
新增 NAT 規則以引導封包
我們將執行兩個獨立的操作,以便讓 iptables 能夠正確修改封包,並簡化與用戶端和網頁伺服器之間的通訊。
DNAT 是啟動 PREROUTING 鏈的第一個操作,該鏈屬於 nat 表。該操作會修改封包的目的地位址,使其在網路之間傳輸時能夠被正確路由。然而,公共網路上的用戶端將連接到我們的防火牆伺服器,並且不會有關於我們私有網路拓撲的任何資訊。為了與私有網路傳遞資訊,請更改每個封包的目的地位址,以使其能夠正確到達我們的目的地網頁伺服器。
需要特別注意的是,我們專注於設定端口轉發。對到達防火牆的每個封包都執行 NAT 並不屬於本教學的範疇。我們將比對端口 80 的封包,並將其指向我們網頁伺服器的私有 IP 位址:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
封包將被正確路由到我們的網頁伺服器,其中包含用戶端的原始位址作為來源位址。儘管伺服器嘗試直接向該位址發送回覆,但將無法建立合法的 TCP 連線。
為了設定正確的路由,我們將修改封包的來源位址。讓我們將來源位址編輯為我們防火牆伺服器的私有 IP 位址。修改後,回覆將被傳送回防火牆,然後由防火牆轉發回用戶端。
要啟用此功能,請在 POSTROUTING 鏈中新增一條規則,該鏈屬於 nat 表,並在封包傳送到網路之前進行評估。然後,透過 IP 位址和端口比對目的地為我們網頁伺服器的封包:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
此規則生效後,我們應該可以透過將網頁瀏覽器指向我們防火牆機器的公共位址來存取我們的網頁伺服器:
|
1 |
curl 203.0.113.15 |
您將看到以下輸出:

我們的端口轉發設定已完成。
調整永久規則集
完成端口轉發設定後,我們將其儲存到我們的永久規則集中。如果您想保留目前規則集中的註解,請使用 iptables-persistent 服務來儲存您的規則:
|
1 |
sudo service iptables-persistent save |
您也可以開啟它並手動編輯,以保留檔案中的註解:
|
1 |
sudo nano /etc/iptables/rules.v4 |
接下來,設定 filter 表和 nat 表,以分別新增 FORWARD 鏈規則和 ROUTING 規則。調整 nat 表將允許我們新增 PREROUTING 和 POSTROUTING 規則,如下例所示:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/規則.v4 *filter # 預設允許所有傳出封包,但捨棄傳入和轉發封包 :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # 自訂特定協定鏈 :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # 可接受的 UDP 流量 # 可接受的 TCP 流量 -A TCP -p tcp --dport 22 -j ACCEPT # 可接受的 ICMP 流量 # 樣板允許策略 -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # 捨棄無效封包 -A INPUT -m conntrack --ctstate INVALID -j DROP # 將流量傳遞至特定協定的鏈 ## 僅允許新連線(已建立和相關的連線應該已經處理) ## 對於 TCP,另外僅允許新的 SYN 封包,因為這是唯一有效的 ## 建立新 TCP 連線的方法 -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # 拒絕所有落到此處的封包 ## 嘗試使用特定協定的拒絕訊息 -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # 將連接埠 80 轉發到我們網頁伺服器的規則 # 網頁伺服器網路詳細資訊: # * 公用 IP 位址:203.0.113.2 # * 私用 IP 位址:192.0.2.2 # * 公用介面:eth0 # * 私用介面:eth1 # # 防火牆網路詳細資訊: # # * 公用 IP 位址:203.0.113.15 # * 私用 IP 位址:192.0.2.15 # * 公用介面:eth0 # * 私用介面:eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 轉發過濾規則結束 # 提交變更 COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # 轉換公用介面連接埠 80 請求的規則 # 以便我們可以使用 # 私用介面正確轉發到網頁伺服器。 # 網頁伺服器網路詳細資訊: # * 公用 IP 位址:203.0.113.2 # * 私用 IP 位址:192.0.2.2 # * 公用介面:eth0 # * 私用介面:eth1 # # 防火牆網路詳細資訊: # # * 公用 IP 位址:203.0.113.15 # * 私用 IP 位址:192.0.2.15 # * 公用介面:eth0 # * 私用介面:eth1 A PREROUTING i -eth0 p -tcp dport -j DNAT --to 80 -destination --A-POSTROUTING 192.0.2.2 d -o eth1 -p 192.0.2.2 -tcp dport -j SNAT --to 80 -source --# 網頁伺服器流量的 NAT 轉換結束- 192.0.2.15 COMMIT security INPUT *ACCEPT :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :COMMIT [0:0] mangle PREROUTING *ACCEPT :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :COMMIT新增上述值後,儲存並關閉檔案。接下來,輸入以下命令以測試規則的語法: [0:0]
sudo iptables-restore -t < /etc/iptables/rules.v4 sudo |
iptables
|
1 |
t<-etc -iptables rules /v4/如果沒有看到任何錯誤,請載入規則集:/
sudo service iptables-persistent reload.sudo |
service
|
1 |
persistent reload讓我們驗證您的網頁伺服器是否仍可透過防火牆的公用 IP 位址存取:-
curl 203.0.113.15curl |
結論
|
1 |
由於此過程完全取決於您的網路安全和所使用的連接埠,因此它是安全的。如果您在網路上沒有安全防火牆或 VPN 安全防護,則可能會存在風險。因此,建議按照本教學中的討論來設定防火牆。我們希望本指南能幫助您在使用私有網路時在網際網路上保持安全。 203.0.113.15 |
若要進一步探索可在系統上實作的更多防火牆解決方案,請查看來自以下來源的資源:
我們的部落格
在 Ubuntu 18.04 上使用 UFW 設定防火牆
在 CentOS 7 上使用 FirewallD 設定防火牆UFW 基礎知識:學習基本的防火牆命令:
- 祝您電腦使用愉快!
- Setting Up a Firewall with FirewallD on CentOS 7
- The Basics of UFW: Learning the Essential Firewall Commands
Happy Computing!
留言
目前尚無留言。成為第一個留言的人吧。