防火墙--iptables
iptables只是Linux防火墻的管理工具而已。真正實現防火墻功能的是netfilter,它是Linux內核中實現包過濾的內部結構。
iptables具體是如何去過濾各種規則的呢?請看下面的四表五鏈
四表五鏈概念
- filter表——過濾數據包
- Nat表——用于網絡地址轉換(IP、端口)
- Mangle表——修改數據包的服務類型、TTL、并且可以配置路由實現QOS
- Raw表——決定數據包是否被狀態跟蹤機制處理
- INPUT鏈——進來的數據包應用此規則鏈中的策略
- OUTPUT鏈——外出的數據包應用此規則鏈中的策略
- FORWARD鏈——轉發數據包時應用此規則鏈中的策略
- PREROUTING鏈——對數據包作路由選擇前應用此鏈中的規則(所有的數據包進來的時侯都先由這個鏈處理)
- POSTROUTING鏈——對數據包作路由選擇后應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
當主機收到一個數據包后,數據包先在內核空間中處理,若發現目的地址是自身,則傳到用戶空間中交給對應的應用程序處理,若發現目的不是自身,則會將包丟棄或進行轉發。
iptables實現防火墻功能的原理是:在數據包經過內核的過程中有五處關鍵地方,分別是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,稱為鉤子函數,iptables這款用戶空間的軟件可以在這5處地方寫規則,對經過的數據包進行處理,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理數據包”。
iptables中定義有5條鏈,說白了就是上面說的5個鉤子函數,因為每個鉤子函數中可以定義多條規則,每當數據包到達一個鉤子函數時,iptables就會從鉤子函數中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鉤子函數中任一條規則,iptables就會根據該函數預先定義的默認策略來處理數據包
iptables中定義有表,分別表示提供的功能,有filter表(實現包過濾)、nat表(實現網絡地址轉換)、mangle表(實現包修改)、raw表(實現數據跟蹤),這些表具有一定的優先級:raw-->mangle-->nat-->filter
一條鏈上可定義不同功能的規則,檢查數據包時將根據上面的優先級順序檢查
小結一下:
數據包先經過PREOUTING,由該鏈確定數據包的走向:
? ? 1、目的地址是本地,則發送到INPUT,讓INPUT決定是否接收下來送到用戶空間,流程為①--->②;
? ? 2、若滿足PREROUTING的nat表上的轉發規則,則發送給FORWARD,然后再經過POSTROUTING發送出去,流程為:?①--->③--->④--->⑥
主機發送數據包時,流程則是⑤—>⑥
iptables安裝配置
linux一般默認都已經安裝iptables,只需要開啟服務即可:service iptables start
iptables規則書寫
基本語法:iptables [-t 表] [操作命令] [鏈][規則匹配器][-j 目標動作]
| 表 | 說明 | 支持的鏈 |
| raw | 一般是為了不再讓iptables對數據包進行跟蹤,提高性能 | PREROUTING、OUTPUT |
| mangle | 對數據包進行修改 | 五個鏈都可以 |
| nat | 進行地址轉換 | PREROUTING、OUTPUT、POSTROUTING |
| filter(默認) | 對包進行過濾 | INPUT、FORWARD、OUTPUT |
常用操作命令 | 說明 |
| -A | 在指定鏈尾部添加規則 |
| -D | 刪除匹配的規則 |
| -R | 替換匹配的規則 |
| -I | 在指定位置插入規則 例:iptables?-I?INPUT?1?--dport?80?-j?ACCEPT (將規則插入到filter表INPUT鏈中的第一位上) |
| -L/S | 列出指定鏈或所有鏈的規則 |
| -F | 刪除指定鏈或所有鏈的規則 |
| -N | 創建用戶自定義鏈 例:iptables?-N?allowed |
| -X | 刪除指定的用戶自定義鏈 |
| -P | 為指定鏈設置默認規則策略,對自定義鏈不起作 用 例:iptables -P OUTPUT DROP |
| -Z | 將指定鏈或所有鏈的計數器清零 |
| -E | 更改自定義鏈的名稱 例:iptables?-E?allowed?disallowed |
| -n | ip地址和端口號以數字方式顯示 例:iptables -Ln |
| 常見規則匹配器 | 說明 |
| -p tcp|udp|icmp|all | 匹配協議,all會匹配所有協議 |
| -s addr[/mask] | 匹配源地址 |
| -d addr[/mask] | 匹配目標地址 |
| --sport port1[:port2] | 匹配源端口(可指定連續的端口) |
| --dport port1[:port2] | 匹配目的端口(可指定連續的端口) |
| -o interface | 匹配出口網卡,只適用FORWARD、POSTROUTING、OUTPUT。 例:iptables?-A?FORWARD?-o?eth0 |
| -i interface | 匹配入口網卡,只使用PREROUTING、INPUT、FORWARD。 |
| --icmp-type? | 匹配icmp類型(使用iptables -p icmp -h可查看可用的ICMP類型) |
| --tcp-flags mask comp | 匹配TCP標記,mask表示檢查范圍,comp表示匹配mask中的哪些標記。 例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT (表示匹配SYN和ACK標記的數據包) |
| 目標動作 | 說明 |
| ACCEPT | 允許數據包通過 |
| DROP | 丟棄數據包 |
| REJECT | 丟棄數據包,并且將拒絕信息發送給發送方 |
| SNAT | 源地址轉換(在nat表上) 例:iptables?-t?nat?-A?POSTROUTING?-d?192.168.0.102?-j?SNAT?--to?192.168.0.1? |
| DNAT | 目標地址轉換(在nat表上) 例:iptables?-t?nat?-A?PREROUTING?-d?202.202.202.2?-j?DNAT?--to-destination?192.168.0.102 |
| REDIRECT | 目標端口轉換(在nat表上) 例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80 |
| MARK | 將數據包打上標記 例:iptables?-t?mangle?-A?PREROUTING?-s?192.168.1.3?-j?MARK?--set-mark?60 |
注意要點:
? ? 1、目標地址轉換一般在PREROUTING鏈上操作
? ? 2、源地址轉換一般在POSTROUTING鏈上操作
?
保存和恢復iptables規則
? ? 使用iptables-save可以保存到特定文件中
?
1 | ? ? iptables-save?>/etc/sysconfig/iptables_save |
?
? ? 使用iptables-restore可以恢復規則
?
1 | ? ? iptables-restore</etc/sysconfig/iptables_save |
?
iptables的進階使用
? ?1、limit限制流量:
? ? ? ? -m limit --limit-burst 15? ? ? ? #設置一開始匹配的最���數據包數量
? ? ? ? -m limit --limit 1000/s? ? ? ? ? ? #設置最大平均匹配速率
? ? ? ? -m limit --limit 5/m --limit-burst 15? ? ?#表示一開始能匹配的數據包數量為15個,每匹配到一個,? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? limit-burst的值減1,所以匹配到15個時,該值為0,以后每過? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 12s,limit-burst的值會加1,表示又能匹配1個數據包
例子:
?
1 2 | iptables?-A?INPUT?-i?eth0?-m?limit?--limit?5/m?--limit-burst?15?-j?ACCEPT? iptables?-A?INPUT?-i?eth0?-j?DROP |
?
? ? 注意要點:
? ? ? ? 1、--limit-burst的值要比--limit的大
? ? ? ? 2、limit本身沒有丟棄數據包的功能,因此,需要第二條規則一起才能實現限速的功能
? ? 2、time :在特定時間內匹配
| -m time? | 說明 |
| --monthdays day1[,day2] | 在每個月的特定天匹配 |
| --timestart hh:mm:ss | 在每天的指定時間開始匹配 |
| --timestop hh:mm:ss | 在每天的指定時間停止匹配 |
| --weekdays day1[,day2] | 在每個星期的指定工作日匹配,值可以是1-7 |
例子:
?
1 2 | iptables?-A?INPUT?-i?eth0?-m?time?--weekdays?1,2,3,4?-jACCEPT iptables?-A?INPUT?-i?eth0?-j?DROP |
?
? ? 3、ttl:匹配符合規則的ttl值的數據包
| 參數 | 說明 |
| --ttl-eq 100 | 匹配TTL值為100的數據包 |
| --ttl-gt 100 | 匹配TTL值大于100的數據包 |
| --ttl-lt 100 | 匹配TTL值小于100的數據包 |
例子:
?
1 | iptables?-A?OUTPUT?-m?ttl?--ttl-eq?100?-j?ACCEPT |
?
? ? 4、multiport:匹配離散的多個端口
| 參數 | 說明 |
| --sports port1[,port2,port3] | 匹配源端口 |
| --dports port1[,port2,port3] | 匹配目的端口 |
| --ports port1[,port2,port3] | 匹配源端口或目的端口 |
例子:
?
1 | iptables?-A?INPUT?-m?multiport?--sports?22,80,8080?-j?DROP |
?
? ?
? ? 5、state:匹配指定的狀態數據包
| 參數 | 說明 |
| --state value | value可以為NEW、RELATED(有關聯的)、ESTABLISHED、INVALID(未知連接) |
例子:
?
1 | iptables?-A?INPUT?-m?state?--state?NEW,ESTABLISHED?-j?ACCEPT |
?
? ? 6、mark:匹配帶有指定mark值的數據包
| 參數 | 說明 |
| --mark value | 匹配mark標記為value的數據包 |
例子:
?
1 | iptables?-t?mangle?-A?INPUT?-m?mark?--mark?1?-j?DROP |
?
? ? 7、mac:匹配特定的mac地址
例子:
?
1 | iptables?-A?FORWARD?-m?mac?--mac-source?00:0C:24:FA:19:80?-j?DROP |
轉載于:https://www.cnblogs.com/jinxuan/p/7513681.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的防火墙--iptables的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaEE——Spring4--(9)
- 下一篇: IaaS,PaaS,Saas 云服务的介