RHEL5.7下iptabels防火墙配置(下)
??? 上一篇講了iptables防火墻對于單個主機的應用,現在來學習一下將iptables防火墻作為網關防火墻使用。這時iptables防火墻不僅僅是保護一臺主機了,而是保護整個網絡,充當網關這樣的角色。責任相當更加重大,同時需求也提升了很多。
linux防火墻的NAT功能
??? 有關NAT地址轉換的知識在這里就不多說了,我們知道這個一般都是在路由器上實現的,而linux主機同樣可以實現這個功能。iptables防火墻中有3張內置的表:filter、nat和mangle,其中的nat表實現了地址轉換的功能。nat表包含PREROUTING、OUTPUT和POSTROUTING 3條鏈,里面包含的規則指出了如何對數據包的地址進行轉換。
1、SNAT
??? 源NAT的規則在POSTROUTING鏈中定義。這些規則的處理是在路由完成后進行的,可以使用"-j SNAT"目標動作對匹配的數據包進行源地址轉換。如果希望內網10.10.1.0/24出去的數據包其源IP地址都轉換外網接口eth0的固定公網IP地址218.75.26.35,采用"-j POSTOUTING”目標動作,則需要執行以下iptables命令:
iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o eth0 -j SNAT --to-source 218.75.26.35
以上命令中,"-t nat"指定使用的是nat表,"-A POSTROUTING"表示在POSTROUTING鏈中添加規則,"--to-source 218.75.26.35"表示把數據包的源IP地址轉換為218.75.26.35,而根據-s選項的內容,匹配的數據包其源IP地址應該是屬于10.10.1.0/24子網的。還有,"-o eth0"指定了只有從eth0接口出去的數據包才做源NAT轉換,轉換后的公網地址直接是eth0的公網IP地址。
**************************************************************************************
除了轉換為eth0的公網地址外,也可以使用其他地址,例如,218.75.26.34。此時,需要為eth0創建一個子接口,并把IP地址設置為218.75.26.34,使用的命令如下所示:
ifconfig eth0:1 218.75.26.34 netmask 255.255.255.240
以上命令使eth0接口擁有兩個公網IP。也可以使用某一IP地址范圍作為轉換后的公網地址,此時要創建多個子接口,并對應每一個公網地址。而"--to-source"選項后的參數應該以"a.b.c.x-a.b.c.y"的形式出現。**************************************************************************************
前面介紹的是數據包轉換后的公網IP是固定的情況。如果公網IP地址是從ISP服務商那里通過ADSL撥號動態獲得的,則每一次撥號所得到的地址是不同的,并且網絡接口也是在撥號后才產生的。在這種情況下,前面命令中的"--to-source"選項將無法使用。為了解決這個問題,iptables提供了另一種稱為IP偽裝的源NAT,其實現方法是采用"-j MASQUERADE"目標動作,具體命令如下所示。
iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o ppp0 -j MASQUERADE
以上命令中,MASQUERADE意為偽裝,ppp0是撥號成功后產生的虛擬接口,其IP地址是從ISP服務商那里獲得的公網IP。"-j MASQUERADE"表示把數據包的源IP地址改為ppp0接口的IP地址。
2、DNAT
??? 目的NAT改變的是數據包的目的IP地址,當來自Internet的數據包訪問NAT服務器網絡接口的公網IP時,NAT服務器會把這些數據包的目的地址轉換為某一對應的內網IP,再路由給內網計算機。這樣,使用內網IP地址的服務器也可以為Internet上的計算機提供網絡服務了。如果大家學習過硬件防火墻的話,會知道有一個DMZ區域,可以將內部對外的服務器放在這個區域映射出去。同理,iptables防火墻也可以實現同樣的功能。"-j DNAT"指定了目標動作是DNAT,表示要對數據包的目的IP進行修改,它的子選項"--to 10.10.2.3"表示修改后的IP地址是10.10.2.3。于是,目的IP修改后,接下來將由路由模塊把數據包路由給10.10.2.3服務器。假設IP為10.10.2.3的計算機需要為Internet提供網絡服務,此時,可以規定一個公網IP地址,使其與10.10.2.3建立映射關系,采用"-j PREROUTING”目標動作。假設使用的公網IP是218.75.26.34,則配置目的NAT的命令如下:
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -j DNAT --to 10.10.2.3
??? 以上是在PREROUTING鏈中添加規則,這條鏈位于路由模塊的前面,因此是在路由前改變了數據包的目的IP,這將對路由的結果造成影響。由于網絡接口eth0與Internet連接,因此,"-i eth0"保證了數據包是來自Internet的數據包。"-d 218.75.26.34/32"表示數據包的目的地是到218.75.26.34主機,而這個IP應該是eth0某個子接口的地址,這樣才能由NAT服務器接收數據包,否則,數據包將會因為無人接收而丟棄。
??? 以上是讓一個公網IP完全映射到內網的某個IP上,此時同10.10.2.3主機直接位于Internet,并且使用218.75.26.34地址是沒有區別的。因此這種方式雖然達到了地址轉換的目的,但實際上并沒有帶來多大好處,因為使用NAT的主要目的是為了能夠共用公網IP地址,以節省日益緊張的IP地址資源。為了達到共用IP地址的目的,可以使用端口映射。端口映射是把一個公網IP地址的某一端口映射到內網某一IP地址的某一端口上去。它使用起來非常靈活,兩個映射的端口其端口號可以不一樣,而且同一個公網IP的不同端口可以映射到不同的內網IP地址上去。例如,主機10.10.2.3只為外網提供Web服務,因此,只需要開放80端口,而主機10.10.2.9為外網提供了FTP服務,因此需要開放21號端口。在這種情況下,完全可以把公網IP地址218.75.26.34的80號和21號端口分別映射到10.10.2.3和10.10.2.9的80號和21號端口,以便兩臺內網服務器可以共用一個公網IP。具體命令如下所示。
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -p tcp --dport 80 -j DNAT --to 10.10.2.3:80?
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -p tcp --dport 21 -j DNAT --to 10.10.2.9:21
??? 以上命令中,目的地址是218.75.26.34的TCP數據包。當目的端口是80時,將轉發給10.10.2.3主機的80端口;當目的端口是21時,將轉發給10.10.2.9主機的21號端口。當然,兩個映射的端口完全可以不一樣。例如,如果還有一臺主機10.10.2.8也通過80端口提供Web服務,并且映射的IP地址也是218.75.26.34,此時需要把218.75.26.34的另一個端口,如8080,映射到10.10.2.8的80端口,命令如下:
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -p tcp --dport 8080 -j DNAT --to 10.10.2.8:80?
注意:上面介紹的只是有關iptables中的DNAT配置,在實際應用中,還需要其他一些配置的配合才能真正成功。例如,filter表的3個鏈應該允許相應的數據包通過,應該為每一個外網IP創建eth0接口的子接口等。?
此外,對于FTP服務來說,由于21號端口只是建立控制連接時用到的端口,真正傳輸數據時要使用其他端口。而且在被動方式下,客戶端向FTP服務器發起連接的端口號是隨機的,因此,無法通過開放固定的端口來滿足要求。為了解決這個問題,可以在Linux系統中載入以下兩個模塊:modprobeip_conntrack_ftp和modprobeip_nat_ftp。這兩個模塊可以監控FTP控制流,以便能事先知道將要建立的FTP數據連接所使用的端口,從而可以允許相應的數據包通過,即使防火墻沒有開放這個端口。
實驗案例
如圖,RHEL-A是企業內網的一臺服務器,RHEL-B是外網一臺主機,RHEL-C是企業出口網關,Router代表運營商路由器。企業內部使用私有地址,網關處需要進行NAT轉換才可以訪問,RHEL-C的eth0接口只有一個公網IP。要求RHEL-A能夠訪問外網的RHEL-B,RHEL-B在瀏覽器上輸入RHEL-C的外網IP時可直接訪問RHEL-A的80端口(前提保證RHEL-A的http服務開啟)。
首先在RHEL-C上開啟路由功能
echo 1?> ?/proc/sys/net/ipv4/ip_forward
1、在RHEL-C上做SNAT進行源地址轉換
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 198.2.3.2
2、在RHEL-C上配置默認路由
route add -net 0.0.0.0 netmask 0.0.0.0 gw 198.2.3.1
3、在RHEL-B上配置默認路由
route add –net 0.0.0.0 netmask 0.0.0.0 gw 203.2.3.1
查看RHEL-C的nat規則表:
此時如果沒有其他問題的話,RHEL-A是可以Ping通外網以及RHEL-B的。現在開通RHEL-B的vsftpd服務,用RHEL-A去訪問
訪問沒有問題,在RHEL-B上查看進程連接
netstat–na | more
可以發現有下面這么一條記錄:
說明RHEL-A是通過網關RHEL-C的外網IP 198.2.3.2對RHEL-B的21端口進行訪問的,SNAT配置成功!
4、在RHEL-C上做DNAT,將RHEL-A的80端口映射出去
iptables -t nat -A PREROUTING -i eth1 -d 198.2.3.2/32 -p tcp --dport 80 -j DNAT --to 192.168.10.1:80
這時用RHEL-B的firefox瀏覽器訪問http://198.2.3.2,如果成功顯示RHEL-A的web頁面,那么內部服務器映射外網是成功的,DNAT配置成功!
轉載于:https://blog.51cto.com/power1990/714292
總結
以上是生活随笔為你收集整理的RHEL5.7下iptabels防火墙配置(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机中在红帽的Linux 下安装yum
- 下一篇: Excel中 提取字符串中的字符或数字