Linux防火墻iptables初學者教程
Iptables是專為Linux操作系統打造的極其靈活的防火墻工具。對Linux極客玩家和系統管理員來說,iptables非常有用。本文將向你展示如何配置最通用的Linux防火墻。
關于iptablesIptables是一個基于命令行的防火墻工具,它使用規則鏈來允許/阻止網絡流量。當一條網絡連接試圖在你的系統中建立時,iptables會查找其對應的匹配規則。如果找不到,iptables將對其采取默認操作。幾乎所有的Linux發行版都預裝了iptables。在Ubuntu/Debian中更新/安裝iptables的命令為:
sudo apt-get install iptables
現有的一些圖形界面軟件也可以替代iptables,如Firestarter。但iptables用起來并不難。配置iptables的規則時要特別小心,特別是在你遠程登陸服務器的時候。因為這時的一個錯誤有可能讓你和服務器永久失去連接,而你必須要到服務器面前才能解決它。
Iptables規則鏈的類型Iptables的規則鏈分為三種:輸入、轉發和輸出。
輸入——這條鏈用來過濾目的地址是本機的連接。例如,如果一個用戶試圖使用SSH登陸到你的PC/服務器,iptables會首先匹配其IP地址和端口到iptables的輸入鏈規則。
轉發——這條鏈用來過濾目的地址和源地址都不是本機的連接。例如,路由器收到的絕大數數據均需要轉發給其它主機。如果你的系統沒有開啟類似于路由器的功能,如NATing,你就不需要使用這條鏈。有一個安全且可靠的方法可以檢測你的系統是否需要轉發鏈:iptables -L -v

輸出——這條鏈用來過濾源地址是本機的連接。例如,當你嘗試ping howtogeek.com時,iptables會檢查輸出鏈中與ping和howtogeek.com相關的規則,然后決定允許還是拒絕你的連接請求。
注意:當ping一臺外部主機時,看上去好像只是輸出鏈在起作用。但是請記住,外部主機返回的數據要經過輸入鏈的過濾。當配置iptables規則時,請牢記許多協議都需要雙向通信,所以你需要同時配置輸入鏈和輸出鏈。人們在配置SSH的時候通常會忘記在輸入鏈和輸出鏈都配置它。
鏈的默認行為在配置特定的規則之前,也許你想配置這些鏈的默認行為。換句話說,當iptables無法匹配現存的規則時,你想讓它作出何種行為。你可以運行如下的命令來顯示當前iptables對無法匹配的連接的默認動作:
iptables -L
正如上面所顯示的,我們可以使用grep來使輸出的結果變得更加簡潔。在上面的截圖中,所有的鏈默認情況下均接受所有的連接。通常情況下,你會希望你的系統默認情況下接收所有的網絡數據。這種設定也是iptables的默認配置。接收網絡連接的配置命令是:
iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT iptables --policy FORWARD ACCEPT
你也可以在使用默認配置的情況下,添加一些命令來過濾特定的IP地址或端口號。我們稍后在本文介紹這些命令。如果你想默認情況下拒絕所有的網絡連接,然后在其基礎上添加允許的IP地址或端口號,你可以將默認配置中的ACCEPT變成DROP,如下圖所示。這對于一些含有敏感數據的服務器來說是極其有用的。通常這些服務器只允許特定的IP地址訪問它們。
iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP 對特定連接的配置
下面來看看如何對特定的IP地址或端口作出設定。本文主要介紹三種最基本和常見的設定。
Accept – 接收所有的數據。Drop – 丟棄數據。應用場景:當你不想讓數據的來源地址意識到你的系統的存在(最好的處理方法)。Reject – 不允許建立連接,但是返回一個錯誤回應。應用場景:當你不想讓某個IP地址訪問你的系統,但又想讓它們知道你的防火墻阻止了其訪問。為了直觀的區分上述三種情況,我們使用一臺PC來ping一臺配置了iptables的Linux電腦:
在配置完基本的規則鏈之后,你就可以配置iptables來允許或者阻止特定的IP地址或者端口。注意:在這些例子中,我們使用iptables -A將額外的規則添加到現存的鏈中。Iptables在執行匹配的時候,會從列表的頂端開始搜索。你可以使用iptables -I [chain] [number]將新的規則插入到列表的指定位置。
來自同一IP地址的連接下面這個例子展示了如何阻止來自IP地址為10.10.10.10的所有連接。
iptables -A INPUT -s 10.10.10.10 -j DROP
來自一組IP地址的連接下面這個例子展示了如何阻止來自子網10.10.10.0/24內的任意IP地址的連接。你可以使用子網掩碼或者標準的/符號來標示一個子網:
iptables -A INPUT -s 10.10.10.0/24 -j DROP
或
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
特定端口的連接這個例子展示了如何阻止來自10.10.10.10的SSH連接。
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
你可以將“ssh”替換成其它任何協議或者端口號。上述命令中的-p tcp告訴iptables連接使用的是何種協議。
下面這個例子展示了如何阻止來自任意IP地址的SSH連接。
iptables -A INPUT -p tcp --dport ssh -j DROP 連接狀態
我們之前提到過,許多協議均需要雙向通信。例如,如果你打算允許SSH連接,你必須同時配置輸入和輸出鏈。但是,如果你只想允許來自外部的SSH請求,那該怎么做?下面這個例子展示了如何允許源IP地址為10.10.10.10同時阻止目的地址為10.10.10.10的SSH連接:
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT保存更改
上述方法對iptables規則作出的改變是臨時的。如果你想永久保存這些更改,你需要運行額外的命令(不同Linux發行版下的保存命令也不相同):
Ubuntu:
sudo /sbin/iptables-save
Red Hat / CentOS:
/sbin/service iptables save
或者
/etc/init.d/iptables save其它命令
列出iptables的當前配置:
iptables -L
使用-v選項將顯示數據包和字節信息;使用-n選項將以數字形式列出信息,即不將IP地址解析為域名。換句話講,主機名,協議和網絡都以數字的形式列出。
清除當前所有的配置規則:
iptables -F
原文 The Beginner’s Guide to iptables, the Linux Firewall
相關文章:
