Linux基礎之防火牆前端
最初認識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
4張表:tcp
以及幾種經常使用的動做:centos7
ACCEPT
:容許數據包經過。DROP
:直接丟棄數據包,不給任何迴應信息,這時候客戶端會感受本身的請求泥牛入海了,過了超時時間纔會有反應。REJECT
:拒絕數據包經過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。SNAT
:源地址轉換,解決內網用戶用同一個公網地址上網的問題。MASQUERADE
:是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上。DNAT
:目標地址轉換。REDIRECT
:在本機作端口映射。LOG
:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則,也就是說除了記錄之外不對數據包作任何其餘操做,仍然讓下一條規則去匹配。有了上面的概念,下面的圖就容易理解了:.net
不一樣的表能夠做用與同一條鏈,標的順序按raw -> mangle -> nat -> filter
依次做用。
不一樣的表能夠做用到不一樣的鏈,做用範圍分別是:
大多數狀況下咱們都是操做filer表來進行端口的放行和攔截,Linux中默認也是操做filter表。對於同一條鏈以及同一張表的的多個規則,嚴格按照從上到下的順序進行做用。好比A規則在上,對某種數據包進行攔截,B規則在下,對同種數據包進行放行,那麼這種數據包只會被攔截而不會被放行,即在上的A規則起做用。
有了上面的知識對於下邊的命令就好理解了
iptables -t 表名 <-A/I/D/R> 規則鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動做
其中:
-t 表名
能夠省略,默認操做filter表。-A/I/D/R 規則鏈名 [規則號]
爲操做的鏈:
-i/o 網卡名
能夠指定網絡接口
-i 網絡接口
:指定數據包進入本機的網絡接口-o 網絡接口
:指定數據包要離開本機所使用的網絡接口-p 協議名
能夠指定協議,好比TCP、UDP、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 中能夠直接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
既然提到了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詳解