2016年7月2日 星期六

iptables 學習小筆記

這一篇是寫給自己看的!
之前雖然也用過iptables,但都只是做為單機上的防火牆,這次是拿它做閘道器兼網路防火牆,在設定過程中曾遇到一些問題,上網尋找解答時,似乎都單從 iptables 的「理論面」回答,因此問題一直無法解決,最後才發現自己耍白癡,忘了ARP的存在,相信也有很多人跟我有相同的遭遇(不然怎麼發問的那麼多,卻找不一篇解答)。
iptables的基本元素:
iptables共有三組規則定義表:filternat、managle,這三張表在不同時期會有不同作用,可參考下圖:(這張圖是參考:http://www.spps.tp.edu.tw/documents/memo/iptables/iptables.htmhttp://linux.vbird.org/linux_server/0250simple_firewall.php#netfilter_chain 繪製而成,在此致謝!)
由上面這張圖可以清楚看到各個規則定義表所支援的規則類型(如 PREROUTINGINPUT)。 了解上圖的 iptables 流程對撰寫規則會很有幫助。
查看iptable內容的指令:
iptables -L [-n] [-t 表格名稱] [規格鏈]           ;顯示規格鏈的內容
iptables -S [-t 表格名稱] [規格鏈]                ;顯示完成的設定命令內容
-n 是直接顯示 IP 位址,而不要進行名稱反解,速度會比較快,尤其無法連線到 DNS 伺服器時,若不加 -n 會發現顯示速度很慢。
例如:
用「 iptables -A INPUT -p tcp j ACCEPT 」建立一條規則鏈之後,使用 「iptables -S」 會列出:
-A INPUT -p tcp j ACCEPT      (就是我們輸入的規則內容)
而改用「 iptables -L 」則會列出:
ACCEPT tcp -- anywhere anywhere
所在進行除錯時,可以交替使用 -S 及 -L 選項。

有關 iptables 指令的運用,網路上已經有一堆的文章,在此不另贅述,下列資訊是較少有人提到:
iptables 的規則鏈維護指令中的 -I(插入) 及 -D(刪除)會用到規則鏈的編號,可是不論用 -L 或 -S 列出規則表,都沒有編號這個欄位,其實只在使用 -L 時加入 --line-number 選項,就會在每條規則的前頭顯示編號。

>我的環境要求:
為了建立一組模擬企業網路環境的滲透測試環境,我在一臺筆電上開了七臺虛擬機(如下圖),其中三臺在VMWare DHCP之後,做為企業內部的私有網路,一般而言是不可能由外部網路主動連線到這三臺機器。
四臺 192.168.5.xx 的機器做為企業的對外伺服器,可供內部或外部使用者存取,同時又受防火牆的保護。
上圖的 Ex_NET是防火牆對外的網卡,In_net是對內的網卡。為了保護企業的伺服器(192.168.5.xx),因此防火牆有下列要求:
(一)從 .1.1 這一端不能直接存取實體機的網路 .5.d,.5.d 每次開機時向防火牆上的 DHCP 取得網址。
(二) .5.10 ~ .5.13 雖做為對外服務的伺服器,但不能直接連線到這些網址,因此防火牆上必須進行 nat 轉址,假設 192.168.1.10 對應到 192.168.5.10,192.168.1.11 對應到 192.168.5.11,...  依此類推。
上面的要求,如果外部機器(如192.168.1.100)想連線到 192.168.5.10,則必須指定目標位址是 192.168.1.10,如果直接指定 192.168.5.10  是無法連線的。
因此設計設四條 nat 規則,將 192.168.1.10 ~ 13 轉換成 192.168.5.10 ~ 13:
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.1.10 -j DNAT --to-destination 192.168.5.10
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.1.11 -j DNAT --to-destination 192.168.5.11
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.1.12 -j DNAT --to-destination 192.168.5.12
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.1.13 -j DNAT --to-destination 192.168.5.13
但又要限制不能直接連線 192.168.5.10 ~ 13 ,所以再利用下面四條規則,將它轉到不存在的位址:
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.5.10 -j DNAT --to-destination 192.168.5.9
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.5.11 -j DNAT --to-destination 192.168.5.9
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.5.12 -j DNAT --to-destination 192.168.5.9
iptables -t nat -A PREROUTING -i Ex_NET -d 192.168.5.13 -j DNAT --to-destination 192.168.5.9
192.168.5.9 必須是一組沒有使用的位址,或者將它做成密罐(honey pot)

為什麼不能使用「iptables -A INPUT -i Ex_NET -d 192.168.5.0/24 -j DROP」,因為 192.168.5.0 的封包不是送到本機,並不會經過 INPUT 規則鏈。
那又為什麼不能使用「iptables -A FORWARDT -i Ex_NET -d 192.168.5.0/24 -j DROP」,因為 FOWWARD 是在 nat/PREROUTING之後,此時 .1.10 已經轉換成 .5.10,如果用這一條規則,會讓轉址的封包被封鎖掉。

我遇到的問題:
一切看起來都很合理,但實際測試時,卻完全連不到伺服器。一直懷疑是哪條規則設錯了,其實不是iptables 的問題,只要在 Ex_NET 的網卡加上 192.168.1.10 ~ 192.168.1.13 的網址就解決了(一張網卡可以綁多組網址)。

在網路上找了很多資料,大家都在討論規則的寫法、順序,卻沒有人提醒網址轉換要注意是否有綁定多組網址,網卡沒有綁定到的網址,發送端根本不知道要將封包送給到哪一張網卡,到不了網卡,當然就不會執行轉址作業。

沒有留言:

張貼留言