一、防火牆基礎linux
linux防火牆主要工做在網絡層,針對TCP/IP數據包實施過濾和限制(包過濾防火牆或網絡層防火牆),linux防火牆web
是基於內核編碼實現,具備很是穩定的性能和高效率安全
(1)netfilter:包過濾防火牆:包過濾防火牆是用一個軟件查看所流經的數據包的包頭(header),由此決定整個包的命運。服務器
它可能會決定丟棄(DROP)這個包,可能會接受(ACCEPT)這個包(讓這個包經過),也可能執行其它更復雜的動做。網絡
工做於網絡層,能對IP數據報進行首部檢查。例如:IP源地址,目的地址,源端口和目的端口等。tcp
內核態防火牆體系ide
(2) iptables:指的是用於管理linux防火牆的命令程序性能
用戶態防火牆體系編碼
(3)iptables的錶鏈結構spa
表
1)filter表:用來對數據包進行過濾,根據規則肯定如何處理一個數據包
filter表對應的內核模塊是iptable_filter,表內包含3個鏈
INPUT FORWARD OUTPUT
2) net表:nat(Network Address Translation)網絡地址轉換
主要用來修改IP地址、端口號等信息
net表對應的內核模塊是iptable_nat
PREROUTING POSTROUTING OUTPUT
3) mangle表:mangle表用來修改數據包的TOS服務類型、TTL生存週期、或者爲數據包設置Mark標記
以實現流量×××、策略路由等高級應用
mangle表對應的內核模塊爲iptable_mangle,表內含5個鏈
PREROUTING POSTROUTING INPUT OUTPUT FORWARD
4) raw表:主要用來決定是否對數據包進行狀態跟蹤
raw表對應的內核模塊爲iptable_raw,表內包含兩個鏈
OUTPUT PREROUTING
鏈
1) INPUT鏈: 當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中規則
2)OUTPUT鏈: 當防火牆本機向外發送數據包(出站)時,應用此鏈中規則
3)FORWARD鏈: 當接收到須要經過防火牆中轉發給其餘地址的數據包(轉發)時,應用此鏈中規則
4)PREROUTING鏈:在對數據包作路由選擇以前,應用此鏈中規則
5)POSTROUTING鏈:在對數據包作路由器選擇以後,應用此鏈中規則
4表5鏈
INPUT OUTPUT 主要用在「主機型防火牆」主要針對服務器自己進行保護
FORWARD PREROUTING POSTROUTING 多用在「網絡型防火牆」中,能夠作linux防火牆的網管服務器
在公司內網與互聯網之間進行安全控制
規則之間的順序
raw mangle nat filter
1)入站數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING鏈處理而後進行路由選擇
(判斷該數據包應該發往何處),若是數據包的目標地址是防火牆本機,那麼
內核將其傳遞給INPUT鏈處理
2)轉發數據流向:若是數據包的目標地址是其它外部地址,則內核將其傳遞給FORWARD鏈進行處理
(容許轉發或攔截、丟棄),最後交給POSTROUTING(是否修改數據包地址等)進行處理
3)出站數據流向:首先OUTPUT鏈處理,而後進行路由選擇,再交給POSTROUTING鏈
(是否修改數據包的地址等),進行處理
4)每條鏈內的規則(匹配即中止)若是第一條經過了後續的規則將失效
二、編寫防火牆規則
iptables -t 表名 管理選項 鏈名 匹配條件 -j 控制類型
ACCEPT 容許數據包經過
DROP 丟棄數據包
REJECT 拒絕數據包,必要時會給數據端發送一個相應信息
LOG 在/var/log/messages 文件中記錄日誌信息,而後將數據包傳遞給下一條規則
由於LOG只是一種輔助動做,因此「匹配即中止」,對LOG是個特例,還會繼續匹配
iptables 命令的經常使用的幾個管理選項
-A 在指定鏈的末尾添加一條新的規則
-D 刪除指定鏈中的規則,可指定序號或具體內容
-I 在指定鏈中插入一條新的規則,未指定序號默認做爲第一條規則
-R 修改、替換
-L 列出規則 list
-F 清空規則
-P 設置指定鏈的默認規則
-n 使用數字形式顯示輸出結果
-v 查看規則列表顯示詳細信息
-h 查看命令幫助信息
--line-numbers 查看規則列表時,同時顯示規則在鏈中的序號
一、其它主機沒法ping通主機
iptables -t filter -I INPUT -p icmp -j REJECT
二、在INPUT鏈末尾添加一條容許tcp協議經過的規則
iptables -t filter -A INPUT -p tcp -j ACCEPT
三、在filter表INPUT鏈添加位於表中排序第一的規則和排序第二的規則
iptables -t filter -I INPUT -p udp -j ACCEPT
iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
四、查看規則列表
iptables -L INPUT --line-numbers
iptables -n -L INPUT (數據多用這個減小解析時間)
五、刪除清空列表
iptables -D INPUT 3 #刪除filter表INPUT鏈的第3條信息
iptables -F INPUT #清空file表INPUT鏈中的全部信息
iptables -F #清空filter表
iptables -t nat -F #清空nat表
iptables -t mangle -F #清空mangle表
六、設置默認策略
filter表FORWARD默認策略爲丟棄,OUTPUT鏈默認策略爲容許
iptables -t filter -P FORWARD DROP
iptables -P OUTPUT ACCEPT
七、通用匹配
協議匹配
若要丟棄經過icmp協議訪問防火牆本機的數據包,容許轉發通過防火牆出icmp之外的的數據包
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -P icmp -j ACCEPT
地址匹配
若要拒絕轉發源地址爲192.168.1.11的數據,容許轉發源地址位於192.168.7.0/24網段的數據
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
若檢測到來自某個網段(10.20.30.0/24)的頻繁掃描添加防火牆進行封鎖
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
網絡接口匹配
若要丟棄外網接口(eth1)訪問防火牆本機且源地址爲私有地址的數據包
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
端口匹配
若要容許爲網段192.168.4.0/24轉發DNS查詢數據包
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
構建vsftpd服務器時,若要開放20.21端口,以及用於被動模式的端口範圍24500~24600
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
ICMP類型匹配 #icmp-type檢查icmp協議
iptables -A INPUT -p icmp --icmp-type 8 -j DROP #拒絕其餘請求可是本身能夠ping其它機器
iptables -A INPUT -p icmp --icmp-type 0 -j DROP #我ping其它的主機返回來的信息我接收
iptables -A INPUT -p icmp --icmp-type 3 -j DROP #對方不存在返回值我接收
iptables -A INPUT -p icmp -j DROP #禁止全部機器ping
顯示匹配
若要容許本機開放25.80.110.143端口
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
IP範圍匹配
若要禁止轉發源IP地址位於192.168.4.21與192.168.4.28之間的tcp數據包
iptables -A FORWARD -p tcp -m iprange -src-range 192.168.4.21-192.168.4.28 -j REJECT
MAC地址匹配 -m 模塊
若要根據MAC地址封鎖主機,禁止其訪問本機的任何應用
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -DROP
狀態匹配
若要禁止轉發與正常TCP鏈接無關的非--syn請求的數據包
iptables -A FORWARD -m state --state NEW -p tcp !--syn -j DROP #無正常鏈接的狀態是NEW
#NEW狀態模塊的非syn選項
若只開放本機的web服務(80端口)
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT #插入行首一條將有關聯的包放行
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #緊隨其後添加一條容許80端口開放
iptables -P INPUT DROP #當前兩條規則都沒匹配上執行默認規則丟棄數據包