Linux2.4核心中新增功能指南

  一 本文目的

本文主要是探討 linux 2.4 核心中的iptables 的各種新增功能和使用方法,如何有效地使用這些新增的功能設定企業的防火牆規則,舉例說明了新增功能在企業中的套用。

二 操作環境

redhat linux 7.1自帶的模組化核心,專線連線網際網路,兩塊網卡的防火牆,內部網段為10.0.0.0/255.255.255.0, 防火牆外部網卡接口地址為1.2.3.4。

三 iptables與ipchains的不同之處

1. 內置規則的重新定義,簡單化規則管理linux 核心中內置的input,output,forward規則在新的iptables中,任何一個包僅僅只在這三個規則中的任何一個上套用,或者被input規則擊中,或者被forward規則或者output規則擊中,不象在ipchains中任何一個包如果是穿過這台防火牆總要同時擊中三個規則。

為了說明這種改變,請看下面的代碼。

incoming / outgoing
-->[routing ]--->|forward|------->
[decision] _____/ ^
| |
v ____
___ /
/ linux防火牆 |output|
|input| ____/
___/ ^
| |
----> local process ----

a. 首先,當一個包進來的時候,也就是從乙太網卡進入防火牆,核心首先根據路由表決定包的目標。
b. 如果目標主機就是本機,則如上圖直接進入input鏈,再由本地正在等待該包的進程接收,結束。
c. 否則,如果從乙太網卡進來的包目標不是本機,再看是否核心允許轉發包(可用echo 1> /proc/sys/net/ipv4/ip_forward 打開轉發功能)如果不允許轉發,則包被drop掉,如果允許轉發,則送出本機,結束。這當中決不經過input或者output鏈,因為路由後的目標不是本機,只被轉發規則套用
d. 最後,該linux防火牆主機本身能夠產生包,這種包只經過output鏈出去。

注意: echo 1 > /proc/sys/net/ipv4/ip_forward 和 forward 鏈的區別

前者的意思是是否打開核心的轉發功能,後者是轉發鏈規則只有核心打開轉發功能,一個包才可能被送到轉發鏈上去逐項檢查規則。

如果一台防火牆沒有打開前者的ip轉發功能,則根防火牆相連的兩邊的網路是完全隔離的,如果是一端連到internet上,則只能通過代理防問internet,不可能通過ip偽裝的方式防問。

這樣,任何一個包只可能套用input/output/forward中的一個規則,這種巨大的改進同時也簡單化了防火牆規則管理。

2. iptables 是有狀態的(stateful)。


有狀態的意思是指如果一個包是對從防火牆原先發出去的包的回覆,則自動不用檢查任何規則就立即允許回復包進入並返回給請求者,這樣我們不用設定許多規則定義就可實現應有的功能,在新的核心中使用這種有狀態的能力是強烈地被推薦的,那么如何打開並使用這種功能呢?

我們假定某公司有如下圖所示的典型的internet連線方案:

_______
10.0.0.2 | |
|pc | (10.0.0.1)eth1| |eth0(1.2.3.4)
b|___|_ ___________________|防火牆 |---------internet
(lan: 10.0.0.0/24) | a |
|_______|

可使用下面的規則集使用iptables的有狀態的能力並打開ip偽裝功能。

1 modprobe ip_tables
2 echo 1 > /proc/sys/net/ipv4/ip_forward
3 iptables -f input
4 iptables -f forward
5 iptables -f postrouting -t nat
6 iptables -p forward drop
7 iptables -a forward -s 10.0.0.0/24 -j accept
8 iptables -a forward -i eth0 -m state --state established,related -j
accept
9 iptables -t nat -a postrouting -o eth0 -s 10.0.0.0/24 -j masquerade
10 iptables -a input -p tcp -i eth0 --syn --dport 80 -j accept
11 iptables -a input -p tcp -i eth0 --syn -j drop

註:

1. 當使用redhat 的模組化核心時,裝入ip_tables模組後,以後的命令將根據需要自行裝入需要的模組。
另外注意,如果你裝入了ipchains或者ipfwadm模組,則不能再裝入iptables模組,可用rmmod命令移走它 們再裝入iptables模組。在redhat下,可用ntsysv移走ipchains和iptables標記重啟後運行上面的命令。
或者放入/etc/rc.d/rc.local中自動運行。
2. 第二行打開ip轉發功能。
3. 第三四五行清除input,forward和postrouting鍵規則
4. 第六行設定默認轉發策略是drop,當一個包被轉發轉則套用但不能套用到任何一條轉發規則上則套用默認 規則。
5. 第七行轉發本網段的機器到任何地方去的包。
6. 第八行利用了有狀態的能力,只要是對先前從防火牆外部接口出去的請求包的回覆,允許。
established是指tcp連線,related是指象主動ftp,icmp ping請求等,當回復包到達時,實際上是檢查文 件 /proc/net/ip_conntrack看是否在裡面,如果在表中,則不檢查任何鏈,包允許通過。
7. 第九行打開ip偽裝能力,從eth0齣去的包被重寫源地址後偽裝出去,是源地址snat的特例。這裡要注意的是 -o eth0, 而不是 -i eth0,在iptables中,從一個接口出去的包用 -o,進來的包用 -i
8. 第十行說明如果這台防火牆也是web伺服器,則允許外部的新建立的請求且目標連線埠為80的包可以進入
9. 第十一行對不是目標連線埠是80的所求tcp新的連線請求包,拒絕進入。

註: nat 與 forward 鏈的關係

a. 不管執行任何nat,對包過濾規則看到的源和目的地址是真實的源和目的地址,儘管在執行ip偽裝(dnat)時 會對包進行地址重寫,這一點你可以從檔案/proc/net/ip_conntrack中看到。

b. 如果我們沒有利用iptables的有狀態的能力,象上面的情況,要是允許網段10.0.0.0/24中的機器可以ip偽裝的話,我們不得不加上一條轉發規則 iptables -aforward -d 10.0.0.0/24 -j accept,否則對偽裝包的回覆不會通過轉發鏈回復給內部機器,因為回復包需要通過轉發鏈。

註: 如何證明僅僅一個規則鏈被套用了?

在以前的ipchains中一個包要經過input,forward,output鏈才能從防火牆送出到internet,現在使用iptables,僅僅一個鏈被套用,你可以加入下面的規則測試

iptables -a input -s 10.0.0.2/24 -j drop

上面的這行在iptables中僅僅是指任何本網段的機器當目標就是防火牆時被拒絕,但絕不影響nat和轉發包,這在以前的ipchains中是不可能的。