7.4. FORWARDNAT 規則

大部分企業都只能從 ISP 那兒分到數量有限的 IP 位址。由於這個限制,管理者必須尋求其他方法,不需將有限的 IP 位址分配給所有人,又能讓區域網路上的每個節點連上網際網路。使用私有 IP 位址是最常見的方法,讓區網上的節點連接內部與外部網路。位於出口的路由器(例如防火牆)會接收網際網路的所有傳輸,轉送到區網中適當的電腦去。有時候這種轉送服務非常危險,例如有些破解工具能假冒為內部 IP 位址,讓遠端攻擊者的電腦看起來就像區網上的電腦一樣。要防止這種攻擊,iptables 提供了路由與轉送政策,以防止網路資源的非正常使用。

FORWARD 政策允許系統管理員控制封包在區網內部的傳送,例如要允許整個區網的封包轉送(假設防火牆/閘道器在 eht1 上擁有一個內部的 IP 位址),可以設定下列的規則:

iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT

這規則可以讓防火牆 / 閘道器之後的系統存取內部網路。閘道器會將某個區域網路節點上的封包,透過 eth1 裝置,送到目的地節點去。

注請注意
 

預設情況下,Red Hat Enterprise Linux 核心的 IPv4 政策停用 IP 轉送的支援,這將可避免執行 Red Hat Enterprise Linux 的機器用來當作既定的 邊緣路由器。 如要啟用 IP 轉送,請執行下列指令:

sysctl -w net.ipv4.ip_forward=1

假如這個指令是在 shell 提示符號下執行,那麼在重新開機後設定將會失效,您可以藉由編輯 /etc/sysctl.conf 檔案來永久性地設定轉送。 請找出並且編輯下列這一行,請以 1 取代 0

net.ipv4.ip_forward = 0

執行下列的指令來使 sysctl.conf 檔案的變更生效:

sysctl -p /etc/sysctl.conf

從防火牆的內部 IP 位址接收轉送的封包,可以讓區網內的節點互相通訊;但還是無法與網際網路上的電腦做外部通訊。要讓使用私有 IP 的電腦與外部公眾網路連線,請設定防火牆為 IP 偽裝(IP masquerading),把來自區網內部交通的位址,換成防火牆的外部 IP 位址(此例為 eth0):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

這規則使用 NAT 封包對應表(-t nat),同時指定防火牆外部網路裝置(-o eth0)的 NAT 內建 POSTROUTING 鏈結(-A POSTROUTING)。POSTROUTING 會在封包離開外部裝置時,改變封包內容。-j MASQUERADE 選項可以將私有的 IP 位址,以防火牆 / 閘道器的外部位址偽裝起來。

如果您想要公開內部網路中的某台伺服器,您可以使用 -j DNAT 選項,設定 NAT 的 PREROUTING 鏈結,指定伺服器的位址與連接埠號,讓外來封包可以轉送到正確的位置去。舉例來說,如果您想要把外來的所有 HTTP 封包,轉送到位址為 172.31.0.23 的專職 Apache HTTP 伺服器 伺服器,那麼請執行以下指令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
      --to 172.31.0.23:80

這規則可以讓 NAT 表使用內建的 PREROUTING 鏈結,將外來的 HTTP 封包只轉送到 172.31.0.23 去。

注請注意
 

如果您的 FORWARD 鏈結裡面,有預設的 DROP 政策,那您必須多加一條規則,轉送外來的 HTTP 請求,這樣才能使用 NAT 把封包送到目的地去。要執行這功能,請執行以下指令:

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT

這規則可以讓外來的 HTTP 請求透過防火牆,連接到防火牆之後的 Apache HTTP 伺服器 伺服器去。

7.4.1. DMZs 與 iptables

也可以設定 iptables 規則來傳送流量到某些機器,例如一部既定的 HTTP 或 FTP 伺服器,最好是一部位於內部網路之外的非軍事區域(DMZ,demilitarized zone) — 一個專為公眾網路(例如網際網路)提供服務的特別子網路。舉例來說,如要設定一個規則來傳送所有外來的 HTTP 要求到一部擁有 10.0.4.2 IP 位址與連接埠號 80 的 HTTP 伺服器(區網 192.168.1.0/24 範圍之外),網路位址轉譯(NAT)將會呼叫一個 PREROUTING 表格來轉送封包到適當的目的地:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
	    --to-destination 10.0.4.2:80

藉由這個指令,所有來自區網外到連接埠號 80 的 HTTP 連線都將會轉送到與其於內部網路區隔之網路中的 HTTP 伺服器。 這個網路區隔的形式可以保證比允許 HTTP 連線到網路中一部機器還要安全。 假如設定 HTTP 伺服器接受安全的連線,那麼也必須轉送連接埠號 443。