關于IP Tables
在初始化設置系統后,為了讓系統更安全,Ubuntu把Iptabls作為發行版的默認防火墻。起初,盡管Ubuntu防火墻已經被配置了,但是它設置為通過一個虛擬主機允許所有的進入與流出流量。要打開服務器上某些更強的保護功能,我們需要在IP Table山增加一些基礎的規則。
IP Table 規則來自于一系列可以組合起來創建各自的特定的處理方法的選項。每一個通過防火墻的包被所有的規則按順序檢查,一旦符合某個規則,這個報文包就遵循相關的動作,否則就處理下一行。
IP Table 命令
盡管這個教程只會涉及有限的一些命令,這些命令能夠提供給服務器一些基本安全,然后卻可以為IP Table提供大量的細致與具體的用例。下面是配置VPS防火墻最有用的命令中的一部分,請在腦海中保持一根弦:下面只是一個很短的列表,還有大量的其他可選參數。
-A:(Append), 增加一條規則到IP Table中;
-L:(List),顯示當前規則;
-m conntrack: 允許規則基于當前的連接狀態,詳細指定使用 --cstate 命令;
--cstate: 解釋當前連接可以進入的狀態,有4種,分別是: New, Related, Established, Invalid;
-p:(protocal),指向要被檢查的規則或包的協議,指定的協議可以是tcp,upd,updlite,icmp,esp,ah,sctp,中的一種或者特殊的關鍵詞
"all"
--dport:(port),指向機器連接通過的端口;
-j:(junp),這個參數指明當有滿足一條規則的事件發生,那么就要采取的動作。它被轉換為如下四種可能中的一種
- -ACCEPT:這個包被接收,沒有更進一步的規則需要處理;
- -REJECT:這個包被拒絕了,同時通知發送者,沒有更進一步的規則需要處理;
- -DROP:這個包被拒絕了,但是不會通知發送者,沒有更進一步的規則需要處理;
- -LOG:這個包被接收,同時被日志記錄,接下來的規則會繼續被執行;
-I:(Insert),在前兩個之間插入一條規則;
-I INPUT 3:插入一條規則到IP Table中,并且讓它成為列表中的第三個;
-v:(verbose),提供關于一條規則的更多的細節;
建立一個IP Table
如果你輸入以下命令,可以在虛擬主機上看到當前的IP Table
sudo iptables -L
顯示出來的內容應該類似下面這樣:
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
如果你在某處有一個不同的規則集或者你想要開始一個新的,你總是可以通過刷新與刪除所有規則以使規則被還原為默認的。
sudo iptables -F
更進一步,如果你想用IP Table來提高你的工作速度,你可以在命令中使用 -n,這個參數屏蔽掉DNS查詢,阻止那些嘗試從規則集中反轉找出每一個ip的命令,你可以用這個命令列出規則來,比如下面這樣:
iptables -L -n
一個基本的防火墻
基于表示當前運行所有連接的規則,即傳入和傳出。無論怎樣都么有安全可言。在我們建立table時,需要隨時保持一根弦的就是,一旦一個包被ACCEPTED,REJECTED,DROPPED,那么就不會有更進一步的規則被執行了。即規則中第一個比后一個有優先權。
當創建規則時,我們必須保證不因意外的屏蔽SSH而阻止了我們自己。
開始時,我們必須要保證允許當前所以的連接,當創建規則時所有的連接會保持在線。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
讓我們開始來分析這段命令的意思:
- -A 告訴IP Table增加一條規則到table中;
- INPUT 指定這條規則是輸入鏈的一部分;
- m conntrack 后續跟著 -csstat ESTABLISHED,RELATED表明這條規則只能當前存在的連接和與它相關的連接起作用;
- -j ACCEPT 判斷這個包跳轉到接收,而這個連接不會改變;
在我們保證了當前vps上連接不會被中斷后,我們可以著手開始屏蔽掉不安全的連接。
我們假設想要屏蔽掉除了給ssh用的22端口和web服務的80端口外的其他傳入流量。我們通過使用下面的規則來允許指定端口上的所有流量:
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
在這兩條命令中, -p 參數代表連接使用的協議,在這里是tcp,--dport指定傳遞的包通過的端口
在我們保證了有價值的通信將會通過防火墻后,我們可以通過屏蔽掉所有剩下的進入vps的通信來結束規則。因為這是規則列表中的最后一條,任何一個滿足上面一條規則的通信都不會被此條規則影響到,它們會被我們之前的定義所處理。
下面就開始定義屏蔽掉所有剩下通信的規則:
sudo iptables -A INPUT -j DROP
通過上面的定義,我們更新后的規則類似于下面這樣:
sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP all -- anywhere anywhere
我們基本上快結束了。然后,我們忘記了一個規則,我們需要提供我們的vps的回環訪問。如果我們現在打算添加的規則沒有更多的限定語,它將是規則列表的最后一條,因為它在屏蔽掉所有通信的后面,所以它不會產生作用。
為了避免這種情況,我們需要把這條規則添加到列表的第一條,使用如下的命令:
sudo iptables -I INPUT 1 -i lo -j ACCEPT
- -I INPUT 1 把這條命令放在規則表的第一條;
- lo 指向回環接口;
- -j ACCEPT保證回環通信能被接收;
到目前為止,我們已經創建了一個基本的防火墻,你的規則應該類似于這樣(我們可以使用 -v來查看iptable的詳細信息):
sudo iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
1289 93442 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
2 212 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
47 2422 DROP all -- any any anywhere anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
pkts bytes target prot opt in out source destination
然而,當vps重啟后,IP Table就被清除掉了,下一步就是保存與恢復IP Tables。
保存IP Tables
雖然IP Tables非常的有用,如果服務器重啟,那么他們會被自動的刪除。為了保證他們永遠有效,我們可以使用一個叫做IP-Tables persistent軟件包。
我們可以通過apt-get 來安裝這個軟件包:
sudo apt-get install iptables-persistent
安裝過程中,你將會被詢是否同時保存IPv4和IPv6規則,選擇yes。
你的規則稍后就可以被保存在 /etc/iptables/rules.v4和/etc/iptables/rules.v6中。
當安裝完成后,運行下面這個命令啟動iptables-persistent:
sudo service iptables-persistent start
后續無論怎么重啟服務器,你的規則都保存在那里。
保存您的防火墻股則到一個文件
# 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
封單個IP的命令是:
代碼如下 | 復制代碼 |
iptables -I INPUT -s 211.1.0.0 -j DROP
|
封IP段的命令是:
代碼如下 | 復制代碼 |
iptables -I INPUT -s 211.1.0.0/16 -j DROP iptables -I INPUT -s 211.2.0.0/16 -j DROP iptables -I INPUT -s 211.3.0.0/16 -j DROP |
封整個段的命令是:
代碼如下 | 復制代碼 |
iptables -I INPUT -s 211.0.0.0/8 -j DROP |
封幾個段的命令是:
代碼如下 | 復制代碼 |
iptables -I INPUT -s 61.37.80.0/24 -j DROP iptables -I INPUT -s 61.37.81.0/24 -j DROP |
vi /etc/sysconfig/iptables里:RH-Firewall-1-INPUT - [0:0]下面添加一行
下面是只允許某個IP訪問xx端口
代碼如下 | 復制代碼 |
-A INPUT -s 192.168.5.244 -j DROP |
以上是臨時設置。
解封的話:
代碼如下 | 復制代碼 |
iptables -D INPUT -s IP地址 -j REJECT iptables -F 全清掉了 |
防止同步包洪水(Sync Flood)
代碼如下 | 復制代碼 |
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT |
防止各種端口掃描
代碼如下 | 復制代碼 |
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT |
Ping 洪水攻擊(Ping of Death)
代碼如下 | 復制代碼 |
# iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT |
1. 查看本機關于IPTABLES的設置情況
2. 清除原有規則
# iptables -F 清除預設表filter中的所有規則鏈的規則
# iptables -X 清除預設表filter中使用者自定鏈中的規則
=========================================================================================================================================
Iptables是一個防火墻,所有的Ubuntu官方發行版(Ubuntu,Kubuntu,Xubuntu)都默認自帶Iptables。當你安裝完Ubuntu以后,Iptables就已經裝好了,但是默認設置是允許所有的通訊。從Ubuntu 8.04版本開始,Ubuntu有了一個防火墻配置的GUI工具UFW。
ubuntu下跟其他linux系統的操作基本相同,可能略有不同。
iptables命令的選項很多,多使用man吧。
查看本機設置
查看本機的Iptables設置使用下面的命令:
通過iso文件剛安裝完的純凈的ubuntu,查看一下防火墻設置的話,是這樣沒有任何規則的:
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 -F //清除預設表filter中的所有規則鏈的規則
iptables -X //清除預設表filter中使用者自定鏈中的規則
設定預設規則
這樣就清除干凈了,下面開始配置,先設定預設規則。
對于防火墻的設置,有兩種策略:一種是全部通訊口都允許使用,只是阻止一些我們知道的不安全的或者容易被利用的口;另外一種,則是先屏蔽所有的通訊口,而只是允許我們需要使用的通訊端口。
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
注意-P中的P需要大寫,表示Protocol。
可以看出INPUT,FORWARD兩個鏈采用的是允許什么包通過,而OUTPUT鏈采用的是不允許什么包通過。
當超出了IPTABLES里filter表里的兩個鏈規則(INPUT、FORWARD)時,不在這兩個規則里的數據包怎么處理呢,那就是DROP(放棄)。應該說這樣配置是很安全的,我們要控制流入數據包。
而對于OUTPUT鏈,也就是流出的包我們不用做太多限制,而是采取ACCEPT,也就是說,不在這個規則里的包怎么辦呢,那就是通過。
添加規則
先來添加INPUT規則,因為INPUT預設的是DROP,所以要添加ACCEPT規則。
首先是22端口,這個的用處地球人都知道。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
或者,你不寫22,寫ssh也可以。
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
給Web服務器開啟80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
給FTP服務開啟20和21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
給郵件服務開啟25和110端口
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
對于OUTPUT規則,因為預設的是ACCEPT,所以要添加DROP規則,減少不安全的端口鏈接。
iptables -A OUTPUT -p tcp --sport 31337 -j DROP
iptables -A OUTPUT -p tcp --dport 31337 -j DROP
具體要DROP掉哪些端口,可以查詢相關的資料,可以把一些黑客常用的掃描端口全部DROP掉,多多少少提高一點服務器的安全性。
我們還可以把規則限制到只允許某個IP:
iptables -A INPUT -s 192.168.0.18 -p tcp --dport 22 -j ACCEPT
這表示只允許192.168.0.18的機器進行SSH連接。
如果要允許一個IP段,可以使用下面的寫法:
iptables -A INPUT -s 192.168.0.1/255 -p tcp --dport 22 -j ACCEPT
這表示允許192.168.0.1/255IP段的機器進行連接。
但是,注意我們前面已經添加一條規則來允許所有IP連接22端口,需要把這條規則刪除掉。
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
對于FORWARD規則,因為預設的是DROP,所以要添加ACCEPT規則。
開啟轉發功能
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的TCP包
iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止攻擊,允許每秒100個
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
Iptables的保存和調用
現在該提一下保存的問題了。
我們用命令來添加的設置,都不會自動保存,一旦退出,設置都將不存在了,需要手動去保存一下。
iptables-save >/etc/iptables.up.rules
把剛才設置的規則保存到指定的地方,文件名可以自定義。
調用Iptables設置
iptables-restore >/etc/iptables.up.rules
由于每次開機或重啟后都需要去調用一次,我們把它設置自動的,執行
sudo gedit /etc/network/interfaces
在
auto ath0
iface ath0 inet dhcp
后面,加上
pre-up iptables-restore >/etc/iptables.up.rules //開機時自動調用已經存在的Iptables設置
post-down iptables-save >/etc/iptables.up.rule //關機時自動保存當前的Iptables設置
posted on 2015-10-31 15:51
Alpha 閱讀(2573)
評論(0) 編輯 收藏 所屬分類:
Linux Nginx