編者按:當(dāng)學(xué)習(xí)教學(xué)需要,將線上教學(xué)平臺(tái)遷移到移動(dòng)云上時(shí),無法通過NAT 端口轉(zhuǎn)發(fā)。下面筆者將介紹如何在云主機(jī)上實(shí)現(xiàn)端口轉(zhuǎn)發(fā)的具體操作。
A 學(xué)校計(jì)劃將單位的在線教學(xué)平臺(tái)搬遷到移動(dòng)云。在搬遷以前,A 學(xué)校用來30臺(tái)虛擬服務(wù)器搭建的在線教學(xué)平臺(tái),這些服務(wù)器借助平臺(tái)的負(fù)載均衡和單位的防火墻,使整個(gè)平臺(tái)只需要一個(gè)出口,其它虛擬服務(wù)器提供的服務(wù)要么通過負(fù)載均衡進(jìn)行端口轉(zhuǎn)發(fā),要么通過防火墻的NAT 進(jìn)行端口轉(zhuǎn)發(fā)。
搬遷到移動(dòng)云后,A 學(xué)校租用了30 臺(tái)云主機(jī),這些云主機(jī)構(gòu)成一個(gè)私有網(wǎng)絡(luò)。租用了一個(gè)Internet 地址作為平臺(tái)的出口地址,A 學(xué)校把這個(gè)地址分配給了負(fù)責(zé)負(fù)載均衡的云主機(jī)上,其它云主機(jī)只要是采用HTTP 或HTTPS協(xié)議,都可以通過這臺(tái)負(fù)載均衡進(jìn)行端口轉(zhuǎn)發(fā),對(duì)外提供服務(wù)。
不過,還有很多服務(wù)沒有采用HTTP 或HTTPS 協(xié)議,無法通過負(fù)載均衡進(jìn)行端口轉(zhuǎn)發(fā)。例如,教學(xué)資源上傳,教學(xué)資源下載和教學(xué)資源轉(zhuǎn)換等服務(wù),原來是通過單位防火墻的NAT 功能進(jìn)行的端口轉(zhuǎn)發(fā),遷移到移動(dòng)云以后,移動(dòng)云平臺(tái)沒有提供NAT 功能,無法通過NAT 端口轉(zhuǎn)發(fā)。云主機(jī)怎樣才能實(shí)現(xiàn)端口轉(zhuǎn)發(fā)呢?
NAT的英文全稱是“Network Address Translat ion”(網(wǎng)絡(luò)地址轉(zhuǎn)換),其主要作用就是將私有地址轉(zhuǎn)換為合法的IP 地址(Internet地址),讓位于私有網(wǎng)絡(luò)的終端設(shè)備可以訪問外部網(wǎng)絡(luò)。比較典型的應(yīng)用就是家用寬帶路由器,實(shí)際就是集NAT、交換機(jī)和DHCP 服務(wù)器于一體的網(wǎng)絡(luò)設(shè)備。盡管NAT讓位于私有網(wǎng)絡(luò)的終端設(shè)備可以訪問外部網(wǎng)絡(luò),實(shí)現(xiàn)共享上網(wǎng),但對(duì)于位于外部網(wǎng)絡(luò)的終端設(shè)備而言,訪問不到私有網(wǎng)絡(luò)內(nèi)的終端設(shè)備。如果在私有網(wǎng)絡(luò)中的某臺(tái)設(shè)備上架設(shè)了服務(wù),如Web服務(wù)或FTP 服務(wù),想讓位于外部網(wǎng)絡(luò)的計(jì)算機(jī)訪問這些服務(wù),可以在NAT 上做端口轉(zhuǎn)發(fā)。
NAT 不但可以實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換,還可以實(shí)現(xiàn)端口轉(zhuǎn)發(fā)或端口映射,當(dāng)外部網(wǎng)絡(luò)設(shè)備訪問NAT的某個(gè)端口時(shí),NAT 將數(shù)據(jù)包轉(zhuǎn)發(fā)給內(nèi)網(wǎng)對(duì)應(yīng)的服務(wù)器,使外網(wǎng)設(shè)備實(shí)現(xiàn)了內(nèi)網(wǎng)訪問。
在使用NAT的私有網(wǎng)絡(luò)中,常規(guī)的做法是讓NAT 設(shè)備充當(dāng)私有網(wǎng)絡(luò)的默認(rèn)網(wǎng)關(guān),如家庭網(wǎng)絡(luò),寬帶路由器的地址就是家庭網(wǎng)絡(luò)的默認(rèn)網(wǎng) 關(guān)。在Windows Server上配置路由和遠(yuǎn)程訪問NAT服務(wù)器時(shí),NAT 服務(wù)器地址也是私有網(wǎng)絡(luò)的網(wǎng)關(guān)。
A 學(xué)校將在線教學(xué)平臺(tái)搬遷到云上以后,A 學(xué)校租用的只是云主機(jī),只能使用云平臺(tái)提供商分配的網(wǎng)絡(luò)和IP 地址。A 學(xué)校無法調(diào)整30臺(tái)云主機(jī)的網(wǎng)絡(luò)架構(gòu),不能將分配Internet 地址的云主機(jī)上部署NAT 服務(wù)器,并將其作為其它云主機(jī)的默認(rèn)網(wǎng)關(guān)。
不能調(diào)整云主機(jī)網(wǎng)絡(luò)架構(gòu),無法用NAT 做端口轉(zhuǎn)發(fā),那能不能仿照硬件防火墻上那樣做端口轉(zhuǎn)發(fā)呢?筆者檢查了A 學(xué)校位于出口的那臺(tái)云主機(jī),這臺(tái)云主機(jī)使用的使用Centos 7.2 操作系統(tǒng),啟用的是iptables 防火墻,能否用iptables 轉(zhuǎn)發(fā)端口,需要進(jìn)一步了解iptables的功能和基本用法。
iptables 嚴(yán)格說來不是真正的防火墻,而是一款工具。真正的防火墻是netfilter,它 是Linux的子系統(tǒng)之一,提供防火墻、網(wǎng)絡(luò)地址轉(zhuǎn)換、數(shù)據(jù)包記錄、流量統(tǒng)計(jì)等一系列功 能。iptables 只是控制netfilter 一款工具。netfilter 和iptables 合起來構(gòu)成一個(gè)功能強(qiáng)大的防火墻。
netfilter 主要提供了filter(過 濾)表、NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)表和mangle(修改數(shù)據(jù)包標(biāo)志位)表等三張表,每張表由若干鏈組成,鏈主要用來容納防火墻規(guī)則,默認(rèn)有INPUT(入站處理)、OUTPUT(出站處理)、FORWARD(轉(zhuǎn)發(fā)處理)、POSTROUTING(路由轉(zhuǎn)發(fā)前的處理)和PREROUTING(路由轉(zhuǎn)發(fā)后的處理)等5 種數(shù)據(jù)包處理的規(guī)則鏈。
1.數(shù)據(jù)包到達(dá)防火墻以后,先進(jìn)入mangle 表的PREROUTING 鏈,此時(shí)若有規(guī)則設(shè)置,防火墻按規(guī)則設(shè)定更改數(shù)據(jù)包的TOS 等信息。
2.數(shù)據(jù)包進(jìn)入NAT 表的PREROUTING 鏈,此時(shí)若有如有規(guī)則設(shè)置,則按規(guī)則進(jìn)行目的地址轉(zhuǎn)換。
3.數(shù)據(jù)包經(jīng)過路由后,由路由判定該數(shù)據(jù)包是由本機(jī)處理還是轉(zhuǎn)發(fā)給其它計(jì)算機(jī)或其它網(wǎng)絡(luò)。
4.如果目的地為本機(jī),數(shù)據(jù)包則會(huì)進(jìn)入mangle 表的INPUT 鏈,經(jīng)過處理,再進(jìn)入filter 表的INPUT 鏈,經(jīng)過相應(yīng)的過濾,最后進(jìn)入木機(jī)的處理進(jìn)程。
5.如果是轉(zhuǎn)發(fā),則先后按照以下順序進(jìn)行處理:
(1)進(jìn)入mangle 表的FORWARD 鏈,根據(jù)規(guī)則設(shè)置修改相應(yīng)的參數(shù)。
(2)進(jìn)入filter 表的FORWARD 鏈,根據(jù)規(guī)則設(shè)置進(jìn)行過濾。
(3)進(jìn)入filter 表的OUTPUT 鏈,根據(jù)規(guī)則設(shè)置進(jìn)行過濾。
(3)進(jìn)入mangle 表的POSTROUTING 鏈,根據(jù)規(guī)則設(shè)置修改相應(yīng)的參數(shù)。
(4) 進(jìn)入NAT 表的POSTROUTING 鏈,根據(jù)規(guī)則設(shè)置進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換,修改數(shù)據(jù)包的源地址。
(5)最后將數(shù)據(jù)包轉(zhuǎn)發(fā)給目的計(jì)算機(jī)或外部網(wǎng)絡(luò)。
通過以上分析,無論防火墻netfilter/iptables 是否位于網(wǎng)關(guān),數(shù)據(jù)包只要到達(dá) netfilter/iptables,netfilter/iptables 都可以按照設(shè)定的規(guī)則來進(jìn)行端口轉(zhuǎn)發(fā)。
圖1 測(cè)試環(huán)境
由于A 學(xué)校的的在線教學(xué)平臺(tái)是生產(chǎn)環(huán)境,不能在上面直接嘗試,于是筆者搭建了如圖1 所示測(cè)試環(huán)境。
其中,網(wǎng)絡(luò)192.168.143.0/24 代表云主機(jī)的私有網(wǎng)絡(luò),網(wǎng) 絡(luò)172.16.5.0/24 代表外部網(wǎng)絡(luò)。服務(wù)器A 和服務(wù)器B 代表兩臺(tái)云主機(jī),服務(wù)器C 代表外部網(wǎng)絡(luò)的計(jì)算機(jī)。服務(wù)器B 上有兩塊網(wǎng)卡,一塊連接私有網(wǎng)絡(luò),一塊連接外部網(wǎng)絡(luò)。網(wǎng)絡(luò)192.168.143.0/24 和網(wǎng)絡(luò)172.16.5.0/24 之間沒有路由,相互之間不能通信。在服務(wù)器A 上部署FTP 服務(wù),在用iptables 進(jìn)行端口轉(zhuǎn)發(fā)前,服務(wù)器C 不能訪問服務(wù)器A 上的FTP 服務(wù)。在服務(wù)器B 上配置端口轉(zhuǎn)發(fā)后,如果服務(wù)器C 能訪問服務(wù)器A 上的FTP 服務(wù),說明可以用iptables 進(jìn)行端口轉(zhuǎn)發(fā)。
下面是基于上述測(cè)試環(huán)境,用iptables 實(shí)現(xiàn)端口轉(zhuǎn)發(fā)的具體過程:
CentOS 7 默認(rèn)的防火墻不是iptables,而是firewa lld。如果不是新系統(tǒng),可以使用命令“service iptables status”檢查當(dāng)前系統(tǒng)是否已安裝iptables。
如果是新部署的Centos 7 或沒有安裝iptables,可以用命令“yum install iptables-services” 在 線安裝iptables。在線安裝iptables 時(shí),需要連接互聯(lián)網(wǎng)。
也可以使用命令“yum install-y iptablesservices”安裝iptables,兩個(gè)命令的區(qū)別就是前者需要確認(rèn),后者安裝時(shí)自動(dòng)確認(rèn),不需要人為干預(yù)。
iptables-services 是iptables的一個(gè)服務(wù),在線安裝iptables-services 包時(shí),若系統(tǒng)沒有安裝iptables包,會(huì)自動(dòng)安裝iptables。如果用命令“yum install iptables”安裝iptables,還需要進(jìn)一步安裝iptablesservices。
因iptables 與系統(tǒng)自帶的防火墻守護(hù)進(jìn)程firewall d 有沖突??梢杂妹睢皊ys temctl stop firewalld”停用firewalld 服務(wù)。
為避免開機(jī)自動(dòng)啟動(dòng)firewalld 服 務(wù),影 響iptables的啟動(dòng),可以用命令“systemctl mask firewalld”或“systemctl disable firewalld”禁 用firewalld服務(wù)。
這一步很重要,很多網(wǎng)管員或架構(gòu)工程師在配置端口轉(zhuǎn)發(fā)不成功的主要原因忽略了啟用Linux的數(shù)據(jù)轉(zhuǎn)發(fā)功能。
默認(rèn)情況下,Linux 是沒有啟用數(shù)據(jù)轉(zhuǎn)發(fā)功能的。可以使用命令sysctl 啟用數(shù)據(jù)轉(zhuǎn)發(fā)功能。sysctl 是一條設(shè)置或重新設(shè)置聯(lián)網(wǎng)功能的命令,如IP 轉(zhuǎn)發(fā)、IP 碎片去除以及源路由檢查等。
用命令“vi/etc/sysctl.conf”編輯系統(tǒng)內(nèi)核參數(shù)文 件“sysctl.conf”,將 其中的參數(shù)“net.ipv4.ip_forward=0”更改為“net.ipv4.ip_forward=1”。如 果“sysctl.conf”文件中沒有此條參數(shù),可以手動(dòng)添加進(jìn)去。
修 改“sysctl.conf”文件,啟用數(shù)據(jù)轉(zhuǎn)發(fā)功能后,用命令“sysctl-p”使修改的配置參數(shù)生效。
(1)用命令iptables 配置filter 表的FORWARD 鏈,允許轉(zhuǎn)發(fā)對(duì)應(yīng)的數(shù)據(jù)包。
轉(zhuǎn)發(fā)源數(shù)據(jù)的命令如下:
iptables-A FORWARD-s 192.168.143.27/32-i ens224-p tcp-m tcp--sport 61021-j ACCEPT
這條命令表示允許轉(zhuǎn)發(fā)來自服務(wù)器B的數(shù)據(jù)包,其中服務(wù)器B的IP 地址是“192.168.143.27”,對(duì)應(yīng)網(wǎng)絡(luò)接口是“ens224”,轉(zhuǎn)發(fā)的源端口是“61021”。
轉(zhuǎn)發(fā)目的數(shù)據(jù)的命令如下:
iptables-A FORWARD-d 192.168.143.27/32-o ens224-p tcp-m tcp--dport 61021-j ACCEPT
這條命令表示允許轉(zhuǎn)發(fā)到服務(wù)器B的數(shù)據(jù),其中服務(wù)器B的IP 地址是“192.168.143.27”,對(duì)應(yīng)網(wǎng)絡(luò)接口是“ens224”,轉(zhuǎn)發(fā)的目的端口是“61021”。
(2)用命令iptables 配置NAT 表的PREROUTING 鏈,將訪問服務(wù)器B的端口轉(zhuǎn)發(fā)給服務(wù)器A 對(duì)應(yīng)的端口。
iptables-t nat-A PREROUTING-p tcp-m tcp--dport 61021-j DNAT--to-destination 192.168.143.28:61021
(3)用命令iptables 配置nat 表的POSTROUTING 鏈,將訪問服務(wù)器B的端口轉(zhuǎn)發(fā)給服務(wù)器A 對(duì)應(yīng)的端口。
-A POSTROUTING-d 192.168.143.28/32-p tcp-m tcp--dport 61021-j SNAT--to-source 192.168.143.27
添加完防火墻規(guī)則后,用命令“service iptables save”保存防火墻規(guī)則。
如果需要轉(zhuǎn)發(fā)的端口數(shù)量比較多,可以使用“vi/etc/sysconfig/iptables”編輯iptables 防火墻規(guī)則文件。
例如,在本例中,為服務(wù)器A的FTP 服務(wù)配置的端口 是“61021-61026”,整 個(gè)iptables 防火墻規(guī)則配置文件如圖2 所示。
配置好防火墻規(guī)則以后,可以使用命令“systemctl start iptables.service”啟 動(dòng)iptables 服 務(wù),或 用命 令“systemctl restart iptables.service”重啟ipt ables 服務(wù)。
默認(rèn)情況下,操作系統(tǒng)重新啟動(dòng)后,不會(huì)啟動(dòng)iptables服務(wù),也就不能實(shí)現(xiàn)端口轉(zhuǎn)發(fā)??梢允褂妹睢皊ystemctl enable iptables.service”將iptables 服務(wù)配置為開機(jī)啟動(dòng)。
圖2 防火墻配置具體內(nèi)容
配置好端口轉(zhuǎn)發(fā)后,在服務(wù)器C 上用命令“telnet 172.16.5.143 61021”嘗試能否打開端口,經(jīng)測(cè)試,可以打開端口,說明端口轉(zhuǎn)發(fā)配置成功。
在文件資源管理器的地址欄輸入FTP 地址“ftp://172.16.5.145:61021”,提示輸入用戶名和密碼,輸入FTP的用戶名和密碼,可以打開FTP 共享目錄。
筆者在實(shí)驗(yàn)環(huán)境完成iptables 端口轉(zhuǎn)發(fā)測(cè)試后,在A 學(xué)校出口那臺(tái)云主機(jī)上啟用數(shù)據(jù)轉(zhuǎn)發(fā)功能(命令“sysctl-p”),按照A 學(xué)校在線教學(xué)平臺(tái)需求配置iptables 規(guī)則。完成端口轉(zhuǎn)發(fā)配置后,經(jīng)測(cè)試,位于云主機(jī)的在線教學(xué)平臺(tái)終于可以提供在線教學(xué)服務(wù)了。