Redhat下使用iptables實現NAT
Redhat 7.2下使用iptables實現NAT
一、注意環境:
一臺DELL LATITUDE C610筆記本(PIII1G,256M SDRAM,30G 4200rpm HDD)上安裝Redhat Linux 7.2(完全安裝)。Redhat 7.2
這臺筆記本自帶一塊內置百兆以太網卡(3Com 3C920),在Redhat中標識為eth0,IP地址為192.168.59.27/24,Gateway為192.168.59.1。另外插上一塊PCMCIA接口的網卡(Realtek 8139),在Redhat中標識為eth1,IP地址為10.0.0.254/24,這塊網卡的TCP/IP設置中僅設置IP和NetMask,不設置Gateway。這樣,在netstat –rn或者route print命令中看到缺省路由唯一指向192.168.59.1。
關于如何驅動雙網卡,建議在X-Windows環境下配置,詳見相關文檔。
一臺Cisco 2621路由器,其FastEthernet0/0口配置IP地址為10.0.0.1/24,另一個以太網接口Down掉。配置一條缺省路由“ip route 0.0.0.0 0.0.0.0 10.0.0.254”,路由器的缺省網關就指向了10.0.0.254。
這臺筆記本的eth0(3Com)網卡接入辦公室局域網,其他ip地址在192.168.59.0/24網段的機器也連接在這個局域網里。***都通過網關192.168.59.1以NAT接入Internet。
在試驗中還需要用到一臺192.168.59.x的PC機Client來測試ping等網絡功能。
二、開始試驗:
在筆記本上進入Linux操作系統,以root用戶身份登錄到字符界面。
首先輸入setup,進入配置菜單。進入system service,選項,關閉里面的ipchains(去掉選項前面的*號),啟用里面的iptables(在選項前加上*號)。這里設置后,Linux的服務并沒有按照我們的意愿啟動或停止,這只是標記一下并告訴系統下次啟動時將要自動啟動哪些服務而不啟動哪些服務,可以重新啟動Linux操作系統(reboot)使設置生效。在不需要重新啟動操作系統的前提下,可以重啟端口守護進程:/etc/rc.d/init.d/xinetd restart
啟動好iptables之后,就需要配置它了。
首先打開ip轉發功能(相當于讓計算機工作在路由狀態,能夠轉發各個網絡接口上的數據包):
- echo 1 >/proc/sys/net/ipv4/ip_forward
注意,在“echo 1”和“>”之間有一個空格,否則語句就不起效果。
這一句執行前,我們可以vi /proc/sys/net/ipv4/ip_forward,看到文件內容為一個字符“0”,這表明ip forward功能被禁用。該語句正確執行后,文件內容被改為“1”,表明ip forward功能被啟用。
也可以手工去修改ip_forward文件內容為“1”,啟用ip轉發功能,但是下次系統重啟后,又會被置為0。
這是實現iptables NAT的準備工作,我們可以將這條語句寫進/etc/rc.d/rc.local這個啟動腳本中,下次操作系統重新啟動時,這條語句會被自動執行。
在iptables的filter表里面不做任何設置,所有規則為空,默認即為所有包均允許通過。
iptables –L即iptables –t filter –L,顯示包過濾規則
iptables –t nat –L現實NAT規則
同樣的
iptables –A和iptables –D表示添加和刪除包過濾規則,完全寫法為iptables –t filter –A和iptables –t filter -D
iptables –t nat –A和iptables –t nat –D表示添加和刪除NAT規則
iptables –F表示清空包過濾規則,完全寫法為iptables –t filter –F,再次強調,包過濾規則為空表示對所有通過的數據包均放行不予攔截(ACCEPT)。
iptables –t na –F表示清空NAT規則
接下來在iptables的NAT表里面做相應的地址轉換設置。
用以下語句添加兩條NAT規則:
iptables –t nat –A POSTROUTING –s 10.0.0.0/24 –o eth0 –j SNAT ――to 192.168.59.27
iptables –t nat –A PREROUTING –p tcp –d 192.168.59.27 ――dport 2323 –i eth0 –j DNAT ――to 10.0.0.1:23
需要說明的是源地址轉換(SNAT) 是在路由后進行的,所以是POSTROUTING,需要確定數據包出防火墻的接口;而目的地址轉換(DNAT)是在路由前進行的,所以是PREROUTING,需要確定數據包進防火墻的接口。
對***條NAT規則解釋如下:
這是一個源地址轉換規則,數據包出防火墻(-o)的接口是eth0。這條規則將所有源地址為10.0.0.0/24的數據包在從eth0接口出防火墻的時候,轉換其源地址為192.168.59.27。這樣就讓內部網(10.0.0.0/24)的機器能夠共享一個外部網IP(192.168.59.27/24)訪問到外部網段(192.168.59.0/24)。這條規則適合部署一臺NAT防火墻實現Office或Home的多臺機器共享上網。
對第二條NAT規則解釋如下:
這是一個目的地址轉換規則,數據包進防火墻(-i)的接口是eth0。當一個數據包試圖訪問防火墻的eth0接口(192.168.59.27)2323端口的時候,數據包的目的地址將被改變為10.0.0.1,同時,訪問的端口也將被改變為23,也就是說,這個數據包將被防火墻從其eth1接口轉發(因為eth1接口IP是10.0.0.0/24這一段的)出去并送達10.0.0.1訪問其23端口。這是一個典型的靜態端口重定向規則。
三、開始測試:
因為10.0.0.1是路由器Cisco 2621的快速以太口,我們可以telnet上路由器,然后確定sh ip route顯示其缺省路由指向10.0.0.254,并確保能在路由器上ping通10.0.0.254。然后試圖ping 192.168.59.1,發現能夠ping通,但是速度不穩定有時會丟包,懷疑到192.168.59.1是一臺Catalyst 6509多層交換機,整個公司均利用其作為網關出口,所以該設備的NAT處理非常頻繁,可能會導致處理數據包能力下降。所以從路由器上ping另一個IP例如192.168.59.22,發現連通性非常穩定,這表示SNAT功能成功實現。
由于路由器打開了telnet功能,其IP為10.0.0.1的以太網接口的23端口(telnet)是處于偵聽狀態的,而防火墻(筆記本)上的eth0接口的2323端口被映射到10.0.0.1的23端口。所以從一臺192.168.59.0/24網段內任意一臺Client機器上telnet 192.168.59.27 2323,顯示出了Cisco 2621的telnet登錄界面,輸入口令“cisco”后進入了Cisco 2621。這表明DNAT功能成功實現。
因為防火墻(筆記本)的網關指向了192.168.59.1,所以從路由器上能ping通Internet上的公網IP比如202.38.64.2(中國科技大學www服務器)。
接著輸入:
- iptables –t nat –D PREROUTING 1
經過以上步驟,Redhat下使用iptables就可以實現NAT了。
【編輯推薦】

















