一、什么是firewalld防火墻?
firewalld防火墻在Linux主機里其實就是一道隔離工具,它只對進出主機的請求做判斷處理,也就是說它只管進出,至于你進來后做了什么,就不在firewalld的管轄范圍了,firewalld作業與網路的邊緣,它根據我們事先指定好的規則判斷請求報文在不在規則之內,在的話,允許通過,不在,拒之門外,這就是firewalld,
二、那么firewalld有哪些規則呢?怎么設定防火墻規則呢?
說起有哪些規則?emmmm……這就不好說了,因為規則都是人來設定的,你想設定什么規則,就有什么規則(當然是在功能的允許范圍內啦),可以指定協議、埠、報文型別等來設定拒絕訪問規則,如:DROP、REJECT(兩者有點小不同,后面會具體說);也可以通過設定關鍵字來判定允不允許報文通過,當然,這些都得你理解了才能操作,
在操作之前,你還得知道firewalld可以在哪里通過什么方式添加規則,也就是firewalld的四表五鏈啦,那么就先說下五鏈吧,因為五鏈是包含在四表之內的,所以我們學習就由內向外開始吧,
五鏈
1、PREROUTING
資料包進入路由表之前(用于目標地址轉換(DNAT),)
2、INPUT
通過路由表后目的地為本機
3、FORWORD
通過路由表后,目的地不為本機
4、OUTPUT
由本機產生,向外轉發
5、POSTROUTING
發送到網卡介面之前,(用于源地址轉換(SNAT))
看到上面每個鏈的作用是不是一臉懵逼,完全不懂這是什么?哈哈,不要著急,我剛看到時也是一臉懵逼,不過學完后,我就更加懵逼啦,這究竟是什么鬼?完全顛覆了我的IT觀,因為我所理解的設定位置完全和實際的設定位置不一樣所以呢,emmmm,希望你不要帶著自己的主觀思想去學習理解firewalld規則設定,不然會很吃力,
吶吶吶,五鏈說完了,先不用管它是什么,有個概念就可以了,下面來看看四表:
四表
表是由鏈組成,來完成不同的功能,iptables中默認有4個表,以及默認包含的鏈
1、filter:一般的過濾功能
filter 是用于存放所有與防火墻相關操作的默認表,
INPUT
FORWARD
OUTPUT
filter表有兩種規則模式
目標IP為本機IP的,啟動本機防火墻規則,只經過INPUT鏈和OUTPUT鏈,
目標IP為外網IP的,啟動網路防火墻規則,經過INPUT鏈、FORWARD鏈和OUTPUT鏈,
2、nat:用于nat功能(埠映射,地址映射等)
PREROUTING
INPUT
OUTPUT
POSTROUTING
3、mangle:用于對特定資料包的修改
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
4、raw:有限級最高,設定raw時一般是為了不再讓iptables做資料包的鏈接跟蹤處理,提高性能
INPUT
OUTPUT
FORWARD
可以看到,每個表中都包含相對應的鏈,我們要做的操作是在鏈上進行,但是要先指明是在那個表的鏈上操作,每個表的功能又不一樣,所以呢,我們要做的就是先搞明白每個表都有什么功能?這個表有哪些鏈?這些鏈又可以進行哪些操作,都搞明白了,就可以操作了!
是不是很迫不及待的想去主機上操作一把iptables?NO!NO!NO!現在還不行,因為你還不知道iptables有哪些命令,都是干嘛的這些命令,所以呢,下面我們就來看下iptables的命令,(呀,我是不是還沒有說為什么我們要學習的是firewalld,現在怎么再說iptables呀,其實這個很簡單,firewalld是基于內核的一個網路隔離工具,它的規則是靠iptables來呼叫和設定的,就和食物在鍋里,你要用碗盛來吃一個道理,)
iptables命令
命令格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
選項含義
鏈管理
-N:new, 自定義一條新的規則鏈;
-X: delete,洗掉自定義的規則鏈;洗掉需要同時滿足下面三個條件
1.參考計數為0
2.沒有規則的空鏈
3.自定義的鏈
-P:Policy,設定默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E:重命名自定義鏈;參考計數不為0的自定義鏈不能夠被重命名,也不能被洗掉;
查看
-L:list, 列出指定鏈上的所有規則;下面是修飾L的幾個選項,
-n:numberic,以數字格式顯示地址和埠號;
-v:verbose,詳細資訊;
-x:exactly,顯示計數器結果的精確值;
–line-numbers:顯示規則的序號;
規則管理
-A:append,追加;
-I:insert, 插入,要指明位置,省略時表示第一條;
-D:delete,洗掉;
(1) 指明規則序號;
(2) 指明規則本身;
-R:replace,替換指定鏈上的指定規則;
-F:flush,清空指定的規則鏈;
-Z:zero,置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的個數;
(2) 匹配到的所有報文的大小之和;
匹配條件
基本匹配條件: 無需加載任何模塊,由iptables/netfilter自行提供
-s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或范圍;
-d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍;
-p, --protocol protocol,指定協議,常用的有tcp,udp,icmp
-i, --in-interface name:資料報文流入的介面;只能應用于資料報文流入的環節,只能應用于PREROUTING,INPUT和FORWARD鏈;
-o, --out-interface name:資料報文流出的介面;只能應用于資料報文流出的環節,只能應用于FORWARD、OUTPUT和POSTROUTING鏈;
隱式擴展
不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;--tcp
--source-port, --sport port[:port]:匹配報文的源埠;可以是埠范圍;
--destination-port,--dport port[:port]:匹配報文的目標埠;可以是埠范圍;
--tcp-flags mask comp,其中mask是一個串列,可以是 SYN,ACK,FIN,RST,comp是mask串列中必須被設定為1的標志,例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為SYN,ACK,FIN,RST四個,中SYN必須為1,余下的必須為0;
--syn:用于匹配第一次握手,相當于”--tcp-flags SYN,ACK,FIN,RST SYN“;
不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;--udp
--source-port, --sport port[:port]:匹配報文的源埠;可以是埠范圍;
--destination-port,--dport port[:port]:匹配報文的目標埠;可以是埠范圍;
不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;--icmp
--icmp-type {type[/code]|typename}
顯式擴展
必須使用-m選項指明要呼叫的擴展模塊的擴展機制;
multiport:以離散或連續的 方式定義多埠匹配條件,最多15個;這里最多15個指的是,比如20:25這樣指定的話只算2個埠,而不是算6個埠,
iprange:以連續地址塊的方式來指明多IP地址匹配條件;
--src-range from[-to]
--dst-range from[-to]
time:根據將報文到達的時間與指定的時間范圍進行匹配,常用的選項
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day...]
--monthdays day[,day...]
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--kerneltz:使用內核配置的時區而非默認的UTC;
--string:對報文中的應用層資料做字串模式匹配檢測
--algo {bm|kmp}:字串匹配檢測演算法;
--string pattern:要檢測的字串模式;
--hex-string pattern:要檢測的字串模式,16進制格式;
connlimit :根據每客戶端IP做并發連接數數量匹配;
--connlimit-upto n:連接的數量小于等于n時匹配;
--connlimit-above n:連接的數量大于n時匹配;
limit: 基于收發報文的速率做匹配
--limit rate[/second|/minute|/hour|/day] ##最大速率
--limit-burst number ##表示最大能接受多少個請求
state:根據”連接追蹤機制“去檢查連接的狀態;
--state STATE
conntrack機制:追蹤本機上的請求和回應之間的關系;狀態有如下幾種:
- NEW:新發出請求;連接追蹤模板中不存在此連接的相關資訊條目,因此,將其識別為第一次發出的請求;
- ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信狀態;
- RELATED:相關聯的連接;如ftp協議中的資料連接與命令連接之間的關系;
- INVALID:無效的連接;
- UNTRACKED:未進行追蹤的連接;
處理動作
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
RETURN:回傳呼叫鏈
REDIRECT:埠重定向
LOG:記錄日志
MARK:做防火墻標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址偽裝
哇,是不是看到上面那么多命令和選項,頓時一個腦袋兩個大啦,其實我剛看到時也是望而卻步,這么多???是在逗老子嗎?本來就不怎么聰明的我,怎么能記住這么多???其實呀,那么多命令超過80%都是不常用的,你可以選擇性的是記憶和整理,我做的全一點是因為以后如果遇到那個命令了,我也方便找到它,知道它什么意思,鬼知道未來那個大佬會寫一個很牛批的服務,冷不丁的就用到了這個命令,而我不知道也找不到,多尷尬呀是不?閑話說了很多,下面就開始實操咯!!(怎么覺得有點小興奮呢???)
案例實操
filter表
iptables -F:清空所有策略
iptables -X:清空自定義鏈(此步驟之前一定要先清空)
iptables -N old_forward:自定義一個鏈
iptables -E old_forward new_forward:修改自定義鏈的名字
iptables -P FORWARD DROP:把filter中forward鏈的默認策略打成drop
iptables -L -n --line-number:查看filter表中的策略并且顯示行數
iptables -t filter -D FORWARD 9:洗掉filter表中forward鏈中的第9條策略
iptables -t filter -A INPUT -s 0.0.0.0/0 -d 192.168.254.24 -p icmp -j REJECT:限制所有主機(0.0.0.0)拒絕ping本主機
iptables -t filter -A INPUT -d 192.168.254.24 -i ens33 -p icmp -j REJECT:顯示所有主機(0.0.0.0)拒絕通過ens33網卡ping本主機
實操:
開始操作之前,先:iptables -t filter -F和iptables -t filter -X 清空filter表的所有規則,(firewalld要是開啟狀態哦,你也可以看下開啟后的默認規則:iptables -t filter -L -n)
禁止本機ping通:iptables -t filter -A INPUT -s 0.0.0.0/0 -d 虛擬機IP -p icmp -j REJECT(使用REJECT會顯示連接不到埠)

iptables -t filter -A INPUT -d 虛擬機IP -p icmp -j DROP(會顯示請求超時)

可以看出REJECT是你的資料包來了,我收到了,但是我拒絕回復你;而DROP是我收沒收到都不會告訴你,直接將資料包丟棄,
nat表
#源地址為192.168.250.0網段的ip地址經過防火墻都轉換成192.168.31.100這個ip地址(SNAT:源地址轉換)
iptables -t nat -A POSTROUTING -s 192.168.250.0/24 -d 192.168.250.0/24 -j SNAT --to-source 192.168.31.100
#訪問目標地址為192.168.31.200這個機器并且是tcp協議80號埠的都轉發給192.168.250.1(DNAT目標地址轉換)
iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.250.1:80
#訪問目標地址為192.168.31.200這個機器并且是tcp協議80號埠的都轉發給192.168.31.100的9999號埠(DNAT目標埠地址轉換)
iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.31.100:9999
實操:
開始操作之前,先:iptables -t nat -F iptables -t nat -X 清空nat表的所有規則,需要開三臺虛擬機,分別為s1、s2、s3,其中s1是訪問端,s2是防火墻端,s3是服務端,
s1設定:IP 192.168.27.5/24 網關:192.168.27.1 網路防火墻關閉狀態,
s2設定:ens33 IP 192.168.27.1/24 ens37 IP 112.112.112.1/24 網關等都不要,網路防火墻開啟,(兩個網卡)
s3設定:IP 112.112.112.10/24 網關 112.112.112.1 防火墻關閉狀態,下載httpd服務,寫入index.html檔案內容,
此時在s2:echo 1 > /proc/sys/net/ipv4/ip_forward 開啟路由轉發功能,此時在s1 ping s2可以ping通,
在s1用:curl 112.112.112.10 可以看到在index.html寫入的內容,在s3端:tailf /var/log/httpd/access_log 可以看到s1的IP成功訪問,
回到s2添加原地址轉換規則:iptables -t nat -A POSTROUTING -s 192.168.27.5 -d 112.112.112.10 -j SNAT --to-source 112.112.112.1
在s1用:curl 112.112.112.10 可以看到在index.html寫入的內容,在s3端:tailf /var/log/httpd/access_log 可以看到112.112.112.1 IP成功訪問,
在s1端下載httpd服務并在/var/www/html下寫入index.html檔案,
在s2添加目標地址轉換規則:iptables -t nat -A PREROUTING -s 112.112.112.10 -d 112.112.112.1 -j DNAT --to-destination 192.168.27.5
此時在s3:curl 112.112.112.1 可以看到s1 index.html的內容,查看s1的日志會發現是112.112.112.10成功訪問,
在s2添加埠轉換規則:iptables -t nat -I PREROUTING -d 112.112.112.1 -p tcp --dport 80 -j DNAT --to-destination 112.112.112.10:80
此時在s3查看日志會看到是192.168.27.5成功訪問,(上一步的埠可以更換成別的沒有被占用的,同樣生效)
嗯!因為我們在實際作業程序中,用到raw表和mangle表的機會實在是太少了,包括我現在也沒有遇到要在這兩個表上設定規則的情況,所以我也沒有研究怎么在這兩個表上設定規則,等哪天我閑了,要就下再回來補上哈,另外我是在虛擬機上進行的實操實驗,不敢再主機上搞呀,萬一操作失誤,那就是“切腹謝罪”的事情,所以也建議小伙伴在虛擬機上實驗下,確定沒問題了再拿去主機上執行,安全第一!
操作基本就那么多了,下面我們說點別的!
firewalld優先級
策略應用優先級:raw, mangle, nat, filter
策略常用優先級:filter,nat,mangle,raw
iptables資料包走向
1. 資料包到達網路介面,比如 ens33,
2. 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連接跟蹤之前處理資料包,
3. 如果進行了連接跟蹤,在此處理,
4. 進入 mangle 表的 PREROUTING 鏈,在此可以修改資料包,比如 TOS 等,
5. 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾,
6. 決定路由,看是交給本地主機還是轉發給其它主機,
2019年11月更新:
前兩天想到iptables和firewalld好像還有一個不兼容的情況,因為我來到公司使用的一直是iptables,沒有開啟過firewalld,所以在9月寫這篇文章時沒有寫上,現在是11月了,補上哈,下面我們就來說說iptables和firewalld的生死糾葛:
我們知道firewalld是centos7默認的網路防火墻,7以前的系統好像都是iptables,我開始接觸的就是7系統,所以要是說錯了還請勿怪哈,那么要想在7上使用iptables的話就需要下載iptables-service了,注意,不是下載iptables,必須是iptables-service,
假設場景:現在firewalld是開啟狀態,我下載了iptables-service,使用命令如下:
1,systemctl start firewalld
2、yum install iptables-service
3、systemctl start iptables
此時查看狀態:
1、systemctl status iptables

2、再查看firewalld狀態:systemctl status firewalld

3、我們再開啟firewalld:systemctl restart firewalld

4、再查看iptables狀態:systemctl status iptables

通過上面的實驗,已經證實,iptables和firewalld確實是一山不容二虎,那么具體firewalld和iptables的本質區別又是什么?我是用iptables和使用firewalld有什么區別呢?最理解不了是還是iptables還特么是管理firewalld的工具,看到這的你肯定很懵,沒錯,我也很懵,等到我啥時候搞清楚了再來更新這問題,有興趣的小伙伴可以實驗下,要是知道區別的大神還請留言指導下,一起學習,共同進步!
嗯!!!
經過差不多半小時的摸索,終于發現firewalld和iptables的區別之處,那么,下面我就分享下心得,希望對正在使用防火墻的小伙伴有所幫助:
先從firewalld開始說:iptables可以作為工具管理firewalld,也就是說我們在firewalld開啟的狀態下,可以同過iptables命令添加防火墻規則,但是一條命令,就是一個規則,玩firewalld的小伙伴應該清楚,給firewalld添加iptables規則,每一條命令都挺長的,選項還多,單詞需要背,我就是很頭疼這個,
另外我們在規則的保存方面,通常是使用命令:iptables-save > filename 將現在的防火墻規則匯出來保存到一個檔案里:

相當于把當前防火墻規則做了一次備份,當我們把防火墻規則搞得自己都不清楚有哪些規則時,就可以通過命令:iptables-restore < filename 恢復備份的防火墻規則,但是在添加和洗掉規則方面還是很費勁,那么有沒有添加規則簡單點的方式呢?之前可能不知道,現在可以告訴你,有的,下面我們來說說是什么方式可以做到,
那就是iptables-service,沒錯,就是它,下面我來詳細說說它的強大之處:
1、保存當前防火墻狀態到指定檔案,通過編輯檔案來修改規則,退出編輯重啟iptables生效,

2、一樣支持保存防火墻當前狀態,作為備份和恢復

我想這兩點足以說明iptables比firewalld的強大之處了,我最喜歡的還是那個編輯檔案重啟iptables生效,這個功能實在是太好了,結合部署腳本使用,只要用得好,比寫一長串命令輕松太多了,嗯,那就說到這吧,希望能夠對正在玩防火墻的小伙伴有所幫助,歡迎留言交流心得,開源、共享才能使技術進步,加油!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/65542.html
標籤:其他
上一篇:voip代碼決議下載
