from http://www.geekfan.net/6921/git
Iptables是專爲Linux操做系統打造的極其靈活的防火牆工具。對Linux極客玩家和系統管理員來講,iptables很是有用。本文將向你展現如何配置最通用的Linux防火牆。github
Iptables是一個基於命令行的防火牆工具,它使用規則鏈來容許/阻止網絡流量。當一條網絡鏈接試圖在你的系統中創建時,iptables會查找其對應的匹配規則。若是找不到,iptables將對其採起默認操做。
幾乎全部的Linux發行版都預裝了iptables。在Ubuntu/Debian中更新/安裝iptables的命令爲:安全
1
|
sudo apt-get install iptables
|
現有的一些圖形界面軟件也能夠替代iptables,如Firestarter。但iptables用起來並不難。配置iptables的規則時要特別當心,特別是在你遠程登錄服務器的時候。由於這時的一個錯誤有可能讓你和服務器永久失去鏈接,而你必需要到服務器面前才能解決它。服務器
Iptables的規則鏈分爲三種:輸入、轉發和輸出。
輸入——這條鏈用來過濾目的地址是本機的鏈接。例如,若是一個用戶試圖使用SSH登錄到你的PC/服務器,iptables會首先匹配其IP地址和端口到iptables的輸入鏈規則。網絡
轉發——這條鏈用來過濾目的地址和源地址都不是本機的鏈接。例如,路由器收到的絕大數數據均須要轉發給其它主機。若是你的系統沒有開啓相似於路由器的功能,如NATing,你就不須要使用這條鏈。
有一個安全且可靠的方法能夠檢測你的系統是否須要轉發鏈:app
1
|
iptables -L -v
|
上圖是對一臺已經運行了幾個星期的服務器的截圖。這臺服務器沒有對輸入和輸出作任何限制。從中能夠看到,輸入鏈和輸出鏈已經分別處理了11GB和17GB的數據,而轉發鏈則沒有處理任何數據。這是由於此服務器沒有開啓相似於路由器的轉發功能。ssh
輸出——這條鏈用來過濾源地址是本機的鏈接。例如,當你嘗試ping howtogeek.com時,iptables會檢查輸出鏈中與ping和howtogeek.com相關的規則,而後決定容許仍是拒絕你的鏈接請求。tcp
注意:當ping一臺外部主機時,看上去好像只是輸出鏈在起做用。可是請記住,外部主機返回的數據要通過輸入鏈的過濾。當配置iptables規則時,請牢記許多協議都須要雙向通訊,因此你須要同時配置輸入鏈和輸出鏈。人們在配置SSH的時候一般會忘記在輸入鏈和輸出鏈都配置它。工具
在配置特定的規則以前,也許你想配置這些鏈的默認行爲。換句話說,當iptables沒法匹配現存的規則時,你想讓它做出何種行爲。
你能夠運行以下的命令來顯示當前iptables對沒法匹配的鏈接的默認動做:spa
1
|
iptables -L
|
正如上面所顯示的,咱們可使用grep來使輸出的結果變得更加簡潔。在上面的截圖中,全部的鏈默認狀況下均接受全部的鏈接。
一般狀況下,你會但願你的系統默認狀況下接收全部的網絡數據。這種設定也是iptables的默認配置。接收網絡鏈接的配置命令是:
1
2
3
|
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
|
你也能夠在使用默認配置的狀況下,添加一些命令來過濾特定的IP地址或端口號。咱們稍後在本文介紹這些命令。
若是你想默認狀況下拒絕全部的網絡鏈接,而後在其基礎上添加容許的IP地址或端口號,你能夠將默認配置中的ACCEPT變成DROP,以下圖所示。這對於一些含有敏感數據的服務器來講是極其有用的。一般這些服務器只容許特定的IP地址訪問它們。
1
2
3
|
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的全部鏈接。
1
|
iptables -A INPUT -s 10.10.10.10 -j DROP
|
來自一組IP地址的鏈接
下面這個例子展現瞭如何阻止來自子網10.10.10.0/24內的任意IP地址的鏈接。你可使用子網掩碼或者標準的/符號來標示一個子網:
1
|
iptables -A INPUT -s 10.10.10.0/24 -j DROP
|
或
1
|
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
|
特定端口的鏈接
這個例子展現瞭如何阻止來自10.10.10.10的SSH鏈接。
1
|
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
|
你能夠將「ssh」替換成其它任何協議或者端口號。上述命令中的-p tcp告訴iptables鏈接使用的是何種協議。
下面這個例子展現瞭如何阻止來自任意IP地址的SSH鏈接。
1
|
iptables -A INPUT -p tcp --dport ssh -j DROP
|
咱們以前提到過,許多協議均須要雙向通訊。例如,若是你打算容許SSH鏈接,你必須同時配置輸入和輸出鏈。可是,若是你只想容許來自外部的SSH請求,那該怎麼作?
下面這個例子展現瞭如何容許源IP地址爲10.10.10.10同時阻止目的地址爲10.10.10.10的SSH鏈接:
1
2
|
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
|
上述方法對iptables規則做出的改變是臨時的。若是你想永久保存這些更改,你須要運行額外的命令(不一樣Linux發行版下的保存命令也不相同):
Ubuntu:
1
|
sudo /sbin/iptables-save
|
Red Hat / CentOS:
1
|
/sbin/service iptables save
|
或者
1
|
/etc/init.d/iptables save
|
列出iptables的當前配置:
1
|
iptables -L
|
使用-v選項將顯示數據包和字節信息;使用-n選項將以數字形式列出信息,即不將IP地址解析爲域名。
換句話講,主機名,協議和網絡都以數字的形式列出。
清除當前全部的配置規則:
1
|
iptables -F
|