1. 程式人生 > >Linux下防火墻學習

Linux下防火墻學習

目標 cmp 計算 dsl 產生 包含 war 增加 永久

1、防火墻淺解
iptables最大的優點是可以配置有狀態的防火墻,帶有連接跟蹤的防火墻就稱為帶有狀態機制的防火墻,相比非狀態防火墻而言更安全,因為可以編寫更縝密的安全過濾策略。
有狀態的防火墻能夠指定並記住為發送或接收信息包所建立的連接狀態,防火墻可以從信息包的連接跟蹤狀態獲得該信息。在決定過濾新的信息包時,防火墻所使用的這些狀態信息可以增加其效率和速度。有四種有效狀態,分別為:ESTABLISHED、INVALID、NEW和RELATED。
ESTABLISHED:指該信息包屬於已建立的連接,該連接一直用於發送和接收信息包且完全有效。
INVALID:該信息包與任何已知的流或連接都不關聯,可能包含錯誤的數據或頭。
NEW:該信息包已經或即將啟動新的連接,或者它與尚未發送和接受信息包的連接相關聯。
RELATED:表示該信息包正在啟動新的連接,或者它與已建立的連接相關聯。

2、防火墻基本語法
對數據報而言,有兩種流向:
PREROUTING?FORWARD?POSTROUTING (NAT路由器)
PREROUTING?INPUT?本機OUTPUT?POSROUTING (主機防火墻)
Iptables會根據不同的數據包處理功能使用不同的規則表。主要的是以下三個:
Filter表:默認的表,包含真正的防火墻規則。內建規則鏈有:INPUT、OUTPUT、FORWARD
Nat表:包含源地址、目的地址和端口轉換使用的規則。內建規則鏈有:PREROUTING、OUTPUT、POSTROUTING

Mangle表:包含用於設置特殊的數據包路由標誌的規則,這些標誌會被filter表中的規則檢查。內建規則鏈有:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
五條規則鏈:
INPUT鏈:當一個數據包由內核中的路由計算確定目標是本機系統後,會通過INPUT鏈的檢查
OUTPUT鏈:保留給系統自身生成的數據包
FORWARD鏈:經過linux系統路由的數據包
PREROUTING鏈:用於修改目的地址(DNAT)
POSTROUTING鏈:用於修改源地址(SNAT)

詳細語法如下所示:
iptables [-t 表名] <-A| D | I | R>鏈名[規則編號] [-i | o 網卡名稱] [-p 協議類型] [-s 源地址 | 源子網] [ --sport 源端口號] [ -d 目標ip地址| 目標子網] [ --dport 目標端口號] <-j 動作>

參數說明:
[-t 表名]:定義默認策略將應用於哪個表。沒指定默認是filter表
-A:在規則列表中新增一條規則,
-I:插入一條規則,可以指定插入位置,沒指定默認在第一條規則前插入
-D:刪除規則,可以跟完整的規則描述,也可跟規則編號
-R:替換某條規則,不會改變規則順序,但必須要指定替換的規則編號
-L:顯示防火墻規則,不指定默認查看filter表
-v:顯示詳細信息
-n:以數字形式顯示IP和端口。一般與-v連用
-F:刪除指定表中的所有規則
-X:刪除自定義空鏈,如果鏈裏面有規則,則無法刪除
-Z:將指定表中的數據包計數器和流量計數器歸零
-P:設置默認策略

處理數據包的動作及說明:
ACCEPT:接收數據包
DROP:丟棄數據包
REJECT:攔截該數據包,並發回數據包通知對方
REDIRECT:將數據包重新轉向到本機或另一臺主機的某個端口
SNAT:改變數據包源地址
DNAT:改變數據包目標地址
MASQUERADE:IP偽裝,只能用於ADSL等撥號上網的偽裝,如果主機的IP地址是靜態固定的,就要使用SNAT
LOG:日誌功能,將符合規則的數據包相關信息記錄在日誌中,以便分析排錯

實操練習:
註:在命令行進行增刪改查的防火墻規則都會在服務器重啟後失效,想永久有效可寫入/etc/sysconfig/iptables文件裏,然後重啟防火墻。命令行裏的話,service iptables save
查看:

默認查看filter表

查看某個表中某條鏈裏面的規則

增刪查改:
iptables -A INPUT DROP
將進入你主機的所有數據包全部丟棄
iptables -A INPUT -m state --state NEW -j DROP
將所有進入你主機的狀態為NEW 的數據包全部丟棄,不包含ESTABLISHED和RELATED狀態的數據包。也就是不再允許其他的機器對你的主機發起連接,但你的主機可以主動連接其他的機器,但也僅限於連接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
加上上面這條規則,就允許狀態為ESTABLISHED和RELATED的連接產生的數據通過
添加:

刪除:

插入:

修改:

修改後:

更細致的規則編寫
Iptables -A INPUT -s 192.168.12.13 -p tcp -dport 22 -j ACCEPT
表示只允許IP地址為192.168.12.13的機器對本機進行SSH連接
限制一段IP的話可用:192.168.12.0/24,表示,192.168.12.1-255此區間內的IP都被限制能或者不能SSH連接本機

利用這些基礎的防火墻知識,寫一個iptables腳本,實現別人不能ping通自己,但自己可以ping通別人的功能:

9-13行:使用modprobe命令在內核加載一些ip,iptables相關模塊
15-16行:設置所有規則鏈的默認策略為DROP
19:設置允許接收本地回環數據
20:設置允許接收狀態為ESTABLISHED和RELATED的連接所發往本機的數據
21:設置允許接收來自22、80端口的數據
22:設置允許接收來自ping命令的應答消息。本機要ping別的主機,別的主機會發送確認信息,我們主機要接收並回復才能確認可以ping通
24-27:和19-22意義相同,不過作用目標是OUTPUT鏈。

icmp協議中,icmp-type為8表示ping request,即ping請求,imcp-type為0表示echo relay,即回顯應答,ICMP也是TCP/IP的一種,也需要三次握手,在上面的代碼中,本機可以不斷發出request請求去ping別人同時接收來自被ping主機的echo relay,即可以ping通,但是在OUTPUT鏈中沒有設置可以發送echo relay,別的主機ping本機時收不到回應,三次握手建立不成功,ping執行失敗。
其實,在Linux系統下,禁ping有一個更簡單的操作,這裏為了用防火墻實現所以有了以上內容:
禁ping操作:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
sysctl -p
以上兩條操作可實現上面代碼的相同功能。

規則擴展:
iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p tcp -m state --state NEW -m multiport --dport 21,22,80 -j ACCEPT
多端口規則匹配:使用參數 -m multiport 可以指定15個以內的非連續端口
上例中匹配到的端口全部放行
iptables -A INPUT -s -m iprange --src-range 10.0.10.100-10.0.10.200
--dst-range:目標IP段
指定匹配連續的IP段
iptables -A INPUT -s 10.150.133.141 -d 10.18.8.193 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 5 -j ACCEPT
限制icmp一次連接可發的ping包的數量
--limit:限制指定包的傳入速度
上面的例子是用來比對:每分鐘平均流量是否超過一次20個封包。還有每秒鐘/second、每小時/hour、每天/day。
--limit-burst:限制特定包瞬間傳入的峰值
上面的例子是用來比對一次同時湧入的封包是否超過5個,超過此上限的封包將被直接丟棄

Linux下防火墻學習