iptables nat 技術(shù)筆記
用了老久了的iptables,拿出來點心得寫出iptables nat筆記供大家參考!
1.Java環(huán)境建立
盡量使用/etc/profile做全局配置
2.前置機中導(dǎo)入iptables時,注意iptables版本問題。
導(dǎo)入iptables后可以用service iptables save將配置自動保存。
修改/etc/sysctl.conf可以使ip_forward功能自動打開。
以上設(shè)置后,使用chkconfig將iptables服務(wù)選上,可以在默認(rèn)運行級別下保證iptables的自動運行。
3.使用redhat 8版本的ifup(即服務(wù)器切割腳本中的ifrouteup)可以在調(diào)整網(wǎng)卡時自動修改默認(rèn)路由
4.在IDC做服務(wù)器切割時,盡量使用mac地址模擬
操作命令ifconfig eth0 hw ether aa:bb:cc:dd:ee:ff
5.靜態(tài)路由添加方式
/etc/sysconfig/network-scripts/routes-eth0
192.168.0.0/16 via 10.10.0.22
/etc/sysconfig/static-routes
eth0 net 192.168.0.0 netmask 255.255.0.0 gw 10.10.0.22
6.iptables做端口映射時,如果映射的服務(wù)器默認(rèn)網(wǎng)關(guān)并非是前置機本身,則postrouting中SNAT必須指定為前置機內(nèi)網(wǎng)地址
以電信機房為例,防火墻eth0 10.10.0.1 eth1 218.78.212.84
Client A :10.10.0.33 默認(rèn)路由:10.10.0.1
-A PREROUTING -d 218.78.212.84 -p tcp -m tcp –dport 22 -j DNAT –to-destination 10.10.0.33
結(jié)果:除10.10.0.33不能連通外,都可以ssh,日志記錄為正確來源IP
-A PREROUTING -d 218.78.212.84 -p tcp -m tcp –dport 22 -j DNAT –to-destination 10.10.0.33
-A POSTROUTING -d 10.10.0.33 -p tcp -m tcp –dport 22 -j SNAT –to-source 218.78.212.84
結(jié)果:包括10.10.0.33都可以ssh,但日志記錄為防火墻外網(wǎng)IP 218.78.212.84
-A PREROUTING -d 218.78.212.84 -p tcp -m tcp –dport 22 -j DNAT –to-destination 10.10.0.33
-A POSTROUTING -s 10.10.0.33 -p tcp -m tcp –dport 22 -j SNAT –to-source 218.78.212.84
結(jié)果:包括10.10.0.33都可以ssh,且日志記錄為正確來源IP
Clent B :10.10.0.138 默認(rèn)路由:10.10.0.241
-A PREROUTING -d 218.78.212.84 -p tcp -m tcp –dport 22 -j DNAT –to-destination 10.10.0.33
-A POSTROUTING -d 10.10.0.33 -p tcp -m tcp –dport 22 -j SNAT –to-source 10.10.0.1
結(jié)果:只有此方式包括10.10.0.138可以ssh,但日志記錄為防火墻內(nèi)網(wǎng)IP 10.10.0.1
7.修改/etc/inittab,將Ctrl+Alt+Del的組合鍵屏蔽,防止誤操作及杜絕安全隱患
8.SSH只使用key驗證方式
9.使用/etc/hosts.allow及/etc/hosts.deny做IP地址訪問過濾
以下腳本是通過log日志將非法連接的IP列入/etc/hosts.deny的黑名單
# !/bin/bash
# 為防止自身地址被列入黑名單,可以先將自身IP加入/etc/hosts.allow
# 查找***20條日志中非法連接和嘗試連接失敗的IP地址
tail -20 /var/log/secure|awk '$0~/Illegal|Failed/'|awk -Ffrom '{print $2}'|awk '{print $1}' >/tmp/badip
# 讀取/etc/hosts.deny中有關(guān)sshd的地址定義
list=`grep sshd /etc/hosts.deny`
# 判斷日志中非法連接IP的連接數(shù)超過5時列入黑名單
if [ "`wc -l /tmp/badip|awk '{print $1}'`" > "5" -a "`sort -u /tmp/badip|wc -l|awk '{print $1}'`" = "1" ]
then
blockip=`head -1 /tmp/badip`
if [ `grep $blockip /etc/hosts.deny|wc -l|awk '{print $1}'` != 1 ]
then
echo "$list $blockip" >/etc/hosts.deny
fi
fi
#p#
我們通過一個例子來大致理解一 下它是如何工作的。比如,我想通過Internet連接發(fā)布我們的網(wǎng)站,但是HTTP server在我們的內(nèi)網(wǎng)里,而 且我們對外只有一個合法的IP,就是防火墻那個對外的IP——$INET_IP。防火墻還 有一個內(nèi)網(wǎng)的IP——$LAN_IP,HTTP server的IP是$HTTP_IP (這當(dāng)然是內(nèi)網(wǎng)的了)。為了完成我們的設(shè)想,要做的***件事就是把下面的這個簡單的規(guī)則加入到nat表 的PREROUTING鏈中:
iptables -t nat -A PREROUTING –dst $INET_IP -p tcp –dport 80 -j DNAT \ –to-destination $HTTP_IP
現(xiàn)在,所有從Internet來的、到防火墻的80端口去的包都會被轉(zhuǎn)發(fā)(或稱做被DNAT )到在內(nèi)網(wǎng)的HTTP服務(wù)器上。如果你在Internet上試驗一下,一切正常吧。再從內(nèi)網(wǎng)里試驗一下,完全 不能用吧。這其實是路由的問題。下面我們來好好分析這個問題。為了容易閱讀,我們把在外網(wǎng)上訪問我們 服務(wù)器的那臺機子的IP地址記為$EXT_BOX。
1.包從地址為$EXT_BOX的機子出發(fā),去往地址為$INET_IP 的機子。
2.包到達(dá)防火墻。
3.防火墻DNAT(也就是轉(zhuǎn)發(fā))這個包,而且包會經(jīng)過很多其他的鏈檢驗及處理。
4.包離開防火墻向$HTTP_IP前進(jìn)。
5.包到達(dá)HTTP服務(wù)器,服務(wù)器就會通過防火墻給以回應(yīng),當(dāng)然,這要求把防火墻作為HTTP到達(dá)$EXT_BOX的網(wǎng)關(guān)。一般情況下,防火墻就是HTTP服務(wù)器的缺省網(wǎng)關(guān)。
6.防火墻再對返回包做Un-DNAT(就是照著DNAT的步驟反過來做一遍),這樣就 好像是防火墻自己回復(fù)了那個來自外網(wǎng)的請求包。
7.返回包好象沒經(jīng)過這么復(fù)雜的處理、沒事一樣回到$EXT_BOX。
現(xiàn)在,我們來考慮和HTTP服務(wù)器在同一個內(nèi)網(wǎng)(這里是指所有機子不需要經(jīng)過路由器而可以直接互相訪 問的網(wǎng)絡(luò),不是那種把服務(wù)器和客戶機又分在不同子網(wǎng)的情況)的客戶訪問它時會發(fā)生什么。我們假設(shè)客戶 機的IP為$LAN_BOX,其他設(shè)置同上。
1.包離開$LAN_BOX,去往$INET_IP。
2.包到達(dá)防火墻。
3.包被DNAT,而且還會經(jīng)過其他的處理。但是包沒有經(jīng)過SNAT 的處理,所以包還是使用它自己的源地址,就是$LAN_BOX(譯者注:這就是IP 傳輸包的特點,只根據(jù)目的地的不同改變目的地址,但不因傳輸過程中要經(jīng)過很多路由器而隨著路由器改變 其源地址,除非你單獨進(jìn)行源地址的改變。其實這一步的處理和對外來包的處理是一樣的,只不過內(nèi)網(wǎng)包的 問題就在于此,所以這里交待一下原因)。
4.包離開防火墻,到達(dá)HTTP服務(wù)器。
5.HTTP服務(wù)器試圖回復(fù)這個包。它在路由數(shù)據(jù)庫中看到包是來自同一個網(wǎng)絡(luò)的一臺機子,因此它會把回 復(fù)包直接發(fā)送到請求包的源地址(現(xiàn)在是回復(fù)包的目的地址),也就是$LAN_BOX。
6.回復(fù)包到達(dá)客戶機,但它會很困惑,因為這個包不是來自它訪問的那臺機子。這樣,它就會把這個包 扔掉而去等待“真正”的回復(fù)包。
針對這個問題有個簡單的解決辦法,因為這些包都要進(jìn)入防火墻,而且它們都去往需要做DNAT才能到達(dá) 的那個地址,所以我們只要對這些包做SNAT操作即可。比如,我們來考慮上面的例子,如果對那些進(jìn)入防火 墻而且是去往地址為$HTTP_IP、端口為80的包做SNAT操作,那么這些包就好象是從$LAN_IP來的了,也就是 說,這些包的源地址被改為$LAN_IP了。這樣,HTTP服務(wù)器就會把回復(fù)包發(fā)給防火墻,而防火墻會再對包做 Un-DNAT操作,并把包發(fā)送到客戶機。解決問題的規(guī)則如下:
iptables -t nat -A POSTROUTING -p tcp –dst $HTTP_IP –dport 80 -j SNAT \ –to-source $LAN_IP
要記住,按運行的順序POSTROUTING鏈?zhǔn)撬墟溨?**一個,因此包到 達(dá)這條鏈時,已經(jīng)被做過DNAT操作了,所以我們在規(guī)則里要基于內(nèi)網(wǎng)的地址$HTTP_IP(包的目的地)來匹配包。
警告:我們剛才寫的這條規(guī)則會對日志產(chǎn)生很大影響,這種影響應(yīng)該說是很不好的。因為來自 Internet包在防火墻內(nèi)先后經(jīng)過了DNAT和SNAT處理,才能到達(dá)HTTP服務(wù)器(上面的例子),所以HTTP服務(wù)器 就認(rèn)為包是防火墻發(fā)來的,而不知道真正的源頭是其他的IP。這樣,當(dāng)它記錄服務(wù)情況時,所有訪問記錄的 源地址都是防火墻的IP而不是真正的訪問源。我們?nèi)绻敫鶕?jù)這些記錄來了解訪問情況就不可能了。因此上 面提供的“簡單辦法”并不是一個明智的選擇,但它確實可以解決“能夠訪問”的問題,只是沒有考慮到日 志而已。
其他的服務(wù)也有類似的問題。比如,你在LAN內(nèi)建立了SMTP服務(wù)器,那你就要設(shè)置防火墻以便能轉(zhuǎn) 發(fā)SMTP的數(shù)據(jù)流。這樣你就創(chuàng)建了一個開放的SMTP中繼服務(wù)器,隨之而來的就是日志的問題了。
一定要注意,這里所說的問題只是針對沒有建立DMZ或類似結(jié)構(gòu)的網(wǎng)絡(luò),并且內(nèi)網(wǎng)的用戶訪問的是 服務(wù)器的外網(wǎng)地址而言的。(譯者注:因為如果建立了DMZ,或者服務(wù)器和客戶機又被分在不同的子網(wǎng)里, 那就不需要這么麻煩了。因為所有訪問的源頭都不在服務(wù)器所在的網(wǎng)里,所以就沒必要做SNAT去改變包的源 地址了,從而記錄也就不是問題了。如果內(nèi)網(wǎng)客戶是直接訪問服務(wù)器的內(nèi)網(wǎng)地址那就更沒事了)
較好的解決辦法是為你的LAN在內(nèi)網(wǎng)建立一臺單獨的DNS服務(wù)器(譯者注:這樣,內(nèi)網(wǎng)的客戶使用網(wǎng)站名 訪問HTTP服務(wù)器時,DNS就可以把它解析成內(nèi)網(wǎng)地址??蛻魴C就可以直接去訪問HTTP服務(wù)器的內(nèi)網(wǎng)地址了, 從而避免了通過防火墻的操作,而且包的源地址也可以被HTTP服務(wù)器的日志使用,也就沒有上面說的日志問 題了。),或者干脆建立DMZ得了(這是***的辦法,但你要有錢哦,因為用的設(shè)備多啊)。
對上面的例子應(yīng)該考慮再全面些,現(xiàn)在還有一個問題沒解決,就是防火墻自己要訪問HTTP服務(wù)器時會發(fā) 生什么,能正常訪問嗎?你覺得呢:)很可惜,現(xiàn)在的配置還是不行,仔細(xì)想想就明白了。我們這里討論的基 礎(chǔ)都是假設(shè)機子訪問的是HTTP服務(wù)器的外網(wǎng)地址,但這個外網(wǎng)地址其實就是防火墻對外的地址,所以當(dāng)防火 墻訪問這個外網(wǎng)地址時,就是訪問它自己。防火墻上如果有HTTP服務(wù),那客戶機就會看到頁面內(nèi)容,不過這 不是它想看到的(它想要的在DNAT上了),如果沒有HTTP服務(wù),客戶就只能收到錯 誤信息了。前面給出的規(guī)則之所以不起作用是因為從防火墻發(fā)出的請求包不會經(jīng)過那兩條鏈。還記得防火墻 自己發(fā)出的包經(jīng)過哪些鏈吧:)我們要在nat表的OUTPUT鏈中添加下面的規(guī)則:
iptables -t nat -A OUTPUT –dst $INET_IP -p tcp –dport 80 -j DNAT \ –to-destination $HTTP_IP
有了***這條規(guī)則,一切都正常了。和HTTP服務(wù)器不在同一個網(wǎng)的機子能正常訪問服務(wù)了,和它在一個 網(wǎng)內(nèi)的機子也可以正常訪問服務(wù)了,防火墻本身也能正常訪問服務(wù)了,沒有什么問題了。這種心情,套用 《大話西游》里的一句話,就是“世界又清凈了”。(不要說你不知道什么是《大話西游》)
我想大家應(yīng)該能明白這些規(guī)則只說明了數(shù)據(jù)包是如何恰當(dāng)?shù)乇籇NAT和SNAT的。除此之外,在 filter表中還需要其他的規(guī)則(在FORWARD鏈里),以允許特定的包也能經(jīng)過前面寫的(在POSTROUTING鏈和 OUTPUT鏈里的)規(guī)則。千萬不要忘了,那些包在到達(dá)FORWARD鏈之前已經(jīng)在PREROUTING鏈里被DNAT過了,也 就是說它們的目的地址已被改寫,在寫規(guī)則時要注意這一點。
通過文章的介紹,相信大家都學(xué)會了iptables nat的建立和應(yīng)用,希望本文對大家有幫助!
【編輯推薦】
- iptables+NAT+端口映射
- 如何查看iptables關(guān)于nat的日志
- RedHat 9上用iptables做NAT網(wǎng)和記錄日志
- iptables下開放ftp連接
- Linux iptables將nat中內(nèi)網(wǎng)多臺ftp服務(wù)器映射出去
- Linux Iptables 內(nèi)核添加time模塊
- Linux防火墻Iptables入門筆記