在計算機科學領域中,防火牆(Firewall)是一個架設在互聯網與企業內網之間的信息安全系統,根據企業預約的策略來監控往來的傳輸。html
防火牆多是一臺專屬的網絡設備或是運行於主機上來檢查各個網絡接口上的網絡傳輸。它是目前最重要的一種網絡防禦設備,從專業角度來講,防火牆是位於兩個(或多個)網絡間,實行網絡間訪問或控制的一組組件集合之硬件或軟件。python
防火牆最基本的功能就是隔離網絡,經過將網絡劃分紅不一樣的區域(一般狀況下稱爲ZONE),制定出不一樣區域之間的訪問控制策略來控制不一樣信任程度區域間傳送的數據流。防火牆工做與主機和網絡的邊緣。linux
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) |
分析數據報文進入本機後應用了哪些表規則以及鏈規則;
filter表的規則,filter表決定是否放行數據包經過,若是經過,則必須經由INPUT鏈流入數據包(內核—input—用戶空間),INPUT鏈是處理入站數據的,若是沒問題,繼續放行到用戶空間,再經由OUTPUT鏈將數據包流出。
nat表的規則,nat表主要實現轉發功能,數據包先經由PREROUTING鏈進行路由選擇,選擇好路線後再經由FORWARD鏈轉發數據,而後再進行一個路由選擇,最後由POSTROUTING鏈流出數據。
1)要實現什麼功能:添加在哪一個表上;
2)報文流經的路徑:添加在哪一個鏈上。
策略應用優先級:raw,mangle,nat,filter;
策略經常使用優先級:filter,nat,mangle,raw。
入站數據流向:來自外界的數據包到達防火牆,首先被PREROUTING規則鏈處理(是否被修改地址),以後會進行路由選擇(判斷該數據包應該發往何處),若是數據包的目的地址是防火牆本機,那麼內核將其傳遞給INPUT鏈處理,經過之後再交給上次的應用程序進行響應。
轉發數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,以後進行路由選擇,若是數據包的目標地址是其餘外部地址,則內核將其傳遞給FORWALD鏈進行處理,而後再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
出站數據流向:防火牆自己向外部地址發送數據包,首先被OUTPUT規則鏈處理,以後進行路由選擇,而後交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
規則鏈內部各防火牆規則之間的優先順序
依次按第1條規則、第2條規則、第3條規則、·····的順序進行處理,找到一條可以匹配的數據包規則,則再也不繼續檢查後面的規則(使用LOG記錄日誌的規則例外)若是找不到規則,就按照規則鏈的默認策略進行處理。
iptables [ -t 表名] 命令選項 [ 鏈名] [ 條件匹配] [ -j 目標動做或者跳轉]
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 |
查看規則列表時,同步顯示規則在鏈中的順序號 |
選項 |
做用 |
-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 |
地址假裝 |
自定義鏈 |
自由定義鏈中的規則進行匹配 |
#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鏈中插入一條防火牆規則,做爲鏈中的第二條規則
iptables -L INPUT --line-numbers
查看filter 表INPUT鏈中全部規則,同時顯示各條規則的順序號
iptables -nvL
-L 選項放在最後,不然會將vn當成鏈名。查看filter表各鏈中全部規則的詳細信息,同時以數字形式顯示地址和端口號
iptables-D INPUT 2
刪除filter 表INPUT 鏈中的第二條規則
iptables -F
不指定表名時,默認狀況filter表
iptables -t nat -F
清空nat 表中各鏈的全部規則
iptables -t filter -P FORWARD DROP
將filter 表中FORWARD 規則的默認策略設爲DROP
iptables -p OUTPUT ACCEPT
將filter 表中OUTPUT規則的默認策略設爲ACCEPT
得到iptables 相關選項的幫助信息
iptables -p icmp -h
查看iptables 命令中關於icmp協議的幫助信息
流入、流出接口(-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協議數據包\
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
顯式匹配的選項特別多,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都應該拒絕
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的。
![](http://static.javashuo.com/static/loading.gif)
如今將全部修改的規則改回來,以便鏈接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
此時又能訪問了
nat主要實現內外網的轉換,如今以實例來詳解nat表。
現以三臺終端192.168.16.四、192.168.16.五、192.168.16.6來作實驗,.4用做客戶機(內網),.5用做防火牆主機,.6用做服務端主機(外網)。
以課件主機爲例佈置終端。防火牆主機.5配置兩塊網卡進行內外網轉化,兩塊網卡必須與相指向的終端通網段。所以將.4客戶機網卡改成vmnet4,.6服務機網卡改成vmnet6,防火牆相應的兩塊網卡改成相同網段。
.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 使其生效。
#.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.1」 200 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.1」 200 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.1」 200 18 「_」 「curl/7.29.0」
訪問的是防火牆服務機而不是其httpd服務,檢測時將其httpd服務關閉
#.5:
[root@local~]#systemctl stop httpd #.4:
[root@local~]#curl 172.168.16.1