連接埠對映是什麼意思?作用、設定方法與外部連接埠怎麼選
連接埠對映就是在出口的 NAT 裝置上寫一條規則:發到公網 IP 某個連接埠的連線,轉給內網某台主機的某個連接埠。內網伺服器只有私網位址,外網無法直接存取,做了對映,外部存取“公網 IP:連接埠”就能到達它。外部連接埠可以和內部不同,但要避開裝置自身佔用和運營商封鎖的連接埠,並且只對需要的來源開放。
連接埠對映是什麼意思?連接埠對映(Port Mapping)是在路由器、防火牆這類做 NAT 的出口裝置上配置的一條規則:凡是發到“公網 IP:外部連接埠”的連線,都改寫目標位址,轉給“內網 IP:內部連接埠”。比如出口公網 IP 是 203.0.113.10,內網 Web 伺服器是 192.168.10.20:443,配置一條“TCP 8443 → 192.168.10.20:443”的對映,外網使用者存取 203.0.113.10:8443,就開啟了這台內網伺服器上的網站。它在技術上叫目的位址轉換(DNAT),路由器介面裡常叫“虛擬伺服器”“連接埠轉發”,華為、H3C 防火牆上叫 NAT Server。連接埠對映的作用,是讓只有私網位址的伺服器能被外網存取,同時一個公網 IP 可以按連接埠分給多台內網主機使用。
為什麼 NAT 後面的伺服器要對映才能被存取
內網主機用的是 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 這類私網位址,公網上不路由。主機存取外網時,出口裝置做源位址轉換(SNAT),把源位址換成公網 IP,並在連線跟蹤表裡記下這條連線,回包按記錄轉回內網主機。這個過程是“裡面先發起”的,所以上網沒問題。
反過來,外網主動連 203.0.113.10:8443 時,出口裝置的連線表裡沒有任何記錄,不知道該交給內網哪台機器,只能丟棄或者當作存取自己。連接埠對映就是事先告訴它:這個連接埠的新連線,交給 192.168.10.20:443。
一次存取的位址變化如下:
| 階段 | 源位址:連接埠 | 目的位址:連接埠 |
|---|---|---|
| 外網使用者發出 | 198.51.100.7:51000 | 203.0.113.10:8443 |
| 出口裝置做 DNAT 後 | 198.51.100.7:51000 | 192.168.10.20:443 |
| 伺服器回包 | 192.168.10.20:443 | 198.51.100.7:51000 |
| 出口裝置還原後發出 | 203.0.113.10:8443 | 198.51.100.7:51000 |
從表裡可以看出兩個前提:
- 出口必須有真正的公網 IP。路由器 WAN 口的位址如果是 100.64.0.0/10(運營商級 NAT 專用段)或者 10.x、192.168.x 這類私網位址,說明上面還有一層 NAT,在自己的路由器上做對映不會生效。
- 回包必須經過同一台裝置。伺服器的預設閘道器要指向做對映的裝置,回包才能被還原。伺服器有兩個出口時,回包從另一個出口出去,源位址沒被改回 203.0.113.10:8443,客戶端會直接丟掉。
正因為回包本來就經過出口裝置,標準的連接埠對映不需要改源位址,伺服器日誌裡看到的是使用者的真實 IP。這一點和中轉機上的連接埠轉發不同,後者通常要同時做 SNAT,伺服器看到的是中轉機的位址。
連接埠對映常見的用途:在辦公室或家裡釋出網站、NAS、監控錄影機;在公司出口把幾台內網伺服器的服務用一個公網 IP 釋出出去;雲上多台沒有公網 IP 的例項共用一個 NAT 閘道器對外服務;NAT 方式的 VPS 由商家按連接埠分給使用者。
連接埠對映怎麼設定:三類裝置的寫法
路由器與企業防火牆
家用和小型辦公路由器在管理頁面裡設定,選單名稱因品牌而異,常見的有“虛擬伺服器”“連接埠轉發”“NAT 規則”。要填的欄位大同小異:
| 欄位 | 填什麼 |
|---|---|
| 外部連接埠 | 公網上存取用的連接埠,例如 8443;可以填範圍 |
| 內部 IP | 內網伺服器位址,例如 192.168.10.20 |
| 內部連接埠 | 服務實際監聽的連接埠,例如 443 |
| 協議 | TCP、UDP 或全部 |
| WAN 介面 | 多線路出口時選從哪條線進來 |
內網伺服器的位址要固定,用靜態 IP 或在路由器上做 DHCP 位址保留;否則重啟後換了位址,對映就指向了別的裝置。家裡如果是“光貓撥號、路由器再接光貓”的兩級結構,路由器 WAN 口拿到的是光貓分的私網位址,要麼在光貓上再對映一次到路由器,要麼把光貓改成橋接、由路由器撥號。
企業防火牆用命令配置。華為 USG 系列防火牆:
nat server web8443 protocol tcp global 203.0.113.10 8443 inside 192.168.10.20 443 no-reverse
no-reverse 表示只做外到內的對映,不額外生成內網主機主動外出時的反向轉換。配好之後還要寫一條安全策略放行這條流量,策略裡的目的位址要寫轉換後的內網位址 192.168.10.20,而不是公網位址,因為防火牆先做 NAT Server 轉換、再匹配安全策略。
思科 IOS 路由器:
interface GigabitEthernet0/0
ip nat outside
interface GigabitEthernet0/1
ip nat inside
exit
ip nat inside source static tcp 192.168.10.20 443 203.0.113.10 8443
同一台內網主機對映多個連接埠時,規則末尾要帶 extendable 關鍵字。各型號的具體語法以裝置版本的命令手冊為準。
Linux 閘道器:iptables DNAT
Linux 做出口閘道器時(eth0 接公網 203.0.113.10,eth1 接內網 192.168.10.0/24),把外部 8443 對映到 Web 伺服器的 443,再把外部 2222 對映到它的 SSH,並且只允許維運網段 198.51.100.0/24 存取:
sysctl -w net.ipv4.ip_forward=1 # 長期生效要寫進 /etc/sysctl.d/ 下的配置檔案
# 改目的位址:8443 → 192.168.10.20:443
iptables -t nat -A PREROUTING -i eth0 -d 203.0.113.10 -p tcp --dport 8443 \
-j DNAT --to-destination 192.168.10.20:443
# 2222 → 192.168.10.20:22,只對維運網段生效
iptables -t nat -A PREROUTING -i eth0 -s 198.51.100.0/24 -d 203.0.113.10 -p tcp --dport 2222 \
-j DNAT --to-destination 192.168.10.20:22
# 放行轉發:這裡寫轉換後的位址和連接埠
iptables -A FORWARD -i eth0 -o eth1 -d 192.168.10.20 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -s 198.51.100.0/24 -d 192.168.10.20 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
內網伺服器的預設閘道器是 192.168.10.1(這台 Linux),回包自然經過它,由連線跟蹤自動把源位址改回 203.0.113.10:8443,不需要再寫 SNAT。用 iptables -t nat -L PREROUTING -n -v 看規則前面的包計數在不在漲,就知道外部存取有沒有命中。規則重啟後會丟失,要用發行版的方式儲存。
還有一個常被問到的現象:外網能存取,內網用公網位址存取卻不通。內網的電腦 192.168.10.50 存取 203.0.113.10:8443,請求被 DNAT 到 192.168.10.20,但伺服器發現客戶端和自己在同一網段,直接回包給 192.168.10.50;電腦等的是 203.0.113.10 的回包,收到一個陌生位址發來的包,連線建不起來。這叫 NAT 迴流(Hairpin NAT)問題,解決辦法是在內網側也做 DNAT,同時把源位址換成閘道器,讓回包繞回閘道器:
iptables -t nat -A PREROUTING -i eth1 -d 203.0.113.10 -p tcp --dport 8443 \
-j DNAT --to-destination 192.168.10.20:443
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.10.0/24 -d 192.168.10.20 -p tcp --dport 443 \
-j MASQUERADE
iptables -A FORWARD -i eth1 -o eth1 -d 192.168.10.20 -p tcp --dport 443 -j ACCEPT
另一種辦法是內網 DNS 把域名直接解析到 192.168.10.20,內網使用者就不經過對映了。
雲平台的 NAT 閘道器
雲上的例項只有私網位址時,在 NAT 閘道器上新增 DNAT 條目(不同平台叫連接埠對映、連接埠轉發或 DNAT 規則),欄位基本一致:
| 欄位 | 範例 | 說明 |
|---|---|---|
| 公網 IP | 203.0.113.30 | 繫結在 NAT 閘道器上的彈性公網 IP |
| 公網連接埠 | 8443 | 外部存取用的連接埠 |
| 私網 IP | 172.16.0.20 | 例項的內網位址 |
| 私網連接埠 | 443 | 例項上服務監聽的連接埠 |
| 協議 | TCP | UDP 要另加一條 |
配完還要在例項的安全組裡放行私網連接埠 443,來源按需要限制。是否需要把子網路由指向 NAT 閘道器、例項另外綁了彈性公網 IP 時 DNAT 是否生效,各平台規則不同,以平台文件為準;也不是所有云平台的 NAT 閘道器都支援 DNAT,有的只做出方向的 SNAT。只有一台例項要對外服務時,直接給它綁彈性公網 IP 更簡單;多台例項共用一個公網 IP,才需要用 NAT 閘道器按連接埠分。
外部連接埠怎麼選:連接埠隨便設嗎
外部連接埠的取值範圍是 1–65535,技術上大部分都能用,但下面幾條決定了“能用”和“好用”的區別:
- 給公眾用的服務儘量用標準連接埠。網站用 80 和 443,存取時不用在網址裡帶連接埠號;郵件的 25 連接埠是協議約定,對方伺服器只會連 25,不能改。
- 避開出口裝置自己佔用的連接埠。路由器管理頁面常用 80、443、8080,防火牆的 SSL VPN 常用 443,Linux 閘道器自己的 SSH 是 22。對映了同一個連接埠,要麼規則不生效,要麼把自己的管理入口擋在外面。
- 家庭寬頻避開被封鎖的連接埠。不少家庭寬頻封鎖入方向的 80、443、8080 等連接埠,具體以運營商為準,這時改用 8443、18080 這類連接埠。
- 網頁服務避開瀏覽器攔截的連接埠。Chrome 會拒絕存取 6000、6665–6669、10080 等連接埠並報
ERR_UNSAFE_PORT,Firefox 也有類似的攔截列表,對映本身沒問題,瀏覽器就是不開啟。 - 同一個公網 IP、同一種協議的一個連接埠,只能對映給一台主機。TCP 8443 和 UDP 8443 是兩個連接埠,可以分給不同的主機。
- 換個冷門連接埠不等於安全。掃描器會掃遍全部 65535 個連接埠,把 22 改成 2222 只能減少一些自動化的撞庫日誌。SSH、3389、資料庫連接埠對映出去,必須加來源限制或改用 VPN。
選好之後,把每條對映記成一張表:公網 IP、外部連接埠、協議、內網 IP、內部連接埠、用途、負責人、來源限制。半年後沒人記得 18080 為什麼開著,是對映規則越積越多、最終出事的常見原因。
連接埠對映和連接埠轉發、DMZ 的區別
| 名稱 | 做什麼 | 伺服器看到的來源位址 | 適用場景 |
|---|---|---|---|
| 連接埠對映(DNAT、虛擬伺服器、NAT Server) | 公網 IP 的指定連接埠轉給內網主機的指定連接埠 | 使用者真實 IP | 出口裝置上釋出內網服務 |
| 連接埠轉發 | 泛指把某個連接埠收到的流量轉到別處,包括連接埠對映、中轉機轉發、SSH 隧道、使用者態轉發程式 | 視實現而定,使用者態轉發和做了 SNAT 的,看到的是轉發機的位址 | 線路中轉、跳板存取 |
| DMZ 主機 | 公網 IP 上沒被佔用的全部連接埠都轉給一台內網主機 | 使用者真實 IP | 家用路由器圖省事的做法,主機完全暴露,不建議 |
| 一對一 NAT(靜態 NAT) | 一個公網 IP 整體對應一個內網 IP | 使用者真實 IP | 出口有多個公網 IP 時,給一台伺服器獨佔一個 |
| 內網穿透 | 內網客戶端主動連出,公網伺服器經隧道反向轉發 | 穿透客戶端的位址 | 出口沒有公網 IP |
日常說話裡“連接埠對映”和“連接埠轉發”經常混用,路由器介面裡兩個詞指的也常是同一個功能。伺服器需要看到使用者真實 IP(日誌、存取控制、風控)時,要用出口裝置上的 DNAT,而不是使用者態的轉發程式。
連接埠對映軟體
所謂連接埠對映軟體,大多是在一台機器上監聽連接埠、再把連線轉到另一個位址的使用者態程式,適合臨時使用或者沒有出口裝置許可權的場景:
# Windows 自帶的 portproxy,只支援 TCP,依賴 IP Helper 服務
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8443 connectaddress=192.168.10.20 connectport=443
netsh interface portproxy show all
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8443
# Linux 上用 socat 臨時轉發一個 TCP 連接埠
socat TCP-LISTEN:8443,fork,reuseaddr TCP:192.168.10.20:443
長期使用還可以選 rinetd、HAProxy、Nginx 的 stream 模組。這些程式在本機監聽連接埠,所以本機防火牆要放行監聽連接埠,也要避開系統的臨時連接埠範圍(Linux 預設 32768–60999,Windows 預設 49152–65535)。另外,路由器上的 UPnP 功能會讓內網程式自動給自己開對映,伺服器所在的網路建議關閉它,所有對映都由管理員手工配置、登記。
對映了還是存取不通,按這個順序查
| 順序 | 檢查什麼 | 怎麼查 |
|---|---|---|
| 1 | 是不是在內網測的 | 用手機流量或外部伺服器測試:nc -zv 203.0.113.10 8443,Windows 用 Test-NetConnection 203.0.113.10 -Port 8443;內網測不通可能只是 NAT 迴流問題 |
| 2 | 出口是不是真公網 IP | 對比路由器 WAN 口位址和對外顯示的公網 IP,不一致或者是 100.64.x.x,就是上面還有 NAT |
| 3 | 服務有沒有監聽在對的位址 | 伺服器上 ss -tlnp 看監聽位址,只監聽 127.0.0.1 的服務外部永遠連不上 |
| 4 | 伺服器本機防火牆 | 放行的是內部連接埠 443,不是外部連接埠 8443 |
| 5 | 伺服器的預設閘道器 | 必須指向做對映的裝置,多網路卡、多出口時最容易出錯 |
| 6 | 規則是否命中 | 協議選對沒有、內網 IP 有沒有變;Linux 看 nat 表計數,防火牆看會話表 |
| 7 | 運營商是否封了連接埠 | 換一個外部連接埠再測,換了就通,基本可以確定是封鎖 |
在管理系統裡怎麼落地
IDC 機房裡,客戶的伺服器通常直接配公網 IP,不需要連接埠對映;最容易出現的“對映”反而是不該做的那種:為了遠端處理故障,把伺服器 BMC 的 Web、遠端控制檯連接埠對映到公網。BMC 擁有整台伺服器的控制權,暴露在公網上風險很高。Toplink DCIM 的做法是 BMC 接入獨立的管理網路,由部署在各機房的 DCIM 從節點就近連線,維運人員只存取 DCIM 後台,在 IPMI 遠端管理裡開啟瀏覽器控制檯,不需要為任何 BMC 連接埠做對映。BMC 用的位址段可以在 IP 位址管理裡標記為 IPMI 型別,與公網 IP、客戶內網分開登記和統計。
常見問題
寬頻的公網 IP 隔一段時間就變,對映還能用嗎?
路由器上的對映規則跟著 WAN 口走,公網 IP 變了規則照樣生效,變的只是外部存取的位址。在路由器上開啟 DDNS(動態域名),讓一個域名自動跟隨當前的公網 IP,外部改用域名存取即可。
UDP 連接埠也能對映嗎?
能,但 TCP 和 UDP 是兩套連接埠,要分別寫規則。遊戲、語音、部分 VPN 服務兩種協議都要用,路由器介面裡協議選“全部”或“TCP+UDP”,iptables 則各寫一條。
沒有公網 IP,外網還能存取內網服務嗎?
可以向運營商申請公網 IP;存取雙方都有 IPv6 時可以直接用 IPv6 位址存取,但要在光貓或路由器上放行入方向的連線;也可以用內網穿透,經一台有公網 IP 的伺服器反向轉發。