Linux系統的防火牆:IP信息包過濾系統,它實際上由兩個組件netfilter和iptables組成。
主要工做在網絡層,針對IP數據包。體如今對包內的IP地址、端口等信息的處理上。javascript
netfilter屬於「內核態」(Kernel Space,又稱爲內核空間)的防火牆功能體系;
是內核的一部分,由一些數據包過濾表組成,這些表包含內核用來控制數據包過濾處理的規則集。css
iptables屬於「用戶態」(User Space,又稱爲用戶空間)的防火牆管理體系;
是一種用來管理Linux防火牆的命令程序,它使插入、修改和刪除數據包過濾表中的規則變得容易,一般位於/sbin/iptables目錄下。java
netfilter/iptables下文中統一簡稱爲iptables。
iptables是基於內核的防火牆,其中內置了raw、mangle、nat和 filter四個規則表。
表中全部規則配置後,當即生效,不須要重啓服務。linux
規則表的做用:容納各類規則鏈,即表中有鏈。nginx
規則表 | 說明 |
---|---|
raw表 | 肯定是否對該數據包進行狀態跟蹤。包含兩個規則鏈,OUTPUT、PREROUTING |
mangle表 | 修改數據包內容,用來作流量整形的,給數據包設置標記。包含五個規則鏈,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING |
nat表 | 負責網絡地址轉換,用來修改數據包中的源、目標IP地址或端口。包含三個規則鏈,OUTPUT、PREROUTING、POSTROUTING。 |
filter表 | 負責過濾數據包,肯定是否放行該數據包(過濾)。包含三個規則鏈,INPUT、FORWARD、OUTPUT |
注:在iptables的四個規則表中,mangle表和raw表的應用相對較少web
規則鏈的做用:容納各類防火牆規則,即鏈中有規則。sql
規則鏈 | 說明 |
---|---|
INPUT | 處理入站數據包,匹配目標IP爲本機的數據包 |
OUTPUT | 處理出站數據包,通常不在此鏈上作配置 |
FORWARD | 處理轉發數據包,匹配流經本機的數據包 |
PREROUTING | 在進行路由選擇前處理數據包,用來修改目的地址,用來作DNAT。至關於把內網中的80端口映射到路由器外網端口上 |
POSTROUTING鏈 | 在進行路由選擇後處理數據包,用來修改源地址,用來作SNAT。至關於內網經過路由器NAT轉換功能實現內網主機經過一個公網IP地址上網 |
raw>>mangle>>nat>>filterapache
CentOS 7默認使用firewalld防火牆,沒有安裝iptables,若想使用iptables防火牆。必須先關閉firewalld防火牆,再安裝iptablesvim
#關閉防火牆 [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# systemctl disable firewalld.service #安裝並開啓iptables服務 [root@localhost ~]# yum -y install iptables iptables-services [root@localhost ~]# systemctl start iptables.service
控制類型 | 做用 |
---|---|
ACCEPT | 容許數據包經過。DROP直接丟棄數據包,不給出任何迴應信息 |
REJECT | 拒絕數據包經過,會給數據發送端一個響應信息 |
SNAT | 修改數據包的源地址 |
DNAT | 修改數據包的目的地址 |
MASQUERADE | 假裝成一個非固定公網IP地址 |
LOG | 在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則。LOG只是一種輔助動做,並無真正處理數據包 |
選項 | 說明 |
---|---|
-A | 在指定鏈的末尾追加(–append)一條新的規則 |
-I | 在指定鏈的開頭插入(–insert)一條新的規則,未指定序號時默認做爲第一條規則 |
-R | 修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-P | 設置指定鏈的默認策略(–policy) |
-D | 刪除(–delete)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-F | 清空(–flush)指定鏈中的全部規則,若未指定鏈名,則清空表中的全部鏈 |
-L | 列出(–list)指定鏈中全部的規則,若未指定鏈名,則列出表中的全部鏈 |
-n | 使用數字形式(–numeric)顯示輸出結果,如顯示IP地址而不是主機名 |
-v | 顯示詳細信息,包括每條規則的匹配包數量和匹配字節數 |
–line-numbers | 查看規則時,顯示規則的序號 |
匹配條件 | 說明 |
---|---|
-p | 指定要匹配的數據包的協議類型 |
-s | 指定要匹配的數據包的源IP地址 |
-d | 指定要匹配的數據包的目的IP地址 |
-i | 指定數據包進入本機的網絡接口 |
-o | 指定數據包離開本機作使用的網絡接口 |
–sport | 指定源端口號 |
–dport | 指定目的端口號 |
直接使用,不依賴於其餘條件或擴展,包括網絡協議、IP地址、網絡接口等條件安全
協議匹配:-p 協議名 地址匹配:-s 源地址、-d 目的地址 #能夠是IP、網段、域名、空(任何地址) 接口匹配:-i 入站網卡、-o 出站網卡 例: iptables -A FORWARD ! -p icmp -j ACCEPT iptables -A INPUT -s 192.168.80.11 -j DROP iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
以特定的協議匹配做爲前提,包括端口、TCP標記、ICMP類型等條件
--sport 源端口 --dport 目的端口 #能夠是個別端口、端口範圍 --sport 1000 匹配源端口是1000的數據包 --sport 1000:3000 匹配源端口是1000-3000的數據包 --sport :3000 匹配源端口是3000及如下的數據包 --sport 1000: 匹配源端口是1000及以上的數據包 注意:--sport 和 --dport 必須配合 -p <協議類型> 使用 例: iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP
--tcp-flags TCP標記 iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT #丟棄SYN請求包,放行其餘包
--icmp-type ICMP類型 #能夠是字符串、數字代碼、、目標不可達 「Echo-Request」(代碼爲 8)表示 請求 「Echo-Reply」(代碼爲 0)表示 回顯 「Destination-Unreachable」(代碼爲 3)表示 目標不可達 關於其它可用的 ICMP 協議類型,能夠執行「iptables -p icmp -h」命令,查看幫助信息 例: iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止其它主機ping 本機 iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #容許本機ping其它主機 iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #當本機ping不通其它主機時提示目標不可達 iptables -A INPUT -p icmp -j REJECT #此時其它主機須要配置關於icmp協議的控制類型爲 REJECT
要求以「-m 擴展模塊」的形式明確指出類型,包括多端口、MAC地址、IP範圍、數據包狀態等條件
-m multiport --sports 源端口列表 -m multiport --dports 目的端口列表 例: iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
-m iprange --src-range IP範圍 iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
-m state --state 鏈接狀態 常見的鏈接狀態: NEW :與任何鏈接無關的,還沒開始鏈接 ESTABLISHED :響應請求或者已創建鏈接的,鏈接態 RELATED :與已有鏈接有相關性的(如FTP 主被動模式的數據鏈接),衍生態,通常與ESTABLISHED 配合使用 INVALID :不能被識別屬於哪一個鏈接或沒有任何狀態 iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP #禁止轉發與正常 TCP 鏈接無關的非--syn 請求數據包(如僞造的網絡攻擊數據包)
局域網主機共享單個公網IP地址接入Internet(私有IP不能在Internet中正常路由)。
一個IP地址作SNAT轉換,通常可讓內網 100到200 臺主機實現上網。
修改數據包的源地址
局域網各主機已正確設置IP地址、子網掩碼、默認網關地址
Linux網關開啓IP路由轉發
1.臨時打開: echo 1 > /proc/sys/net/ipv4/ip_forward 或 sysctl -w net.ipv4.ip_forward=1 2.永久打開: vim /etc/sysctl.conf net.ipv4.ip_forward = 1 #將此行寫入配置文件 3.sysctl -p #讀取修改後的配置
iptables -t nat -A POSTROUTING -s 192.168.80.0/24(內網IP) -o(出站) ens33(外網網卡) -j SNAT --to 12.0.0.1(外網IP或地址池) 或 iptables -t nat -A POSTROUTING -s 192.168.80.0/24(內網IP) -o(出站) ens33(外網網卡) -j SNAT --to-source 12.0.0.1-12.0.0.10(外網IP或地址池)
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE
在Internet中發佈位於局域網內的服務器。
主機型防火牆:主要使用INPUT、OUTPUT鏈,設置規則時通常要詳細的指定到端口。
網絡型防火牆:主要使用FORWARD鏈,設置規則時不多去指定到端口,通常指定到IP地址或者到網段便可。
修改數據包的目的地址
局域網的服務器可以訪問Internet
網關的外網地址有正確的DNS解析記錄
Linux網關開啓IP路由轉發
使用DNAT時,同時配合SNAT使用,才能實現響應數據包的正確返回
#把從ens33進來的要訪問web服務的數據包目的地址轉換爲 192.168.80.11 iptables -t nat -A PREROUTING -i(入站) ens33(外網網卡) -d 12.0.0.1(外網IP) -p tcp --dport 80 -j DNAT --to 192.168.80.11(內網服務器Ip) 或 iptables -t nat -A PREROUTING -i(入站) ens33(外網網卡) -d 12.0.0.1(外網IP) -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11(內網服務器IP) iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20(地址池)
#發佈局域網內部的OpenSSH服務器,外網主機需使用250端口進行鏈接 iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22
ssh -p 250 root@12.0.0.1 #在外網環境中使用SSH測試 yum -y install net-tools #若沒有 ifconfig 命令可提早使用 yum 進行安裝 ifconfig ens33
iptables-save > /opt/ipt.txt
iptables-restore < /opt/ipt.txt 將iptables規則文件保存在 /etc/sysconfig/iptables 中,iptables服務啓動時會自動還原規則 iptables-save > /etc/sysconfig/iptables systemctl stop iptables #中止iptables服務會清空掉全部表的規則 systemctl start iptables #啓動iptables服務會自動還原/etc/sysconfig/iptables 中的規則
例:tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
選項 | 說明 |
---|---|
tcp | ip icmp arp rarp和tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據包的類型 |
-i ens33 | 只抓通過接口ens33的包 |
-t | 不顯示時間戳 |
-s 0 | 抓取數據包時默認抓取長度爲68字節。加上-s 0後能夠抓取完整的數據包 |
-c 100 | 只抓取100個數據包 |
dst port !22 | 不抓取目標端口是22的數據包 |
src net 192.168.1.0/24 | 數據包的源網絡地址爲192.168.1.0/24 |
-w ./target.cap | 保存成cap文件,方便用ethereal(wireshark)分析 |
firewalld防火牆是Centos7系統默認的防火牆管理工具,取代了以前的iptables防火牆,也是工做在網絡層,屬於包過濾防火牆
firewalld和iptables都是用來管理防火牆的工具(屬於用戶態)來定義防火牆的各類規則功能,內部結構都指向netfilter網絡過濾子系統(屬於內核態)來實現包過濾防火牆功能
firewalld提供了支持網絡區域所定義的網絡鏈接以及接口安全等級的動態防火牆管理工具
它支持IPv四、IPv6防火牆設置以及以太網橋(在某些高級服務可能會用到,好比雲計算),而且擁有兩種配置模式:運行時配置與永久配置
區別項 | firewalld | iptables |
---|---|---|
配置文件 | /usr/lib/firewalld /etc/firewalld |
/etc/sysconfig/iptables |
對規則的修改 | 不須要所有刷新策略,不丟失現行鏈接 | 須要所有刷新策略,丟失鏈接 |
防火牆類型 | 動態防火牆 | 靜態防火牆 |
firewalld防火牆爲了簡化管理,將全部網絡流量分爲多個區(zone),而後根據數據包的源IP地址或傳入的網絡接口等條件將流量傳入相應區域。每一個區域都定義了本身打開或者關閉的端口和服務列表
區域 | 說明 |
---|---|
trusted(信任區域) | 容許全部的傳入流量 |
public(公共區域) | 容許與ssh或dhcpv6-client預約義服務匹配的傳入流量,其他均拒絕。是新添加網絡接口的默認區域 |
external(外部區域) | 容許與 ssh 預約義服務匹配的傳入流量,其他均拒絕。 默認將經過此區域轉發的IPv4傳出流量將進行地址假裝,可用於爲 路由器啓用了假裝功能的外部網絡 |
home(家庭區域) | 容許與ssh、ipp-client、mdns、samba-client或dhcpv6-client預約義服務匹配的傳入流量,其他均拒絕 |
internal(內部區域) | 默認值時與home區域相同 |
work(工做區域) | 容許與 ssh、ipp-client、dhcpv6-client 預約義服務匹配的傳入流量,其他均拒絕 |
dmz(隔離區域也稱爲非軍事區域) | 容許與 ssh 預約義服務匹配的傳入流量,其他均拒絕 |
block(限制區域) | 拒絕全部傳入流量 |
drop(丟棄區域) | 丟棄全部傳入流量,而且不產生包含ICMP的錯誤響應 |
firewalld對於進入系統的數據包,會根據數據包的源IP地址或傳入的網絡接口等條件,將數據流量轉入相應區域的防火牆規則。對於進入系統的數據包,首先檢查的就是其源地址
經常使用的firewall-cmd命令選項 | 說明 |
---|---|
--get-default-zone | 顯示當前默認區域 |
--set-default-zone= | 設置默認區域 |
--get-active-zones | 顯示當前正在使用的區域及其對應的網卡接口 |
--get-zones | 顯示全部可用的區域 |
--get-zone-of-interface= | 顯示指定接口綁定的區域 |
--zone= --add-interface= | 爲指定接口綁定區域 |
--zone= --change-interface= | 爲指定的區域更改綁定的網絡接口 |
--zone= --remove-interface= | 爲指定的區域刪除綁定的網絡接口 |
--get-zone-of-source= |
顯示指定源地址綁定的區域 |
--zone= --add-source= |
爲指定源地址綁定區域 |
--zone= --change-source= |
爲指定的區域更改綁定的源地址 |
--zone= --remove-source= |
爲指定的區域刪除綁定的源地址 |
--list-all-zones | 顯示全部區域及其規則 |
[--zone=] --list-all | 顯示全部指定區域的全部規則,省略--zone=時表示僅對默認區域操做 |
[--zone=] --list-services | 顯示指定區域內容許訪問的全部服務 |
[--zone=] --add-service= | 爲指定區域設置容許訪問的某項服務 |
[--zone=] --remove-service= | 刪除指定區域已設置的容許訪問的某項服務 |
[--zone=] --list-ports | 顯示指定區域內容許訪問的全部端口號 |
[--zone=] --add-port=[-]/ | 爲指定區域設置容許訪問的某個/某段端口號(包括協議名) |
[--zone=] --remove-port=[-]/ | 刪除指定區域已設置的容許訪問的端口號(包括協議名) |
[--zone=] --list-icmp-blocks | 顯示指定區域內拒絕訪問的全部 ICMP 類型 |
[--zone=] --add-icmp-block= | 爲指定區域設置拒絕訪問的某項 ICMP 類型 |
[--zone=] --remove-icmp-block= | 刪除指定區域已設置的拒絕訪問的某項ICMP類型 |
firewall-cmd --get-icmptypes | 顯示全部 ICMP 類型 |