iptables防火牆

網上看到一篇博文,筆記收藏很久了,找不到原地址,如侵犯您的權益,請及時給我發郵件,我會盡快刪除。

iptables 是一個安裝在Ubuntu Server上的默認防火牆(當然centos、redhat也有)。在正常的ubuntu安裝過程中,iptables是被安裝上了的,但是它默認允許所有的流量(不管防火牆是否是無效的)
關於iptables有價值的信息很多,但是大多都描述的很複雜。如果你想做些基本的配置,下面的 How To 很適合你。 
◆ 基本命令 
鍵入: 

# iptables -L 

列出您當前iptables中在規則。如果您是剛剛建立您的服務器,那麼可能此時還沒有任何規則,而且您應該看到如下: 

Chain INPUT (policy ACCEPT) 
target prot opt source destination 

Chain FORWARD (policy ACCEPT) 
target prot opt source destination 

Chain OUTPUT (policy ACCEPT) 
target prot opt source destination 

◆ 允許建立會話 

我們可以允許建立會話來接受流量: 

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

◆ 在指定端口上允許入站流量 

阻斷所有流量您也可以啓動系統,但是您可能正在通過SSH工作,所有在您阻斷其他流量前有必要允許SSH流量。 

爲了在22端口號(默認的SSH端口)上的允許流量入站,您可以告訴iptables允許您的網卡接受所有的目的端口爲22的TCP流量。 

# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT 

特別的,這將向表中追加(-A)INPUT規則,允許目的端口號爲SSH的所有流量進入接口(-i) eth0,以便iptables完成跳轉(-j)或動作:ACCEPT 

讓我們覈對下這些規則:(這裏僅顯示了少數行,您應該看到更多) 

# iptables -L 
Chain INPUT (policy ACCEPT) 
target prot opt source destination 
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 

現在,讓我們允許所有的web流量 

# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT 

檢查我們現有的規則 

# iptables -L 
Chain INPUT (policy ACCEPT) 
target prot opt source destination 
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 
ACCEPT tcp -- anywhere anywhere tcp dpt:www 

我們已經指定SSH和web端口爲允許通過的TCP流量,但是因爲我們還沒阻斷任何流量,所以到目前爲止所有的流量仍然可以進入。 

◆ 阻斷流量 

一旦一條規則對一個包進行了匹配,其他規則不再對這個包有效。因爲我們的規則首先允許SSH和WEB流量,所以只要我們阻斷所有流量的規則緊跟其後,我們依然能接受我們感興趣的流量。我們要做的僅僅是把阻斷所有流量的規則放在最後,所以我們需要再次用到它。 

# iptables -A INPUT -j DROP 
# iptables -L 
Chain INPUT (policy ACCEPT) 
target prot opt source destination 
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 
ACCEPT tcp -- anywhere anywhere tcp dpt:www 
DROP all -- anywhere anywhere 

因爲我們剛纔沒有指定一個接口或一個協議,所以除了web和ssh流量外其他任何流量都會被阻斷。 

◆ 編輯 iptables 

到目前爲止我們設置過程中唯一的問題是迴環端口(loopbakc)也被阻斷了。我們本可以通過指定 -i eth0 來僅僅丟棄eth0上的數據包,但我們也可以爲迴環端口(loopback)添加一條規則。如果我們追加這條規則,這將太晚了----因爲所有的流量已經 被丟棄。我們必須插入這條跪着到第4行。 

# iptables -I INPUT 4 -i lo -j ACCEPT 
# iptables -L 
Chain INPUT (policy ACCEPT) 
target prot opt source destination 
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 
ACCEPT tcp -- anywhere anywhere tcp dpt:www 
ACCEPT all -- anywhere anywhere 
DROP all -- anywhere anywhere 

最後2行看起來幾乎一樣,因此我們可以讓iptables列的更詳細些。 

# iptables -L -v 

◆ 日誌記錄 

在上面的例子中,所有的流量都不會被記錄。如果您願意在syslog中記錄被丟棄的包, 下面將是最快捷的方式: 

# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 

看 提示 段獲得更多關於logging的ideas. 

◆ 保存 iptables 

如果您現在要重新啓動機器的話,您的iptables配置將會消失。爲了不用每次重新啓動時敲入這些命令,您可以保存你的配置,讓它在系統啓動時自動啓動。你可以通過iptables-save 和iptables-restore命令來保存配置。 


◆ 配置啓動時自動加載規則 

保存您的防火牆股則到一個文件 

# iptables-save > /etc/iptables.up.rules 

接着修改 /etc/network/interfaces 腳本自動應用這些規則(末行是添加的) 

auto eth0 
iface eth0 inet dhcp 
pre-up iptables-restore < /etc/iptables.up.rules 

你也可以準備一組規則冰並自動應用它 

auto eth0 
iface eth0 inet dhcp 
pre-up iptables-restore < /etc/iptables.up.rules 
post-down iptables-restore < /etc/iptables.down.rules 

◆ 提示 
◆ 如果你要在一個規則基礎上手動編輯iptables 

下面的步驟複習了怎樣建立你的防火牆規則,並假定它們相對固定(而且對於大多數人來說它們也應該是)。但是如果你要做許多研究工作,你也許想要你的 iptables在你每次重啓時保存一次。你可以在 /etc/network/interfaces 裏添加像下面的一行: 

pre-up iptables-restore < /etc/iptables.up.rules 
post-down iptables-save > /etc/iptables.up.rules 

"post-down iptables-save > /etc/iptables.up.rules" 此行將保存規則用於下次啓動時使用。 
◆ 用iptables-save/restore來測試規則 

如果你超出了這個指南來編輯iptables,你可能想利用iptables-save和iptables-restore來編輯和測試你的規則。你可以通過使用你喜愛的文本編輯器(此處爲gedit)來打開這些規則文件來完成編輯。 

# iptables-save > /etc/iptables.test.rules 
# gedit /etc/iptables.test.rules 

你會得到一個如下類似的文件(下面是緊接上的例子文件): 

# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006 
*filter 
:INPUT ACCEPT [368:102354] 
:FORWARD ACCEPT [0:0] 
:OUTPUT ACCEPT [92952:20764374] 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 
-A INPUT -j DROP 
COMMIT 
# Completed on Sun Apr 23 06:19:53 2006 

注意到這些都是減去iptables命令的iptables語句。隨意編輯這些命令、完成後保存它們。然後簡單的測試下: 

# iptables-restore < /etc/iptables.test.rules 

測試完畢後,如果你還沒添加iptables-save命令 到 /etc/network/interfaces 裏面,記得不要丟失了你的更改: 

# iptables-save > /etc/iptables.up.rules 

◆ 更詳細的日誌 
爲了在你的syslog中獲得更多細節,你可能想創建一個額外的鏈。下面是個很簡短的例子---我的 /etc/iptables.up.rules ,它將展示我是如何設置iptables記錄到syslog中的: 

# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006 
*filter 
:INPUT ACCEPT [273:55355] 
:FORWARD ACCEPT [0:0] 
:LOGNDROP - [0:0] 
:OUTPUT ACCEPT [92376:20668252] 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -j LOGNDROP 
-A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7 
-A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7 
-A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7 
-A LOGNDROP -j DROP 
COMMIT 
# Completed on Sun Apr 23 05:32:09 2006 

請注意 一個名爲 LOGNDROP的鏈在文件頂部。而且,INPUT鏈底部標準的DROP被替換成了LOGNDROP,同時添加了協議描述so it makes sense looking at the log。最後我們在LOGNDROP鏈尾部丟棄了這些流量。下面的行告訴我們發生了什麼: 

* --limit 設置記錄相同規則到syslog中的次數 
* --log-prefix "Denied..." 添加一個前綴使得在syslog中查找更easy 
* --log-level 7 設置syslog的消息級別 (see man syslog for more detail, but you can probably leave this) 

◆ 禁用防火牆 

如果您要臨時禁用防火牆,您可以通過下面的命令清空所偶的規則: 

# iptables -F 

◆ 輕鬆配置通過 GUI 

新手可以利用 Firetarter(一個gui工具)---倉庫中的可用軟件(新立德或apt-get 獲得)來配置她或他的iptables規則,而需要命令行知識。請查看指南,儘管...... 配置很簡單,但是對於高級用戶來說可能遠遠不能滿足。然而它對於大多數的家庭用戶來說是足夠的...... 。(我)建議您使用firestarter在策略表中將出站配置爲 “限制”,而將您需要的連接類型(如用於http的80、https的443,msn chat的1683等等)加入白名單。您也可以通過它查看進出您計算機的活動連接...... 。防火牆會一直保持下去一旦通過嚮導配置完畢。撥號用戶必須在嚮導中指定它在撥號時自動啓動。 

firestarter主頁: http://www.fs-security.com/ (再次, 倉庫源中可用, 不需要編譯) 指南: http://www.fs-security.com/docs/tutorial.php 

個人筆記:不幸運的是,它沒有阻斷(或詢問用戶)特定應用/程序的選項......。因此,我的理解是一旦啓用了80端口(例如,用於訪問網頁),那麼任何程序都可以通過80端口連接任何服務器、做任何它想做的事......




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章