firewall和netfilter
- 臨時關閉防火牆 selinux 使用命令 setenforce 0
- 若是想永久關閉防火牆,須要修改配置文件
- 配置文件地址是 /etc/selinux/config
- 可使用 vi /etc/selinux/config 進行修改
- 如圖,打開config文件後,能夠看到上圖內容
- 這裏須要把 SELINUX=enforcing 的值 修改成 disabled
- 也就是 SELINUX=disabled ,而後保存退出,重啓系統就生效了
- 如圖,命令 getenforce 能夠查看 selinux 的狀態
- 上圖顯示爲 Enforcing 表示是打開狀態
- 使用 setenforce 0 命令把 selinux 臨時關閉
- 而後再使用 getenforce 查看 selinux 的狀態
- 能夠看到變成了 Permissive
- Permissive的意思是,一些會觸發防火牆的操做,系統會提出警告
- 若是是 Enforcing 狀態,系統會直接打斷操做
- 而 Permissive 狀態下,系統不會打斷操做,可是會在後臺記錄警告信息
- 也就是說,能夠進行一些會觸發 selinux 的操做
- 除了selinux這個防火牆外,還有另一個防火牆叫作 netfilter
- selinux防火牆是對內的,而 netfilter 是對外的
- 網絡過來的包會被netfilter處理,若是經過了netfilter
- 進入到系統內部,則會受到 selinux 的限制
- 想要控制 netfilter 工做
- 可使用 iptables 和 firewalld 這兩個工具來操做netfilter
- centOS7 以前的版本,都是使用 iptables 來操做 netfilter
- 從centOS7開始,新增了 firewalld 工具也能夠操做 netfilter
- firewalld 本質上是 iptables 的封裝
- firewalld 的命令實際上也是由 iptables 來實現的
- 等因而把複雜的iptables命令封裝起來,變成一條簡單的firewalld命令
- 與iptables相比,firewalld操做簡單一些,也有更強大的功能
- centOS7 的默認防火牆工具是 firewalld 而不是 iptables
- 在firewalld裏面也可使用iptables的命令
- 可是不推薦使用,在firewalld工具裏面最好仍是使用firewalld命令爲佳
- 由於firewalld也是用iptables來實現的,不少公司也在用centOS6,不支持firewalld
- 因此 iptables 也是要了解清楚的
- centOS7 默認使用的是 firewalld
- 若是想使用 iptables 須要先關閉 firewalld
- 如圖,systemctl disable firewalld 關閉firewalld,這樣重啓後就不會啓動firewalld
- 下面的命令 systenctl stop firewalld 是中止正在運行的firewalld服務
- 這樣就把 firewalld 設置爲關閉,而且中止了正在運行的firewalld
- 要使用 iptables 要先安裝一個包,如上圖
- 關閉了 firewalld 服務後,須要開啓 iptables 服務
- 如圖,systemctl enable ipptables 命令將iptables 設置爲可開啓狀態
- 而後 systemctl start iptables 打開 iptables 服務
- 如圖,使用命令 iptables -nvL 能夠查看 iptables 的默認規則信息
netfilter5表5鏈介紹
- 使用命令 man iptables
- 往下翻頁,能夠看到上圖中的信息
- filter,nat,mangle,raw,security 表明5張表
- 默認的表是 filter
- 如圖,filter 解釋裏面有三個鏈的信息
- filter內置了3個鏈,分別是 input,output,forward 三個鏈
- input 能夠對進入本機系統內核的數據包進行處理
- forward 是指進入機器的數據包,可是不進入系統內核
- 由於有些數據包通過本機,可是目標地址並非本機
- 若是數據包的目標地址不是本機,只是路過本機就會進入 forward 鏈
- forward鏈就能夠對這些數據包進行操做,好比 修改目標地址
- output鏈能夠對 本機內核出去的數據包進行一些操做
- 舉例說明,本機要發一個數據包到一個ip地址去
- 可是管理員不但願本機有任何數據包被髮送到這個ip地址
- 這時就能夠在output鏈設置規則,全部目標地址是這個ip地址的包都不能出去
- 前提是這些數據包是本機產生的,由於output只對本機產生的包有效
- 如圖所示,外面發送數據包到本機
- 數據包會從 in 的位置進入,首先通過 prerouting 鏈
- 在 prerouting 鏈裏面,會通過三張表的策略進行判斷數據包的去向
- 每一個鏈裏面,都有顯示 表 的名稱
- 就說明,通過這個鏈的時候,這些表裏面寫好的規則會起做用
- 好比說,prerouting 裏面有三個表,nat,mangle,raw
- 這說明,在這三個表裏面,能夠寫一些針對通過 prerouting 鏈的數據包的規則
- 每個通過 prerouting 鏈的數據包,都會被這些規則處理一遍
- 從鏈的流向來看,數據包到達 prerouting鏈,這裏會判斷數據包的目的地
- 目的地是本機,數據包會進入 input 鏈,而後到達本機內核
- 通過內核處理,本機發出的數據包會進入 output 鏈,而後到達postrouting鏈
- 若是數據包的目的地不是本機,而是由本機進行轉發
- prerouting鏈 就會判斷將數據包發向 forward鏈
- 數據包通過 forward鏈 進入 postrouting鏈,而後從網卡出去
- 每通過一條鏈的時候,若是在相應的表裏面寫了規則
- 那麼數據包通過這條鏈的時候,就會按照這些規則進行處理
- 若是沒寫規則,就直接放行了
- 每條鏈有不一樣的表能夠設置規則,每條鏈並不可使用全部表的規則
- 只有 對應的表的規則 可使用
- filter,nat,mangle,raw,security 這5個表裏面
- 經常使用的就是 filter 和 nat
- 剩下的三個都不怎麼經常使用,主要了解 filter 和 nat
- filter 主要是用來過濾數據包的,能夠設置怎樣的數據包不能經過之類的
- nat 則是處理網絡地址轉換,也就是跟ip有關的規則
iptables語法
- 使用 iptables -nvL 查看規則信息
- 如圖,能夠看到 input,forward,output三條鏈上的規則
- iptables 若是不指定表的話,默認就是顯示 filter 的規則信息
- 因此圖中顯示的鏈是 filter 能夠操做的鏈
- 上圖命令能夠重啓 iptables
- 上圖是 cat 默認規則的配置文件,/etc/sysconfig/iptables 就是規則的配置文件
- 每次重啓iptables後,都會從這個配置文件裏面導入規則
- 因此若是不把本身修改的規則保存到這個配置文件裏面的話
- 每次重啓,以前本身修改的規則就會消失,由於會從新加載這個配置文件的規則
- 如圖, iptables -F 命令能夠把目前正在運行的規則清空
- 執行上面命令後,再使用 iptables -nvL 查看規則
- 能夠看到,下面的規則表已經清空了,沒有任何規則信息了
- 可是 -F 參數只能清空正在運行的規則列表
- 這時打開 iptables配置文件查看的話,就會發現
- iptables配置文件裏面仍是有規則,並無清空
- 若是重啓 iptables 的話,配置文件裏面的規則會被從新加載
- 若是想把當前運行狀態的規則保存到配置文件裏面
- 可使用上圖命令
- 例如,當前狀態是 空規則,若是使用 service iptables save
- 那麼配置文件裏面的規則就會被空規則覆蓋掉,也就是說沒有任何規則
- 不過通常不這樣作,由於能夠在須要的時候從新加載配置文件
- 把清空的規則加載回來
- 由於不指定表的話,默認表就是 filter
- 因此上面的操做都是針對 filter表的,包括清空規則
- 若是想指定修改的表
- 如圖,可使用 -t 參數
- 上圖中,-t nat 就是指定顯示 nat 表的規則
- 如上圖所示,規則信息,第一列是包的數量
- 第二列是數據包總的大小,單位是字節
- 這兩列數據是能夠清空的
- 使用命令 iptables -Z 就能夠清空這兩列數據
- 參數 -Z 能夠把計數器清零
- 上圖命令是添加規則的命令
- iptables 後面的參數裏面,沒有 -t 說明沒有指定表
- 在沒有指定表的狀況下,就是對默認表 filter 進行操做
- 參數 -A 是 add 增長規則的意思
- 後面接 INPUT 是指增長的規則是針對 input鏈的
- 也就是說,這條規則會對 input鏈的數據包進行操做
- 後面的 -s 參數是指定數據包來源的 ip,後面接來源 ip地址
- 參數 -p 是指定數據包傳輸協議的,後面接協議名稱,這裏是 tcp
- 參數 --sport 是指定數據包來源端口的,後面是端口號 1234
- 參數 -d 是指定數據包目標ip的,後面接目標ip地址
- 參數 --dport 是指定數據包目標ip端口的,後面接端口號,這裏是80
- 參數 -j 是指定操做規則的,後面接規則名稱,這裏是 DROP
- DROP 是指符合以上設置的數據包會被直接扔掉,不能經過
- 也可使用 REJECT 規則,這個規則也是不讓數據包經過
- 與 DROP的區別是,drop會直接扔掉,reject會通知對方本身扔掉了數據包
- 通常都是使用 DROP
- 執行完增長規則的命令後,使用 -nvL 查看filter規則信息
- 如上圖,input鏈全部規則,最下面增長了一條規則
- 第三列是 DROP 表示這是 drop 規則
- 後面是他 tcp 表示協議,而後是來源ip 和 目標ip
- 最後是 來源端口 和 目標端口
- 通常來講,增長規則後,新規則都會出如今原來規則的最下面,優先級是靠後的
- 上圖命令也能夠增長規則
- 參數 -I 是插入一條規則的意思, INPUT 是規則插入input鏈
- 後面指定了 -p tcp 協議,還有 --dport 80
- 指定端口,前面必須先指定協議,否則會報錯
- 最後是規則 -j DROP
- 這條命令是把 目標地址端口號爲 80 的數據包 drop掉
- 如上圖,插入的規則出如今全部規則的最上面
- 若是是使用 -A 增長規則,新規則會出如今全部規則的最下面
- 插入 -I 的意義就是能夠把新規則插入到全部規則最上面,提升優先級
- 一條鏈裏面規則的執行順序是從上到下的,會先執行上面的,一條一條往下執行
- 因此 I 參數可讓新規則插入到最高優先級
- 上圖是刪除命令,若是想刪除剛纔插入的規則
- 把 -I 參數 換成 -D 參數 後面跟插入命令如出一轍,就能夠刪除剛纔插入的命令
- 可是有一個問題,若是忘記了後面的命令怎麼寫,應該怎樣刪除舊的命令
- 上圖是顯示規則編號的命令
- iptables -nvL --line-number 能夠多顯示一列,num列
- 參數 --line-number 能夠顯示規則的編號
- 而後使用命令 iptables -D INPUT + 規則編號 就能夠刪除相應編號的規則
- 如圖,參數 -D表示刪除,INPUT表示規則是input鏈的,7表示編號7的規則
- 執行這條命令後,如圖,編號7的規則就已經刪除了
- 如圖所示,policy 是指默認的策略,後面接 ACCEPT
- 說明,默認的規則就是 ACCEPT
- 若是一條鏈上面沒有設置任何規則
- 那麼經過這條鏈的數據包就會按照默認策略進行處理
- 好比這裏,默認策略是 ACCEPT ,若是沒有設置規則的話,數據包都是直接經過的
- 默認策略是能夠更改的,上圖命令 iptables -P OUTPUT DROP
- 就能夠把 OUTPUT鏈上的默認策略改成DROP
- 參數 -P 就是設置 policy的意思,OUTPUT是指output鏈,DROP就是具體策略
- 因此上面命令就是,設置 OUTPUT鏈的policy爲 DROP
- 若是是經過xshell遠程鏈接,執行上面命令的話就會直接斷線
- 由於遠程鏈接須要跟主機有數據包的往返操做
- 這條命令把主機出來的數據包drop掉了,主機就沒辦法跟外界有交流
- 若是執行了這條命令斷線後,須要在主機的終端
- 從新把默認策略修改成 ACCEPT 才能恢復遠程鏈接
- 因此,默認策略通常不用修改,都是保持 ACCEPT 狀態
- 須要攔截數據包就添加規則
iptables filter表小案例
- 這個案例是把 80端口,21端口,22端口的數據放行
- 22端口指定一個ip段,只有這個ip段才能夠訪問
- 如上圖,編輯一個iptables.sh文件
- 在iptables.sh內輸入上圖內容
#!/bin/bash
ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
- 而後 wq 保存退出,這是一個腳本
- /usr/sbin/iptables 是iptables命令的文件路徑
- 把這個文件賦值給了變量 ipt
- 下面的命令,$ipt -F 就是執行了清空規則的命令
- $ipt -P INPUT DROP 是把input鏈的策略修改成DROP
- $ipt -P OUTPUT ACCEPT,$ipt -P FORWARD ACCEPT 就是把output和forward鏈的策略
- 設置爲 ACCEPT
- $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- input策略是DROP,這條命令是設置經過條件
- 符合上面規則的數據包就能夠經過
- 參數 -m 是設置模塊,模塊指定爲 state
- 指定了state模塊後,就可使用 --state 指定狀態
- RELATED,ESTABLISHED 表示兩個狀態
- 參數 -j 指定規則爲 ACCEPT
- 因此條件就是 狀態爲 RELATED,ESTABLISHED 的數據包能夠經過
- $ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
- 上面命令是指定特定網段的數據才能夠經過
- 參數 -s 指定來源ip端口爲 192.168.133.0/24
- 參數 -p指定協議爲 tcp
- tcp的擴展模塊 --dport 指定目標端口爲 22
- 因此來自於192.168.133.0/24 這個網段/端口的數據包,若是目標端口是22就能夠經過
- $ipt -A INPUT -p tcp --dport 80 -j ACCEPT
- $ipt -A INPUT -p tcp --dport 21 -j ACCEPT
- 以上兩條命令是 目標端口爲 80 或者 21 的數據包均可以經過
- 也就是開放了80和21端口,向這兩個端口發送數據就能夠經過
- 如圖,sh 執行這個腳本
- 如圖,查看filter規則,能夠看到,input鏈的規則已經變成腳本設置的規則了
- 上圖命令的做用是,使外部的機器沒法 ping 通本機
- 本機網絡是通的,使用了這條規則後
- 本機ping外面的ip是能夠通的,外面的ip ping進來是沒法ping通的
- 可是本機網絡倒是通的,也就是說,這條命令就是讓外面沒法ping通本機
- 不影響本機網絡的使用