IPTABLES 是與最新的 3.5 版本 Linux 內核集成的 IP 信息包過濾系統。若是 Linux 系統鏈接到因特網或 LAN、服務器或鏈接 LAN 和因特網的代理服務器, 則該系統有利於在 Linux 系統上更好地控制 IP 信息包過濾和防火牆配置。(百度百科)前端
防火牆起到數據包過濾做用。
SNAT 私網用戶到公網 源NAT是咱們出去
DNAT 公網用戶到私網 目標NAT是公網進來web
firewalld 與 iptables的比較:後端
1.firewalld能夠動態修改單條規則,動態管理規則集,容許更新規則而不破壞現有會話和鏈接。而iptables,在修改了規則後必須得所有刷新才能夠生效; 2.firewalld使用區域和服務而不是鏈式規則; 3.firewalld默認是拒絕的,須要設置之後才能放行。而iptables默認是容許的,須要拒絕的才能限制; 4.firewalld並不具有防火牆的功能,和iptables同樣須要經過內核的netfilter來實現。只不過firewalld和iptables的使用方法不同!
firewalld是iptables的一個封裝,可讓你更容易地管理iptables規則。它並非iptables的替代品,雖然iptables命令仍可用於firewalld,但建議firewalld時僅使用firewalld命令。centos
學習iptables不得不提的幾個概念,首先咱們應該瞭解什麼是四表五鏈:安全
1.Filter 表[過濾]
filter表用來過濾數據包,咱們能夠在任什麼時候候匹配包並過濾它們。咱們就是在這裏根據包的內容對包作DROP或ACCEPT的。固然,咱們也能夠預先在其餘地方作些過濾,可是這個表纔是設計用來過濾的。幾乎全部的target均可以在這兒使用。大量具體的介紹在後面,如今你只要知道過濾工做主要是在這兒完成的就好了。bash
2.nat 表[假裝]
此表僅用於NAT,也就是轉換包的源或目標地址。注意,就象咱們前面說過的,只有流的第一個包會被這個鏈匹配,其後的包會自動被作相同的處理。實際的操做分爲如下幾類:
• DNAT
• SNAT
• MASQUERADE
DNAT 操做主要用在這樣一種狀況,你有一個合法的IP地址,要把對防火牆的訪問重定向到其餘的機子上(好比DMZ)。也就是說,咱們改變的是目的地址,以使包能重路由到某臺主機。
SNAT 改變包的源地址,這在極大程度上能夠隱藏你的本地網絡或者DMZ等。一個很好的例子是咱們知道防火牆的外部地址,但必須用這個地址替換本地網絡地址。有了這個操做,防火牆就能自動地對包作SNAT和De-SNAT(就是反向的SNAT),以使LAN能鏈接到Internet。若是使用相似 192.168.0.0/24這樣的地址,是不會從Internet獲得任何迴應的。由於IANA定義這些網絡(還有其餘的)爲私有的,只能用於LAN內部。
MASQUERADE 的做用和MASQUERADE 徹底同樣,只是計算機的負荷稍微多一點。由於對每一個匹配的包,MASQUERADE 都要查找可用的IP地址,而不象SNAT 用的IP地址是配置好的。固然,這也有好處,就是咱們可使用經過PPP、 PPPOE、SLIP等撥號獲得的地址,這些地址但是由ISP的DHCP隨機分配的。服務器
3.mangle 表[改包]
這個表主要用來mangle包,你可使用mangle匹配來改變包的TOS等特性。
強烈建議你不要在這個表裏作任何過濾,不論是DANT,SNAT或者Masquerade。
如下是mangle表中僅有的幾種操做:
• TOS
• TTL
• MARK
TOS操做用來設置或改變數據包的服務類型域。這經常使用來設置網絡上的數據包如何被路由等策略。注意這個操做並不完善,有時得不所願。它在Internet上還不能使用,並且不少路由器不會注意到這個域值。換句話說,不要設置發往Internet的包,除非你打算依靠TOS來路由,好比用iproute2。TTL操做用來改變數據包的生存時間域,咱們可讓全部數據包只有一個特殊的TTL。它的存在有一個很好的理由,那就是咱們能夠欺騙一些ISP。爲何要欺騙他們呢?由於他們不肯意讓咱們共享一個鏈接。那些ISP會查找一臺單獨的計算機是否使用不一樣的TTL,而且以此做爲判斷鏈接是否被共享的標誌。MARK用來給包設置特殊的標記。iproute2能識別這些標記,並根據不一樣的標記(或沒有標記)決定不一樣的路由。用這些標記咱們能夠作帶寬限制和基於請求的分類。網絡
4.RAW 表[鏈路跟蹤]
RAW表只使用在PREROUTING鏈和OUTPUT鏈上,由於優先級最高,從而能夠對收到的數據包在鏈接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即再也不作地址轉換和數據包的連接跟蹤處理了。
RAW表能夠應用在那些不須要作nat的狀況下,以提升性能。如大量訪問的web服務器,可讓80端口再也不讓iptables作數據包的連接跟蹤處理,以提升用戶的訪問速度。app
其次咱們應該熟悉iptables的工程流程:ssh
最後咱們再來看一下規則匹配流程:
路由發生的時刻: 報文進入本機後: 判斷目標主機; 報文發出以前: 判斷經由哪一個接口送往下一跳; iptables:四表五鏈 添加規則時的考量點: (1) 要實現哪一種功能:判斷添加在哪張表上; (2) 報文流經的路徑:判斷添加在哪一個鏈上; 鏈:鏈上規則的次序,即爲檢查的次序;所以隱含必定的法則 (1) 同類規則(訪問同一應用),匹配範圍小的放上面; (2) 不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面; (3) 將那些可由一條規則描述的多個規則合併爲一個; (4) 設置默認策略;【若是用不到鏈接追蹤功能應該關閉】
iptables命令: iptables [-t table] {-A|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name -t table: filter, nat, mangle, raw 鏈管理: -F:flush,清空規則鏈;省略鏈,表示清空指定表上的全部的鏈; -N:new, 建立新的自定義規則鏈; -X:drop, 刪除用戶自定義的空的規則鏈; -Z:zero,清零,置零規則計數器; -P:Policy,爲指定鏈設置默認策略;對filter表中的鏈而言,默認策略一般有ACCEPT, DROP, REJECT; -E: rEname,重命名自定義鏈;引用計數不爲0的自定義鏈,沒法更名,也沒法刪除; 規則管理: -A:append,將新規則追加於指定鏈的尾部; -I:insert,將新規則插入至指定鏈的指定位置; 【不指定rulenum插入爲第一條】 -D:delete,刪除指定鏈上的指定規則; 有兩種指定方式: (1) 指定匹配條件; (2) 指定規則編號; -R:replace,替換指定鏈上的指定規則; 查看: -L:list,列出指定鏈上的全部規則; -n: numberic,以數字格式顯示地址和端口號; 【不進行反解,和route、netstat同樣】 -v: verbose,顯示詳細信息; 【包括計數器信息】 -vv, -vvv --line-numbers:顯示規則編號; -x: exactly, 顯示計數器計數結果的精確值; 匹配條件: 基本匹配: [!] -s, --src, --source IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍; [!] -d, --dst, --destination IP|Netaddr:檢查報文中目標IP地址是否符合此處指定的地址範圍; -p, --protocol {tcp|udp|icmp}:檢查報文中的協議,即ip首部中的protocols所標識的協議; -i, --in-interface IFACE:數據報文的流入接口;僅能用於PREROUTING, INPUT及FORWARD鏈上; -o, --out-interface IFACE:數據報文的流出接口;僅能用於FORWARD, OUTPUT及POSTROUTING鏈上; 擴展匹配:-m macth_name --spec_options 例如:-m tcp --dport 22 隱式擴展:對-p protocol指明的協議進行的擴展,可省略-m選項; -p tcp --dport PORT[-PORT]:目標端口,能夠是單個端口或連續多個端口; 【#注意:不連續的端口號不能夠】如:[1024:65535] --sport PORT[-PORT] --tcp-flags LIST1 LIST2:檢查LIST1所指明的全部標誌位,且這其中,LIST2所表示出的全部標誌位必須爲1,而餘下的必須爲0;沒有LIST1中指明的,不做檢查; SYN, ACK, FIN, RST, PSH, URG --tcp-flags SYN,ACK,FIN,RST SYN --syn: 【--tcp-flags ALL ALL】 檢查全部標誌位每個都爲1 【--tcp-flags ALL NONE】檢查全部標誌位每個都爲0 -p udp --dport --sport -p icmp --icmp-type 可用數字表示其類型: 0:echo-reply 8: echo-request 顯式擴展: 必須使用-m選項指定使用的擴展;
管理規則
-A:附加一條規則,添加在鏈的尾部
-I CHAIN [num]: 插入一條規則,插入爲對應CHAIN上的第num條;
-D CHAIN [num]: 刪除指定鏈中的第num條規則;
-R CHAIN [num]: 替換指定的規則;
管理鏈:
-F [CHAIN]:flush,清空指定規則鏈,若是省略CHAIN,則能夠實現刪除對應表中的全部鏈
-P CHAIN: 設定指定鏈的默認策略;
-N:自定義一個新的空鏈
-X: 刪除一個自定義的空鏈
-Z:置零指定鏈中全部規則的計數器;
-E: 重命名自定義的鏈;
查看類:
-L: 顯示指定表中的規則;
-n: 以數字格式顯示主機地址和端口號;
-v: 顯示鏈及規則的詳細信息
-vv:
-x: 顯示計數器的精確值
--line-numbers: 顯示規則號碼
動做(target):
ACCEPT:放行
DROP:丟棄
REJECT:拒絕
DNAT:目標地址轉換
SNAT:源地址轉換
REDIRECT:端口重定向
MASQUERADE:地址假裝
LOG:日誌
MARK:打標記
#!/bin/bash # 默認filter鏈策略是ACCEPT======》能夠將它們設置成DROP 【默認策略一般有ACCEPT, DROP, REJECT】 # 注意默認規則是DROP的時候,遠程鏈接時千萬不要執行 iptables -F 會瞬間掉線,由於chain的規則是當即生效! # 注意【防掉線策略】iptables -L -n -v && sleep 10 && iptables -P INPUT ACCEPT;iptables -P OUTPUT ACCEPT;iptables -F 或者設置crontab 5分之後自動清空iptables規則sh test.sh && sleep 10 && iptables -P INPUT ACCEPT; iptables -P OUTPUT ACCEPT; iptables -F #[iptables -P INPUT ACCEPT] #[iptables -P OUTPUT ACCEPT] #iptables -F #service iptables save service iptables stop #清除全部規則,恢復默認策略ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.22 -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -s 172.16.100.22 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP service iptables save service iptables restart
放行本機的tftp服務:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 69 -j ACCEPT iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT
放行本機dns服務:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 53 -j ACCEPT iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j ACCEPT
放行ping其它主機
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT
放行其它主機ping
iptables -A INPUT -d 172.31.33.200 -p icmp --icmp-type 8 -j ACCEPT iptables -A OUTPUT -s 172.31.33.200 -p icmp --icmp-type 0 -j ACCEPT
放行來自於172.16.0.0/16網絡的主機對本機ssh服務的請求
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
多端口匹配
iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT
ip地址範圍匹配
iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT
報文中字符串匹配
iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT
速率限制匹配
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -j ACCEPT
啓用鏈接追蹤
iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT iptables -I INPUT 2 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT 最優條目 iptables -I INPUT 2 -d 172.31.33.200 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT iptables -I OUTPUT -s 172.31.33.200 -m state --state ESTABLISHED -j ACCEPT
如何保存及重載規則:
保存規則至指定文件: iptables-save > /PATH/TO/SOMEFILE 從指定文件重載規則: iptables-restore < /PATH/FROM/SOMEFILE CentOS 6: service iptables save iptables-save > /etc/sysconfig/iptables service iptables restart iptables-restore < /etc/sysconfig/iptables CentOS 7: 引入了新的iptables前端管理服務工具:firewalld firewalld-cmd firewalld-config 【systemctl disable firewalld.service】禁止開機啓動 【systemctl stop firewalld.service】中止服務
iptables防火牆並不能阻止DDOS,建議在項目實施中採購硬件防火牆,置於整個系統以前,用於防DDOS和端口映射;若是對安全有特殊要求,可再加上應用層級的防火牆。在項目實施中建議關閉Linux服務器的iptables防火牆或FreeBSD的ipfw,目的爲:①更好的提升後端服務器網絡性能;②方便數據流在整個業務系統內部流通,安全方面工做由硬件防火牆來承擔。目前主要將iptables用於內部做NAT防火牆,它的性能和方便管理性確實強悍,經迅雷測試可發現,公司內部的10M帶寬能被利用得一絲無餘;強烈推薦的是讓iptables做NAT路由轉發,事實證實效果很好。繁忙的服務器不要啓用ip_conntrack【centos6是nf_conntrack】鏈接跟蹤模塊,不然會致使後續的用戶請求被丟棄。若是是使用遠程來調試iptables防火牆,最好是設置crontab做業是定時中止防火牆,以防本身被鎖定,5分鐘中止一次iptables便可,等整個腳本徹底穩定後再關閉此crontab做業。若是是機房租賃的服務器,在沒有配置前端硬件防火牆的狀況下,Linux主機必定要開啓iptables防火牆。