Firewalld防火牆

1. linux防火牆基礎

1.1  防火牆概念

  在計算機科學領域中,防火牆(Firewall)是一個架設在互聯網與企業內網之間的信息安全系統,根據企業預約的策略來監控往來的傳輸。html

  防火牆多是一臺專屬的網絡設備或是運行於主機上來檢查各個網絡接口上的網絡傳輸。它是目前最重要的一種網絡防禦設備,從專業角度來講,防火牆是位於兩個(或多個)網絡間,實行網絡間訪問或控制的一組組件集合之硬件或軟件。python

1.2  功能

  防火牆最基本的功能就是隔離網絡,經過將網絡劃分紅不一樣的區域(一般狀況下稱爲ZONE),制定出不一樣區域之間的訪問控制策略來控制不一樣信任程度區域間傳送的數據流。防火牆工做與主機和網絡的邊緣。linux

1.3  PTABLES實現方式

  Linux系統的防火牆功能是由內核實現的,包過濾防火牆工做在TCP/IP的網絡層,防火牆不屬於應用程序,集成與內核空間,沒有進程。web

       鏈名必須大寫算法

  主機防火牆:報文進入內核, 經Input檢測進入用戶空間,經Output檢測從用戶出去 。報文僅訪問主機自己shell

  forward轉發:訪問的是外部服務器,經過farword轉發。vim

  源地址轉換:SNAT,將客戶端ip轉換成外網ipwindows

  目標地址轉換:DNAT,將外網ip轉化爲客戶端ip(私網)centos

  Prerouting: 進行DNAT轉換瀏覽器

  Postrouting:進行SNAT轉換 

 

  iptables有四表五鏈,表決定了數據報文處理的方式,鏈決定了數據報文流經的位置。

規則表(功能)

名稱

包含鏈

做用

filter

INPUT,OUTPUT,FORWARD

過濾,防火牆

nat

PREROUTING,POSTROUTING,INPUT,OUTPUT

網絡地址轉換,轉發

mangle

OUTPUT,PREROUTING

肯定是否對該數據包進行狀態跟蹤,封裝

raw

INPUT,OUTPUT,FORWARLD,PREROUTING,POSTROUTING

關閉nat表上啓用的鏈接追蹤功能

 

規則鏈(內置):

名稱

做用

input

當收到訪問防火牆本機的數據包時(入站),應用此鏈中的規則

output

當防火牆向外發送數據包時(出站),應用此鏈中的規則

forward

收到須要經過防火牆發送給其餘地址的數據包時,應用此鏈中的規則(中轉)

prerouting

在進行路由選擇前處理數據包(判斷目標主機)應用此鏈(snet)

postrouting

在進行路由選擇後處理數據包(判斷經由哪一接口送往下一跳)應用此鏈(dnet)

 

1.4  數據包匹配的流程:

  分析數據報文進入本機後應用了哪些表規則以及鏈規則;

  filter表的規則,filter表決定是否放行數據包經過,若是經過,則必須經由INPUT鏈流入數據包(內核—input—用戶空間),INPUT鏈是處理入站數據的,若是沒問題,繼續放行到用戶空間,再經由OUTPUT鏈將數據包流出。

  nat表的規則,nat表主要實現轉發功能,數據包先經由PREROUTING鏈進行路由選擇,選擇好路線後再經由FORWARD鏈轉發數據,而後再進行一個路由選擇,最後由POSTROUTING鏈流出數據。

 

1.5  添加規則時的考量點

  1)要實現什麼功能:添加在哪一個表上;

  2)報文流經的路徑:添加在哪一個鏈上。

 

1.6  規則表之間的優先級

  策略應用優先級:raw,mangle,nat,filter;

  策略經常使用優先級:filter,nat,mangle,raw。

  入站數據流向:來自外界的數據包到達防火牆,首先被PREROUTING規則鏈處理(是否被修改地址),以後會進行路由選擇(判斷該數據包應該發往何處),若是數據包的目的地址是防火牆本機,那麼內核將其傳遞給INPUT鏈處理,經過之後再交給上次的應用程序進行響應。

  轉發數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,以後進行路由選擇,若是數據包的目標地址是其餘外部地址,則內核將其傳遞給FORWALD鏈進行處理,而後再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。

  出站數據流向:防火牆自己向外部地址發送數據包,首先被OUTPUT規則鏈處理,以後進行路由選擇,而後交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。

 

規則鏈內部各防火牆規則之間的優先順序

  依次按第1條規則、第2條規則、第3條規則、·····的順序進行處理,找到一條可以匹配的數據包規則,則再也不繼續檢查後面的規則(使用LOG記錄日誌的規則例外)若是找不到規則,就按照規則鏈的默認策略進行處理。

 

2. 鏈管理和設置iptables規則

2.1 語法格式

  iptables [ -t 表名] 命令選項 [ 鏈名] [ 條件匹配] [ -j 目標動做或者跳轉]

  iptables:運行在內核空間上,幫助調用防火牆,用戶用來操做防火牆的工具。

2.2  iptables 命令

選項

功能及特色

-A

append,在指定鏈的末尾添加一條新規則

-D

delete,刪除指定鏈中的某一條規則,按規則序號或內容肯定要刪除的規則

-I

insert,在指定鏈中插入一條新規則,若未指定位置,則默認在鏈的開頭插入

-R

修改、替換指定鏈的一條新規則,按規則序號或內容肯定要替換的規則

-L

list,列出指定鏈中的全部規則進行查看,若未指定鏈名,則列出表中全部鏈的內容

-F

清空指定鏈中的全部規則,若未指定鏈名,則清空表中全部鏈的內容

-N

新建一條用戶自定義的規則鏈

-X

刪除表中用戶自定義的規則鏈

-P

設置指定鏈的默認策略

-n

number,使用數字形式顯示輸出結果,如顯示主機的ip而不是主機名

-v

verbose,查看規則列表時顯示詳細的信息

-V

查看iptables命令工具的版本信息

-h

查看命令幫助信息

-t

table(表)指定要 查看的表

-line-numbers

查看規則列表時,同步顯示規則在鏈中的順序號

 

2.3 匹配條件

選項

做用

-s

source,檢查報文中源ip地址是否符合此處指定的地址範圍

-d

destination,檢查報文中ip地址是否符合此處指定的地址範圍

-p

protocol,檢查報文中的協議

-i

input-interface,數據報文的流入接口:僅能用於PREROUTING、INPUT、FORWARD鏈上

-o

out-interface,數據報文的流出接口:僅能用於POSTROUTING、OUTPUT、FORWARD鏈上

-j target

jump至指定的target

ACCEPET

接受

DROP

丟棄

RAJECT

拒絕

RETUEN

返回調用鏈

LOG

記錄日誌

MARK

作防火牆標誌

REDIRECT

端口重定向

DNAT

目標地址轉換

SNAT

源地址轉換

MASOUERADE

地址假裝

自定義鏈

自由定義鏈中的規則進行匹配

2.4 添加及輸入規則

  #iptables -t filter -A INPUT -p tcp -j ACCEPT

  在filter表的INPUT鏈的末尾添加一條防火牆規則

 

  iptables -l INPUT -p udp -j ACCEPT

  在filter 表的INPUT鏈中插入一條防火牆規則

 

  iptables -l INPUT 2 -p icmp -j ACCEPT

  在filter 表的INPUT鏈中插入一條防火牆規則,做爲鏈中的第二條規則

2.5  查看規則表

  iptables -L INPUT --line-numbers

  查看filter 表INPUT鏈中全部規則,同時顯示各條規則的順序號

 

  iptables -nvL

  -L 選項放在最後,不然會將vn當成鏈名。查看filter表各鏈中全部規則的詳細信息,同時以數字形式顯示地址和端口號

2.6 刪除、清空規則

  iptables-D INPUT 2

  刪除filter 表INPUT 鏈中的第二條規則

 

  iptables -F

  不指定表名時,默認狀況filter表

 

  iptables -t nat -F

  清空nat 表中各鏈的全部規則

 

2.7  設置規則鏈的默認策略

  iptables -t filter -P FORWARD DROP

  將filter 表中FORWARD 規則的默認策略設爲DROP

 

  iptables -p OUTPUT ACCEPT

  將filter 表中OUTPUT規則的默認策略設爲ACCEPT

 

  得到iptables 相關選項的幫助信息

  iptables -p icmp -h

  查看iptables 命令中關於icmp協議的幫助信息

 

2.8  條件匹配

  流入、流出接口(-i 、-o)

  來源、目的地址(-s 、-d)

  協議類型(-p)

  源端口、目的端口(–sport 、–dport)

 

  端口匹配

  -p udp --dport 53

  匹配網絡中目的端口是53的udp協議數據包

  

  地址匹配

  拒絕轉發來自192.168.1.11主機數據,容許轉發來自192.168.0.0/24網段的數據

  iptables -A FORWARD -s 192.168.1.11 -j REJECT

  iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

 

  端口和地址聯合匹配

  -s 192.168.0.1 -d www.abc.com -p tcp --dport 80

  匹配來自192.168.0.1,去往www.abc.com的80端口的tcp協議數據包\

2.9 動做匹配

  ACCEPT DROP SNAT DNAT MASQUERADE

  -j ACCEPT 經過,容許數據包經過本鏈而不攔截它

  iptables -A INPUT -j ACCEPT

  容許全部訪問本機IP的數據包經過

  -j 丟棄、阻止數據包經過本鏈而丟棄它

  iptables -A FORWARD -s 192.168.80.39 -j DROP

  阻止來源地址爲192.168.80.39的數據包經過本機

  -j SNAT --to IP[:端口-端口] 源地址轉換,SNAT支持轉換爲單IP,也支持轉換到IP地址池

  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1

  將內網192.168.0.0/24的源地址修改成1.1.1.1

 

  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10

同上、修改爲一個地址池裏的IP

  -j DNAT --to IP [-IP][:端口-端口] 目的地址轉換,DNAT支持轉換爲單IP,也支持轉換到IP地址池

  iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1

  把從ppp0 進來的要訪問的tcp/80的數據包目的地址改成192.168.0.1

2.10  顯示匹配的使用選項及功能:

  顯式匹配的選項特別多,man iptables-extensions查看具體用法

  multiport(多端口)

  –sport

  –dports

  iprange(ip範圍)

  time(時間範圍)

  string(字符串) #對報文中的應用層數據作字符串模式匹配檢測(經過算法實現)

  connlimit(鏈接限制)

  limit(速率限制)

  state(狀態) #追蹤本機上的請求和響應之間的數據報文的狀態。狀態有五種

  –state state NEW:新鏈接請求

  –state state ESTABLISHED:已創建的鏈接

  –state state INVALID:沒法識別的鏈接

  –state state RELATED:相關聯的鏈接,當前鏈接是一個新請求,但附屬於某個已存在的鏈接

  –state state UNTRACKED:未追蹤的鏈接

  提示:

  對於進入的狀態爲ESTABLISHED都應該放行

  對於出去的狀態爲ESTABLISHED都應該放行

  嚴格檢查進入的狀態爲NEW的鏈接

  全部狀態爲INVALIED都應該拒絕

3. filter表實例詳解

1> 查看防火牆狀態

[root@localhost ~]# systemctl status firewalld                   #centos6及之前版本用service firewalld status
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-05-10 17:10:14 CST; 58min ago
     Docs: man:firewalld(1)
 Main PID: 670 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─670 /usr/bin/python -Es /usr/sbin/firewalld --nofork –nopid

2> 查看防火牆鏈與規則

[root@localhost ~]# iptables  -L -n                             #以數字結果顯示
……….                                                            #鏈與規則  
Chain IN_public (2 references)
target     prot opt source               destination        
IN_public_log  all  --  0.0.0.0/0            0.0.0.0/0          
IN_public_deny  all  --  0.0.0.0/0            0.0.0.0/0          
IN_public_allow  all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0

3> 清空規則

[root@localhost ~]# iptables -F
…….
Chain IN_public (0 references)
target     prot opt source               destination 

4> 刪除自定義鏈

[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -L -n          
Chain INPUT (policy ACCEPT)                                    #默認的三條鏈
target     prot opt source               destination        
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

5> 查看指定表的鏈(若是不指定表,則默認爲filter表)

[root@localhost ~]# iptables -t filter -L -n                 #指定查看filter表
Chain INPUT (policy ACCEPT)                                  #任何報文都容許進入
target     prot opt source               destination        
Chain FORWARD (policy ACCEPT)                                #任何報文都容許轉換
target     prot opt source               destination        
Chain OUTPUT (policy ACCEPT)                                 #任何報文都容許出去
target     prot opt source               destination

6> 設置規則(黑名單、白名單)

[root@localhost ~]# iptables -P INPUT DROP                   #不容許任何輸入規則,次操做會一同將鏈接終端斷開


#轉至主機操做 [root@localhost
~]#iptables -L Chain INPUT (policy DROP) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) [root@localhost ~]# iptables -P OUTPUT DROP [root@localhost ~]#iptables -L Chain INPUT (policy DROP) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy DROP) #不容許任何輸入輸出 #從黑名單設置白名單,讓遠程終端能鏈接主機 #先設置INPUT鏈 [root@localhost ~]#iptables -t filter -A INPUT -s 192.168.16.1 -d 192.168.16.4 -j ACCEPT # 指定filter表 input鏈上追加 源地址 目標地址 指定target爲accept [root@localhost ~]#iptables -L -n Chain INPUT (policy DROP) target port opt source destination ACCEPT all -- 192.168.16.1 192.168.16.4 #目標經過,白名單 任何協議 原地址 目標地址 #再設置OUTPUT鏈 [root@localhost ~]#iptables -t filter -I OUTPUT -s 192.168.16.4 -d 192.168.16.1 -j ACCEPT #i插入。返回報文,ip源與目標改變 Chain INPUT (policy DROP) target port opt source destination ACCEPT all -- 192.168.16.1 192.168.16.4 Chain OUTPUT (policy DROP) target port opt source destination ACCEPT all -- 192.168.16.4 192.168.16.1 #執行完操做遠程xshell就能連上了

只設置了192.168.16.4爲白名單與主機通訊,與其餘終端沒法通訊,如與192.168.16.5沒法通訊
[root@localhost ~]# ping 192.168.16.5
PING 192.168.16.5 (192.168.16.5) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

因爲設置的端口爲all,接受全部協議,所以在windows的瀏覽器是能夠訪問192.168.16.4的。

  如今將全部修改的規則改回來,以便鏈接xshell和各終端通訊

[root@localhost ~]#iptables -P INPUT ACCEPT
[root@localhost ~]#iptables -P OUTPUT ACCEPT
[root@localhost ~]#iptables -F
Last login: Fri May 10 19:01:39 2019 from 192.168.16.1
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

7> 設置httpd協議沒法訪問的規則

[root@localhost ~]# iptabels -A INPUT -s 192.168.16.1 -d 192.168.16.4 -p tcp --dport 80 -j REJECT  #拒絕 基於目標80端口和tcp協議的原地址.1訪問目標地址.4

8> 清空規則,再試驗可以訪問192.168..16網段的全部目標主機

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)    
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]# iptables -A INPUT -d 192.168.16.0/24 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.16.4 -d 192.168.16.0/24 -p tcp --sport 80 -j ACCEPT
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            192.168.16.0/24      tcp dpt:80
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.16.4         192.168.16.0/24      tcp spt:80

此時又能訪問了

4. nat表

  nat主要實現內外網的轉換,如今以實例來詳解nat表。

  現以三臺終端192.168.16.四、192.168.16.五、192.168.16.6來作實驗,.4用做客戶機(內網),.5用做防火牆主機,.6用做服務端主機(外網)。

  以課件主機爲例佈置終端。防火牆主機.5配置兩塊網卡進行內外網轉化,兩塊網卡必須與相指向的終端通網段。所以將.4客戶機網卡改成vmnet4,.6服務機網卡改成vmnet6,防火牆相應的兩塊網卡改成相同網段。

4.1 設置各終端ip

.4客戶機:vmnet4,192.168.100.2 255.255.255.0 192.168.100.1

.5防火牆主機: ens33:vmnet4,192.168.100.1,做爲網關地址 ens37:vmnet6,172.168.16.1,做爲網關地址

.6 服務機:vmnet6,172.168.16.2 255.255.255.0 172.168.16.1 注意:各網卡ip不要與物理主機衝突。

#.4:
vim/etc/sysconfig/network-scripts/-fcff-ens33 BOOTPROTER=static IPADDR=192.168.16.2 NATMASK=255.255.255.0 GATE=192.168.16.1 #.5兩塊網卡均無網關 vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=static IPADDR=192.168.16.1 NATMASK=255.255.255.0 vim /etc/sysconfig.network-scripts/ifcfg-ens37 BOOTPROTO=static IPADDR=172.168.16.1 NATMASK=255.255.255.0 #.6 :
vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTER=static IPADDR=172.168.16.2 NATMASK=255.255.255.0 GATE=172.168.16.1 #配置完成後重啓網卡。

  配置完成後.4與.6是不通的,須要打開.5的forward的轉發功能,該功能由內核參數 /proc/sys/net/ipv4/ip_forward 控制,查看該文件,其值爲0則代表還沒有開啓,須要將其值重定向爲1: echo 1 > /proc/sys/net/ipv4/ip_forward 。 此時.4和.6(內網和外網)能夠通訊了。 調定的該參數不是永久性的,重啓後失效,若要實現重啓不失效,須要寫入到配置文件 /etc/sysctl.conf 內便可:echo 「net.ipv4.ip_forward=1」 >> /etc/sysctl.conf ,再執行sysctl -p 使其生效。

 

4.2   對forword操做

#.5:若將forward DROP掉,即防火牆關閉轉換功能,內外網不通
[root@local~]#iptables -F                            #清空nat表
[root@local~]#iptables -X 
[root@local~]#iptables -P FORWARD DROP

#.4
[root@local~]#ping 172.168.16.2 #沒法ping通
 
#.5
[root@local~]#iptables -P FORWARD ACCEPT
[root@local~]#iptables -P INPUT DROP
[root@local~]#iptables -P OUTPUT DROP
 再用.4來ping. 6是能夠ping通的,即nat轉換與INPUT、OUTPUT鏈無關,只與FORWORD鏈有關

 恢復
[root@local~]#iptables -p INPUT ACCEPT
[root@local~]#iptables -P PUTPUT ACCEPT
對於內外網,其httpd服務是要啓動的(systemctl restart httpd),啓動後能夠單獨用命令curl來查看是否相通:
#.6修改網頁httpd首文件
[root@local~]#vim /var/www/html/index.html
This is webserver
:wq

#.
4
[root@local~]#curl 172.168.16.2 This is webserver
#檢測.6日誌文件 [root@local
~]#tail -f /var/log/httpd/access_log 192.168.100.2 - - [11/May/2019:18:11:52 +0000 「HTTP/1.1200 18 「_」 「curl/7.29.0
此時內網192.168.16.2能夠直接訪問外網172.168.16.2,但並不能訪問各自的網關地址,現實並非如此,因此要添加策略SNAT和DNAT,在POSTROUTING和PROROUTING鏈上實現網址轉換。
#.5:
[root@local~]#iptables -t nat -A POSTROUTING -s 192.168.100.2 -d 172.168.16.2 -p tcp –dport 80 -j SNAT  --to-source 172.168.16.1 
#凡是基於tcp協議且經過80端口的內網192.168.100.2(源)訪問外網172.168.16.2(目標),則進行SNAT轉化,用關鍵字 –to-source指定外網轉換地址172.168.16.1 [root@local~]#iptables -t nat -L -n #查看 Chain POSTROUTING(policy ACCEPT) target port opt source destination SNAT tcp -- 192.168.100.2 172.168.16.2 tcp dpt:80 to:172.168.16.1 #.4再次進行訪問 [root@loacl~]#curl 172.168.16.2 This is webserver #.6檢測日誌 [root@local~]#tail -f /var/log/httpd/access_log 172.168.16 .1 - - [11/May/2019:18:22:52 +0000 「HTTP/1.1200 18 「_」 「curl/7.29.0
再來作外網訪問內網
[root@local~]#iptables -t nat -A PREROUTING -d 172.168.16.1 -p tcp –dport 80 -j DNAT  --to-destination 192.168.16.2     #凡是訪問172.168.161這個公網地址,而且基於tcp協議、80端口的,進行DNAT轉換,轉換成192.168.16.2
[root@local~]#iptables -t nat -L -n                 #查看
Chain  PREROUTING(policy ACCEPT)
target   port  opt  source        destination
SNAT  tcp    --  0.0.0.0/0      172.168.16.1   tcp dpt:80 to:192.168.100.2 #.6訪問
[root@local~]#curl 172.168.16.1
This id client

#檢測.4日誌
[root@local~]#tail -f /var/log/httpd/access_log
172.168.16.2 - - [11/May/2019:18:22:52 +0800 「GET/HTTP/1.1200 18 「_」 「curl/7.29.0
訪問的是防火牆服務機而不是其httpd服務,檢測時將其httpd服務關閉
#.5:
[root@local~]#systemctl stop httpd #.4:
[root@local~]#curl 172.168.16.1
相關文章
相關標籤/搜索