編者按:當學習教學需要,將線上教學平臺遷移到移動云上時,無法通過NAT 端口轉發。下面筆者將介紹如何在云主機上實現端口轉發的具體操作。
A 學校計劃將單位的在線教學平臺搬遷到移動云。在搬遷以前,A 學校用來30臺虛擬服務器搭建的在線教學平臺,這些服務器借助平臺的負載均衡和單位的防火墻,使整個平臺只需要一個出口,其它虛擬服務器提供的服務要么通過負載均衡進行端口轉發,要么通過防火墻的NAT 進行端口轉發。
搬遷到移動云后,A 學校租用了30 臺云主機,這些云主機構成一個私有網絡。租用了一個Internet 地址作為平臺的出口地址,A 學校把這個地址分配給了負責負載均衡的云主機上,其它云主機只要是采用HTTP 或HTTPS協議,都可以通過這臺負載均衡進行端口轉發,對外提供服務。
不過,還有很多服務沒有采用HTTP 或HTTPS 協議,無法通過負載均衡進行端口轉發。例如,教學資源上傳,教學資源下載和教學資源轉換等服務,原來是通過單位防火墻的NAT 功能進行的端口轉發,遷移到移動云以后,移動云平臺沒有提供NAT 功能,無法通過NAT 端口轉發。云主機怎樣才能實現端口轉發呢?
NAT的英文全稱是“Network Address Translat ion”(網絡地址轉換),其主要作用就是將私有地址轉換為合法的IP 地址(Internet地址),讓位于私有網絡的終端設備可以訪問外部網絡。比較典型的應用就是家用寬帶路由器,實際就是集NAT、交換機和DHCP 服務器于一體的網絡設備。盡管NAT讓位于私有網絡的終端設備可以訪問外部網絡,實現共享上網,但對于位于外部網絡的終端設備而言,訪問不到私有網絡內的終端設備。如果在私有網絡中的某臺設備上架設了服務,如Web服務或FTP 服務,想讓位于外部網絡的計算機訪問這些服務,可以在NAT 上做端口轉發。
NAT 不但可以實現網絡地址轉換,還可以實現端口轉發或端口映射,當外部網絡設備訪問NAT的某個端口時,NAT 將數據包轉發給內網對應的服務器,使外網設備實現了內網訪問。
在使用NAT的私有網絡中,常規的做法是讓NAT 設備充當私有網絡的默認網關,如家庭網絡,寬帶路由器的地址就是家庭網絡的默認網 關。在Windows Server上配置路由和遠程訪問NAT服務器時,NAT 服務器地址也是私有網絡的網關。
A 學校將在線教學平臺搬遷到云上以后,A 學校租用的只是云主機,只能使用云平臺提供商分配的網絡和IP 地址。A 學校無法調整30臺云主機的網絡架構,不能將分配Internet 地址的云主機上部署NAT 服務器,并將其作為其它云主機的默認網關。
不能調整云主機網絡架構,無法用NAT 做端口轉發,那能不能仿照硬件防火墻上那樣做端口轉發呢?筆者檢查了A 學校位于出口的那臺云主機,這臺云主機使用的使用Centos 7.2 操作系統,啟用的是iptables 防火墻,能否用iptables 轉發端口,需要進一步了解iptables的功能和基本用法。
iptables 嚴格說來不是真正的防火墻,而是一款工具。真正的防火墻是netfilter,它 是Linux的子系統之一,提供防火墻、網絡地址轉換、數據包記錄、流量統計等一系列功 能。iptables 只是控制netfilter 一款工具。netfilter 和iptables 合起來構成一個功能強大的防火墻。
netfilter 主要提供了filter(過 濾)表、NAT(網絡地址轉換)表和mangle(修改數據包標志位)表等三張表,每張表由若干鏈組成,鏈主要用來容納防火墻規則,默認有INPUT(入站處理)、OUTPUT(出站處理)、FORWARD(轉發處理)、POSTROUTING(路由轉發前的處理)和PREROUTING(路由轉發后的處理)等5 種數據包處理的規則鏈。
1.數據包到達防火墻以后,先進入mangle 表的PREROUTING 鏈,此時若有規則設置,防火墻按規則設定更改數據包的TOS 等信息。
2.數據包進入NAT 表的PREROUTING 鏈,此時若有如有規則設置,則按規則進行目的地址轉換。
3.數據包經過路由后,由路由判定該數據包是由本機處理還是轉發給其它計算機或其它網絡。

4.如果目的地為本機,數據包則會進入mangle 表的INPUT 鏈,經過處理,再進入filter 表的INPUT 鏈,經過相應的過濾,最后進入木機的處理進程。
5.如果是轉發,則先后按照以下順序進行處理:
(1)進入mangle 表的FORWARD 鏈,根據規則設置修改相應的參數。
(2)進入filter 表的FORWARD 鏈,根據規則設置進行過濾。
(3)進入filter 表的OUTPUT 鏈,根據規則設置進行過濾。
(3)進入mangle 表的POSTROUTING 鏈,根據規則設置修改相應的參數。
(4) 進入NAT 表的POSTROUTING 鏈,根據規則設置進行網絡地址轉換,修改數據包的源地址。
(5)最后將數據包轉發給目的計算機或外部網絡。
通過以上分析,無論防火墻netfilter/iptables 是否位于網關,數據包只要到達 netfilter/iptables,netfilter/iptables 都可以按照設定的規則來進行端口轉發。

圖1 測試環境
由于A 學校的的在線教學平臺是生產環境,不能在上面直接嘗試,于是筆者搭建了如圖1 所示測試環境。
其中,網絡192.168.143.0/24 代表云主機的私有網絡,網 絡172.16.5.0/24 代表外部網絡。服務器A 和服務器B 代表兩臺云主機,服務器C 代表外部網絡的計算機。服務器B 上有兩塊網卡,一塊連接私有網絡,一塊連接外部網絡。網絡192.168.143.0/24 和網絡172.16.5.0/24 之間沒有路由,相互之間不能通信。在服務器A 上部署FTP 服務,在用iptables 進行端口轉發前,服務器C 不能訪問服務器A 上的FTP 服務。在服務器B 上配置端口轉發后,如果服務器C 能訪問服務器A 上的FTP 服務,說明可以用iptables 進行端口轉發。
下面是基于上述測試環境,用iptables 實現端口轉發的具體過程:
CentOS 7 默認的防火墻不是iptables,而是firewa lld。如果不是新系統,可以使用命令“service iptables status”檢查當前系統是否已安裝iptables。
如果是新部署的Centos 7 或沒有安裝iptables,可以用命令“yum install iptables-services” 在 線安裝iptables。在線安裝iptables 時,需要連接互聯網。
也可以使用命令“yum install-y iptablesservices”安裝iptables,兩個命令的區別就是前者需要確認,后者安裝時自動確認,不需要人為干預。
iptables-services 是iptables的一個服務,在線安裝iptables-services 包時,若系統沒有安裝iptables包,會自動安裝iptables。如果用命令“yum install iptables”安裝iptables,還需要進一步安裝iptablesservices。
因iptables 與系統自帶的防火墻守護進程firewall d 有沖突。可以用命令“sys temctl stop firewalld”停用firewalld 服務。
為避免開機自動啟動firewalld 服 務,影 響iptables的啟動,可以用命令“systemctl mask firewalld”或“systemctl disable firewalld”禁 用firewalld服務。
這一步很重要,很多網管員或架構工程師在配置端口轉發不成功的主要原因忽略了啟用Linux的數據轉發功能。
默認情況下,Linux 是沒有啟用數據轉發功能的。可以使用命令sysctl 啟用數據轉發功能。sysctl 是一條設置或重新設置聯網功能的命令,如IP 轉發、IP 碎片去除以及源路由檢查等。
用命令“vi/etc/sysctl.conf”編輯系統內核參數文 件“sysctl.conf”,將 其中的參數“net.ipv4.ip_forward=0”更改為“net.ipv4.ip_forward=1”。如 果“sysctl.conf”文件中沒有此條參數,可以手動添加進去。
修 改“sysctl.conf”文件,啟用數據轉發功能后,用命令“sysctl-p”使修改的配置參數生效。
(1)用命令iptables 配置filter 表的FORWARD 鏈,允許轉發對應的數據包。
轉發源數據的命令如下:
iptables-A FORWARD-s 192.168.143.27/32-i ens224-p tcp-m tcp--sport 61021-j ACCEPT
這條命令表示允許轉發來自服務器B的數據包,其中服務器B的IP 地址是“192.168.143.27”,對應網絡接口是“ens224”,轉發的源端口是“61021”。
轉發目的數據的命令如下:
iptables-A FORWARD-d 192.168.143.27/32-o ens224-p tcp-m tcp--dport 61021-j ACCEPT
這條命令表示允許轉發到服務器B的數據,其中服務器B的IP 地址是“192.168.143.27”,對應網絡接口是“ens224”,轉發的目的端口是“61021”。
(2)用命令iptables 配置NAT 表的PREROUTING 鏈,將訪問服務器B的端口轉發給服務器A 對應的端口。
iptables-t nat-A PREROUTING-p tcp-m tcp--dport 61021-j DNAT--to-destination 192.168.143.28:61021
(3)用命令iptables 配置nat 表的POSTROUTING 鏈,將訪問服務器B的端口轉發給服務器A 對應的端口。
-A POSTROUTING-d 192.168.143.28/32-p tcp-m tcp--dport 61021-j SNAT--to-source 192.168.143.27
添加完防火墻規則后,用命令“service iptables save”保存防火墻規則。
如果需要轉發的端口數量比較多,可以使用“vi/etc/sysconfig/iptables”編輯iptables 防火墻規則文件。
例如,在本例中,為服務器A的FTP 服務配置的端口 是“61021-61026”,整 個iptables 防火墻規則配置文件如圖2 所示。
配置好防火墻規則以后,可以使用命令“systemctl start iptables.service”啟 動iptables 服 務,或 用命 令“systemctl restart iptables.service”重啟ipt ables 服務。
默認情況下,操作系統重新啟動后,不會啟動iptables服務,也就不能實現端口轉發。可以使用命令“systemctl enable iptables.service”將iptables 服務配置為開機啟動。

圖2 防火墻配置具體內容
配置好端口轉發后,在服務器C 上用命令“telnet 172.16.5.143 61021”嘗試能否打開端口,經測試,可以打開端口,說明端口轉發配置成功。
在文件資源管理器的地址欄輸入FTP 地址“ftp://172.16.5.145:61021”,提示輸入用戶名和密碼,輸入FTP的用戶名和密碼,可以打開FTP 共享目錄。
筆者在實驗環境完成iptables 端口轉發測試后,在A 學校出口那臺云主機上啟用數據轉發功能(命令“sysctl-p”),按照A 學校在線教學平臺需求配置iptables 規則。完成端口轉發配置后,經測試,位于云主機的在線教學平臺終于可以提供在線教學服務了。