Linux基礎之防火牆

Linux基礎之防火牆前端

Iptables

  最初認識iptables仍是在安卓手機上玩tiny的時候知道的,什麼掃地僧、Jume等防跳腳本都基於iptables原理,一直以爲iptables的命令很長、難懂,等真正認識了以後發現也不過如此。web

  iptables是CentOS上的防火牆軟件(之因此叫軟件是由於它是調用系統內核中的netfilter),雖然在CentOS 7 上使用Firewall來代替直接使用iptables,可是iptables仍然具備很普遍的應用。centos

  在說iptables以前,先想一下防火牆的做用。防火牆是用來幹什麼的呢?主要對數據進行攔截過濾轉發等等,既然是攔截,那麼就得規定怎麼攔截、攔截什麼樣的數據,這種規定咱們通常稱之爲策略
  在咱們攔截到數據包以後要作什麼樣的動做呢?好比放行、扔掉或者轉發等。這些行爲咱們稱之爲動做target)。
  除了定義怎麼攔截,咱們還須要定義在哪能夠攔截,網絡上的數據時經過網卡過來的,首先通過內核,而後纔會到達用戶空間,若是是一個http請求的話,用戶空間的web服務器接收到請求以後開始給客戶端響應,就把數據往外發送,這中間就能夠設立幾個攔截點,這種攔截點咱們稱之爲chain),爲何叫作鏈呢?由於在一個節點上能夠由有數個規則,這些規則按照順序從上往下依次匹配,就像一個鏈子同樣,所以稱之爲
  咱們說防火牆除了能夠攔截以外,還有轉發、修改數據的做用,那咱們就能夠把這些類似的規則放到一塊,這個用來存放一類規則的東西叫作(table)。服務器

  那麼在Linux中總共有多少條鏈、多少張表?網絡

  答案是5條鏈,4張表app

5條鏈:ssh

  • PREROUTING:路由前(外到內)
  • INPUT:入
  • OUTPUT:出
  • FORWARD:轉發
  • POSTROUTING:路由後(內到外)

4張表:tcp

  • raw :高級功能,如:網址過濾。
  • mangle :數據包修改(QOS),用於實現服務質量。
  • nat :地址轉換,用於網關路由器。
  • filter :包過濾,用於防火牆規則。

以及幾種經常使用的動做:centos7

  • ACCEPT:容許數據包經過。
  • DROP:直接丟棄數據包,不給任何迴應信息,這時候客戶端會感受本身的請求泥牛入海了,過了超時時間纔會有反應。
  • REJECT:拒絕數據包經過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。
  • SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
  • MASQUERADE:是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上。
  • DNAT:目標地址轉換。
  • REDIRECT:在本機作端口映射。
  • LOG:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則,也就是說除了記錄之外不對數據包作任何其餘操做,仍然讓下一條規則去匹配。

有了上面的概念,下面的圖就容易理解了:.net

iptables

  不一樣的表能夠做用與同一條鏈,標的順序按raw -> mangle -> nat -> filter依次做用。
  不一樣的表能夠做用到不一樣的鏈,做用範圍分別是:

  • PREROUTING:
    • raw 表
    • mangle 表
    • nat 表
  • INPUT:
    • mangle 表
    • (centos7中還有nat表,centos6中沒有)
    • filter 表
  • FORWARD:
    • mangle 表
    • filter 表
  • OUTPUT:
    • raw 表
    • mangle 表
    • nat 表
    • filter 表
  • POSTROUTING:
    • mangle 表
    • nat 表

  大多數狀況下咱們都是操做filer表來進行端口的放行和攔截,Linux中默認也是操做filter表。對於同一條鏈以及同一張表的的多個規則,嚴格按照從上到下的順序進行做用。好比A規則在上,對某種數據包進行攔截,B規則在下,對同種數據包進行放行,那麼這種數據包只會被攔截而不會被放行,即在上的A規則起做用。

iptables命令

  有了上面的知識對於下邊的命令就好理解了

iptables -t 表名 <-A/I/D/R> 規則鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動做

其中:

  • -t 表名能夠省略,默認操做filter表。
  • -A/I/D/R 規則鏈名 [規則號]爲操做的鏈:
    • -A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最後,最後纔會被執行。規則是由後面的匹配來指定。
    • -I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規則。默認規則號爲1,即在頭部插入。
    • -D, --delete chain rule-specification / rulenum 在指定的鏈 chain 中刪除一個或多個指定規則。
    • -R --replace rulenum:替換/修改第幾條規則
  • -i/o 網卡名能夠指定網絡接口
    • -i 網絡接口:指定數據包進入本機的網絡接口
    • -o 網絡接口:指定數據包要離開本機所使用的網絡接口
  • -p 協議名能夠指定協議,好比TCPUDP、SCTP等
  • -s 源IP/源子網 --sport 源端口這裏指的是其餘機器的IP和端口
  • -d 目標IP/目標子網 --dport這裏指的是本機的IP和端口
  • -j 動做匹配到數據包以後要作什麼

  其中-開頭爲簡潔指令,--爲全指令,他們是等價的,部分指令沒有簡潔模式(好比--dport)。

經常使用參數

  下面這些其實用iptables -h就全都出來了……

鏈管理

  簡潔模式和完整命令(chain表明鏈,target表明策略):

  • -P, --policy chain target:爲指定的鏈設置默認策略。(注意,只有內置的鏈才容許有策略,用戶自定義的是不容許的)。
  • -F, --flush [chain] 清空指定鏈上面的全部規則。若是沒有指定鏈,清空該表上全部鏈的全部規則。
  • -N, --new-chain chain_name 用指定的名字建立一個新的鏈。(new後面的 -chain 能夠省略)
  • -X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,並且這條上必須沒有任何規則。若是沒有指定鏈名,則會刪除該表中全部非內置的鏈。
  • -E, --rename-chain old_chain new_chain :用指定的新名字去重命名指定的鏈。這並不會對鏈內部照成任何影響。
  • -Z, --zero [chain] :把指定鏈,或者表中的全部鏈上的全部計數器清零。

規則管理

  • -A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最後,最後纔會被執行。規則是由後面的匹配來指定。
  • -I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規則。默認爲1,也就是在頭部插入。(rulenum爲行號,能夠加入--line來顯示行號)
    • -D, --delete chain rule-specification
    • -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規則。
  • -R --replace chain rulenum:替換/修改第幾條規則

數據匹配

  • -p:指定要匹配的數據包協議類型(通常爲TCP、UDP)
  • -s--source [!] address[/mask] :把指定的一個/一組地址做爲源地址,按此規則進行過濾。當後面沒有 mask 時,address 是一個地址,好比:192.168.1.1;當 mask 指定時,能夠表示一組範圍內的地址,好比:192.168.1.0/255.255.255.0。
  • -d--destination [!] address[/mask] :地址格式同上,但這裏是指定地址爲目的地址,按此進行過濾。
  • -i--in-interface [!] <網絡接口> :指定數據包的來自來自網絡接口,好比最多見的 eth0 。注意:它只對 INPUT,FORWARD,PREROUTING 這三個鏈起做用。若是沒有指定此選項, 說明能夠來自任何一個網絡接口。同前面相似,"!" 表示取反。
  • -o--out-interface [!] <網絡接口> :指定數據包出去的網絡接口。只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起做用。

其餘

  • -t--table table選擇要操做的表,能夠省略,默認filter
  • -L--list [chain [rulenum]]查看規則
    • -v:詳細模式
    • -n:取消解析,直接顯示IP
    • -x:精確數值
    • --line--line-numbers顯示行號

CentOS 6 & 7

  咱們修改的命令都是爲保存的,下次開機就沒有了,那麼如何保存呢?
  在CentOS 6 中能夠直接service iptables save來保存。
  可是在CentOS 7 中移除了大部分Service iptables命令,可是並無徹底去除iptables,而是和firewalld共存。
  咱們可使用下面的命令來吧firewalld更改成iptables:

# 檢查firewalld是否運行,
firewall-cmd --state
#中止firewalld
systemctl stop firewalld
#禁止firewalld自動啓動
systemctl disable firewalld
#安裝iptables-service
yum install -y iptables-services
#啓動iptables
systemctl start iptables
#將iptables設置爲開機自動啓動,之後便可經過iptables-service控制iptables服務
systemctl enable iptables

而後就可使用service iptables save來保存規則了。
命令保存以後須要重啓服務來使之生效


這裏放幾條經常使用的命令:

#容許全部本機向外的訪問
iptables -A OUTPUT -j ACCEPT
#容許訪問22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#容許訪問80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#容許ftp服務的21端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#容許FTP服務的20端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 保存
service iptables save
# 備份
iptables-save > filename
# 恢復
iptables-restore < filename

FirewallD

  既然提到了CentOS 7 那就不得不說它的新防火牆FirewallD。
  爲何紅帽子要替換掉Iptables呢?也不能說是替換吧,firewalld是iptables的前端控制器,只能說爲何推薦使用FirewallD。FirewallD最明顯的一個好處就是比Iptables簡單,Iptables的4張表5條鏈是有點麻煩的,而且FirewallD有一些新的特色,好比規則動態生效、加入區域(區域其實就是一些配置好的規則集。)等。
  若是使用FirewallD的話推薦只使用FirewallD命令。

  須要注意的是FirewallD默認爲拒絕,iptables默認爲接收,而且啓動過FirewallD以後,會在iptables表中留下規則,可使用iptables -F來清楚規則。

  下面列出一些經常使用命令:

# firewalld開/關/(守護進程)狀態/重啓
systemctl  start|stop|status|restart  firewalld
# 開機自啓/禁止自啓
systemctl  enable|disable  firewalld

FirewallD使用firewall-cmd的方式來進行操做:

# 幫助
firewall-cmd --help
# 版本
firewall-cmd --version
# 狀態
firewall-cmd --state
# 從新加載配置
firewall-cmd --reload
===========================================
#添加端口/協議(tcp/udp)端口能夠填2000-3000來做爲一個範圍
firewall-cmd --add-port=<port>/<protocol>
#移除端口/協議(tcp/udp)這裏tcp和udp是小寫
firewall-cmd --remove-port=<port>/<protocol>
#查看開放的端口
firewall-cmd --list-ports
===========================================
# 容許協議 (例:icmp,即容許ping)
firewall-cmd --add-protocol=<protocol> 
# 取消協議
firewall-cmd --remove-protocol=<protocol> 
# 查看容許的協議
firewall-cmd --list-protocols 
===========================================
# 拒絕全部流量,遠程鏈接會當即斷開,只有本地能登錄
firewall-cmd --panic-on
# 取消應急模式,但須要重啓firewalld後才能夠遠程ssh
firewall-cmd --panic-off
# 查看是否爲應急模式
firewall-cmd --query-panic
===========================================
# 查看當前區域
firewall-cmd --get-default-zone
# 查看全部區域
firewall-cmd --get-zones
# 設置默認區域爲public(這也是默認的區域)
firewall-cmd --set-default-zone=public
===========================================
# 列出全部服務(服務即爲定義好的端口和協議)
firewall-cmd --get-services
# 列出當前zone下加載的service
firewall-cmd --list-services
# 給指定zone添加service
firewall-cmd --zone=public --add-service=http
# 指定區域移除服務
firewall-cmd --zone=public --remove-service=http

  以上命令均爲臨時操做,重啓服務器以後規則消失。能夠添加--permanent參數來將規則添加到配置文件,而後從新加載配置便可生效。


參考:Iptables詳解

相關文章
相關標籤/搜索