上圖是你的家,藍色的圈是你家院子,有兩扇大門①⑥進出,你家有兩個房間,分別為eth0和 eth1房間,每個房間有兩個門可以進出②③④⑤。旁邊是張三和李四的家,張三家和李四家之間的往返必須要過你家院子。 現假設,eth0網卡IP為:192.168.5.1鏈接內網,eth1網卡IP為:218.100.100.111鏈接互連網。 再假設,“張三家”為一個局域網,“李四家”為互連網。進我家院子用PREROUTING,出我家院子用FORWARD,進我家門用INPUT,出我家門用OUTPUT。(當我們的操作是征對服務器本身而言的話,如SSH操作,此時肯定會用到PREROUTING、INPUT和OUTPUT,當數據只是通過服務器去訪問別的機器時會用到PREROUTING和FORWARD。) 又假設,默認這六個門都是關的。生成如下代碼。 ########################################################################### *nat ################################ :PREROUTING DROP [0:0] :OUTPUT DROP [0:0] :POSTROUTING DROP [0:0] ################################ -F -Z -X ### 以後要新增語句請在此處增加。 -L –v COMMIT ################################################ *filter ############################## :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] ############################## -F -Z -X ### 以後要新增語句請在此處增加。 -L –v COMMIT ########################################################################## 1、 局域網用戶通過服務器共享上網 (即從張三家到李四家) 1)首先進①號門,再從⑥號門走出。 -A PREROUTING –p tcp --dport 80 –j ACCEPT #允許TCP 80端口通過服務器 -A FORWARD –p tcp --dport 80 –j ACCEPT #允許TCP80 端口轉發 -A FORWARD –p tcp --sport 80 –j ACCEPT #允許接收對方為TCP80端口反回的信息 2)其次,由於我們上網打的是域名,為此有一個公網DNS服務器為我們服務,那當然也要允許內網機器與DNS服務器的數據轉發。DNS用UDP 53或者 TCP 53端口。兩者用其一個就行。 -A PREROUTING –p udp --dport 53 –j ACCEPT -A FORWARD –p udp --dport 53 –j ACCEPT -A FORWARD –p udp --sport 53 –j ACCEPT 3)再次,由於局域網的地址在公網上是不被允許的,所以在出公網前應該把其地址轉為服務器地址進行偽裝。 -A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 2、 允許局域網和公網可以訪問服務器的SSH 假設SSH采用默認端口TCP 22 。此要求相當於要進我的家的TCP 22號門,為此我們首先要進我家院子,然後再進我家門,最後走出我家門這樣的過程。此操作是征對服務器本身的操作。 -A PREROUTING –p tcp --dport 22 –j ACCEPT -A INPUT –p tcp --dport 22 –j ACCEPT -A OUTPUT –p tcp --sport 22 –j ACCEPT 3、 允許內網機器可以登錄MSN和QQ。 (MSN和QQ默認是不允許登錄的)QQ一般來說可以從TCP 80、8000、443及UDP 8000、4000登錄,而MSN可以從TCP 1863、443登錄。我們登錄MSN和QQ的過程就象上網一樣,也是去訪問遠程服務器的指定端口,故而我們只用數據轉發即可。 -A PREROUTING –p tcp --dport 1863 –j ACCEPT -A PREROUTING –p tcp --dport 443 –j ACCEPT -A PREROUTING –p tcp --dport 8000 –j ACCEPT -A PREROUTING –p udp --dport 8000 –j ACCEPT -A PREROUTING –p udp --dport 4000 –j ACCEPT -A FORWARD –p tcp --dport 1863 –j ACCEPT -A FORWARD –p tcp --sport 1863 –j ACCEPT -A FORWARD –p tcp --dport 443 –j ACCEPT -A FORWARD –p tcp --sport 443 –j ACCEPT -A FORWARD –p tcp --dport 8000 –j ACCEPT -A FORWARD –p tcp --sport 8000 –j ACCEPT -A FORWARD –p udp --dport 8000 –j ACCEPT -A FORWARD –p udp --sport 8000 –j ACCEPT -A FORWARD –p udp --dport 4000 –j ACCEPT -A FORWARD –p udp --sport 4000 –j ACCEPT 4、 讓內網機器可以收發郵件。 接收郵件是訪問遠程服務器的TCP 110端口,發送郵件是訪問TCP25端口。用數據轉發即可。 -A PREROUTING –p tcp --dport 110 –j ACCEPT -A PREROUTING –p tcp --dport 25 –j ACCEPT -A FORWARD –p tcp --dport 110 –j ACCEPT -A FORWARD –p tcp --sport 110 –j ACCEPT -A FORWARD –p tcp --dport 25 –j ACCEPT -A FORWARD –p tcp --sport 25 –j ACCEPT 5、 內部機器對外發布WEB。 要把內網機器192.168.5.179的WEB對外發布的話,相當於是從外網訪問內網。與第1步操作的局域網共享上網相同,只是訪問的方向改變了。不是從內網訪問外網,而是從外網訪問內網。 當公網訪問服務器218.100.100.111時,防火牆把它映射到內網的192.168.5.179的TCP80上。當內網機器訪問服務器218.100.100.111時,防火牆把它映射到內網的192.168.5.179的TCP80上。 -A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 -A PREROUTING –i eth1 –p tcp –d 218.100.100.111 –dport 80 –j DNAT –to-destination 192.168.5.179:80 (以上兩句必須寫在 –A PREROUTING –p tcp --dport 80 –j ACCEPT 前面。) TCP 80端口的轉發在第1步就已做過,此處就不用重復制作了。另外在 -A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 之後加上一句: -A POSTROUTING –p tcp --dport 80 –j ACCEPT 為什麼要加這句話呢,我的理解是這樣的, 公網訪問 http://218.100.100.111時:(假設公網上用戶的IP為199.199.199.199,端口12345為隨機的產生的。) 數據源 : ip:199.199.199.199 sport:12345 數據目標: ip:218.100.100.111 dport 80 此時,通過-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告訴199.199.199.199,您要訪問的真正地址應該是192.168.5.179:80,然後我們通過-A POSTROUTING –p tcp --dport 80 –j ACCEPT 目標地址218.100.100.111:80偽裝成 192.168.5.179:80 。 數據源 : ip:199.199.199.199 sport:12345 數據目標: ip:192.168.5.179 dport 80 當192.168.5.179返回數據時: 數據源 : ip:192.168.5.179 sport:80 數據目標: ip:199.199.199.199 dport 12345 數據經過 -A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 後, 數據源 : ip:218.100.100.111 sport:80 數據目標: ip:199.199.199.199 dport 12345 6、 完整的iptables配置 ########################################################################### *nat ################################ :PREROUTING DROP [0:0] :OUTPUT DROP [0:0] :POSTROUTING DROP [0:0] ################################ -F -Z -X -A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 -A PREROUTING –i eth1 –p tcp –d 218.100.100.111 --dport 80 –j DNAT –to-destination 192.168.5.179:80 -A PREROUTING –p tcp --dport 80 –j ACCEPT -A PREROUTING –p udp --dport 53 –j ACCEPT -A PREROUTING –p tcp --dport 22 –j ACCEPT -A PREROUTING –p tcp --dport 1863 –j ACCEPT -A PREROUTING –p tcp --dport 443 –j ACCEPT -A PREROUTING –p tcp --dport 8000 –j ACCEPT -A PREROUTING –p udp --dport 8000 –j ACCEPT -A PREROUTING –p udp --dport 4000 –j ACCEPT -A PREROUTING –p tcp --dport 110 –j ACCEPT -A PREROUTING –p tcp --dport 25 –j ACCEPT -A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 -A POSTROUTING –p tcp --dport 80 –j ACCEPT -L –v COMMIT ################################################ *filter ############################## :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] ############################## -F -Z -X -A INPUT –p tcp --dport 22 –j ACCEPT -A OUTPUT –p tcp --sport 22 –j ACCEPT -A FORWARD –p tcp --dport 80 –j ACCEPT -A FORWARD –p tcp --sport 80 –j ACCEPT -A FORWARD –p udp --dport 53 –j