開源的基於數據包過濾的網絡安全策略控制工具。web
centos6.9 --- 默認防火牆工具軟件iptablesshell
centos7 --- 默認防火牆工具軟件firewalld(zone)vim
iptables主要工做在OSI七層的2、3、四層,若是從新編譯內核,iptables也能夠支持7層控制(squid代理+iptables)。centos
iptables是採用數據包過濾機制工做的,因此它會對請求的數據包的包頭數據進行分析,並根據咱們預先設定的規則進行匹配來決定是否能夠進入主機。安全
一、防火牆是一層層過濾的。實際是按照配置規則的順序從上到下,從前到後進行過濾的。服務器
二、若是匹配上了規則,即明確代表是阻止仍是經過,此時數據包就不在向下匹配新規則了。網絡
三、若是全部規則中沒有明確代表是阻止仍是經過這個數據包,也就是沒有匹配上規則,向下進行匹配,直到匹配默認規則獲得明確的阻止仍是經過。架構
四、防火牆的默認規則是對應鏈的全部的規則執行完之後纔會執行的(最後執行的規則)。ssh
表(tables)socket |
鏈(chains) |
|
Filter |
This is the default table (if no -t option is passed) 這是默認表 |
|
INPUT |
for packets destined to local sockets 對於指定到本地套接字的包,即到達本地防火牆服務器的數據包 |
|
FORWARD |
for packets being routed through the box 路由穿過的數據包,即通過本地防火牆服務器的數據包 |
|
OUTPUT |
for locally-generated packets 本地建立的數據包 |
|
NAT |
This table is consulted when a packet that creates a new connection is encountered 當遇到新建立的數據包鏈接時將參考這個表 |
|
PREROUTING |
for altering packets as soon as they come in 一進來就對數據包進行改變 |
|
OUTPUT |
or altering locally-generated packets before routing 本地建立的數據包在路由以前進行改變 |
|
POSTROUTING |
for altering packets as they are about to go out 在數據包即將出去時改變數據包信息 |
|
Managle |
This table is used for specialized packet alteration 這個表專門用於改變數據包 |
|
INPUT |
for packets coming into the box itself 進入到設備自己的包 |
|
FORWARD |
for altering packets being routed through the box 對路由後的數據包信息進行修改 |
|
PREROUTING |
for altering incoming packets before routing 在路由以前更改傳入的包 |
|
OUTPUT |
for altering locally-generated packets before routing 本地建立的數據包在路由以前進行改變 |
|
POSTROUTING |
for altering packets as they are about to go out 在數據包即將離開時更改數據包信息 |
|
raw |
此表用處較少,能夠忽略不計 |
filter (做用:主機防火牆) 默認的表。***** nat (做用:端口或IP映射或共享上網)***** mangle (配置路由標記 ttl tos mark) raw (忽略)
filter表(默認的表,做用:主機防火牆)
INPUT:進入主機的數據包
OUTPUT:本地建立的數據包
FORWARD:路由穿過的數據包,即通過本地防火牆服務器的數據包
NAT表(做用:端口或IP映射或共享上網)
PREROUTING:一進來就對數據包進行改變
OUTPUT:本地建立的數據包在路由以前進行改變
POSTROUTING:在數據包即將出去時改變數據包信息
mangle表(配置路由標記 ttl tos mark)
INPUT:進入到設備自己的包
FORWARD:對路由後的數據包信息進行修改
PREROUTING:在路由以前更改傳入的包
OUTPUT:本地建立的數據包在路由以前進行改變
POSTROUTING:在數據包即將離開時更改數據包信息
filter表 |
強調:主要和主機自身相關,真正負責主機防火牆功能的(過濾流入流出,流經主機的數據包)filter表示iptables默認使用的表,這個表定義了三個鏈(chains ) 企業工做場景:主機防火牆 |
INPUT |
負責過濾全部目標地址是本機地址的數據包 通俗來講:就是過濾進入主機的數據包 |
FORWARD |
負責轉發流經主機的數據包。起轉發的做用,和NAT關係很大,後面會詳細介紹 LVS NAT 模式,net ipv4.ip_forward=l |
OUTPUT |
處理全部源地址是本機地址的數據包 通俗的講:就是處理從主機發出去的數據包 |
NAT表 |
負責網絡地址轉換的,即來源與目的IP地址和port的轉換。 應用:和主機自己無關,通常用於局域網共享上網或者特殊的端□轉換服務相關。 工做場票: 1. 用於企業路由(zebra )或網關(iptables),共享上網(POSTROUTING) 2. 作內部外部IP地址一對一映射(dmz),硬件防火牆映射IP到內部服務器,ftp服務 (PREROUTING ) 3. WEB,單個端口的映射,直接映射80端口( PREROUTING )這個表走義了3個鏈,nat功能至關於網絡的acl控制。和網絡交換機acl相似。 |
OUTPUT |
和主機放出去的數據包有關,改變主機發出數據包的目的地址。 |
PREROUTING |
在數據包到達防火牆時,進行路甶判斷以前執行的規則,做用是改變數據包的目的地址、目的端□等就是收信時,根據規則重寫收件人的地址。 例如:把公網IP : XXX.XXX.XXX.XXX映射到局域網的XX.XX.XX.XX服務器上。 若是是web服務,能夠報80轉換爲局域網的服務器9000端□上 |
POSTROUTING |
在數據包離開防火牆時進行路由判斷以後執行的規則,做用改變數據包的源地址,源端口等。 寫好發件人的地址,要讓家人回信時可以有地址可回。 例如。默認筆記本和虛擬機都是局域網地址,在出網的時候被路甶器將源地址改成了公網地址。 生產應用:局域網共享上網。 |
一、主機防火牆(filter表的INPUT鏈)。
二、局域網共享上網(nat表的POSTROUTING鏈)。半個路由器,NAT功能。
三、端口及IP映射(nat表的PREROUTING鏈),硬防的NAT功能。
四、IP一對一映射。
-I(大寫i 插入) -A(追加) -R(替換) -D(刪除) -L(列表顯示)
-I將會把規則放在第一行,-A將會放在最後一行。
例子:
iptables –t filter -A INPUT -p tcp --dport 22 -j DROP iptables –t filter -A INPUT -p tcp --dport 3306 -j DROP iptables –t filter -I INPUT -p tcp --dport 80 -j DROP
說明:前兩句就算是先執行,第三句也會是第一行
-L 查看iptables控制策略列表信息
-n 查看iptables控制策略列表裏面的ip地址和端口信息,不翻譯,以數字表示
--line-number 查看iptables策略信息時,顯示每條規則序號信息
-v 查看iptables策略詳細信息(進出口)
[root@iptables ~]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination
-F 清除全部規則,不會處理默認的規則
-X 刪除用戶自定義的鏈
-Z 清除鏈的計數器(數據包計數器與數據包字節計數器)
-A 向指定鏈添加相應規則,默認從規則號結尾進行添加(添加最後)
-I 向指定鏈中插入規則,默認插入到第一條規則之上
-p 指定訪問數據的協議類型(tcp、udp、icmp)
--dport 指定目標端口信息
--sport 指定源端口信息
-j 執行操做的動做(ACCEPT、DROP(丟棄)、REJECT(拒絕))
-D 刪除指定鏈裏面的規則策略
-i 指定數據流量進入接口信息(只能配置在INPUT鏈)
-o 指定數據流量流出接口信息(只能配置在OUTPUT鏈)
-s 指定數據流量源地址或網段信息
-d 指定數據流量目標地址或網段信息
! 表示控制策略取反
-m 表示增長擴展匹配功能
禁止10.0.0.0網段連入:
iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
能夠不指定 -t filter 由於默認就是filter表
-i:流量進入的接口(從eth0進入)
-s:源地址
源地址不是10.0.0.150的單個IP的禁止鏈接:
iptables -t filter -A INPUT -i eth0 !-s 10.0.0.150 -j DROP
禁用icmp協議:
iptables -t filter -A INPUT -p icmp --icmp-type 8 -i eth0 -s 10.0.0.0/24 -j DROP
禁止訪問響應服務端口:
以22端口爲例
iptables -A INPUT -p tcp --dport 22 -j DROP 在默認表中的INPUT鏈中追加策略:禁止22端口訪問
刪除某規則:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT --- 刪除指定規則 iptables -D INPUT 2 --- 根據規則行號,刪除相應的規則
禁止網段連入:
例子:禁止192.168.17.0網段訪問10.0.0.7主機
iptables -A INPUT -s 192.168.17.0/24 -d 10.0.0.7 -j DROP
例子:禁止某個192.168.17.0網段不能訪問服務器主機的22端口
iptables -A INPUT -s 192.168.17.0/24 -d 10.0.0.7 -p tcp --dport 22 -j DROP
匹配指定協議之外的全部協議:
! 表示取反
iptables -A INPUT ! –p tcp –s 10.0.0.0/24 -j DROP centos6寫法
-p ! tcp centos5寫法
設置連續多端口控制策略:
iptables -A INPUT -p tcp --dport 22:80 -j DROP
設置不連續多端口控制策略:
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP
-m --- 表示增長擴展匹配功能 multiport 實現不連續多端口擴展匹配
對網絡數據傳輸進行限速:
iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP --limit n/{second/minute/hour}: 解釋:指定時間內的請求速率」n」爲速率,後面爲時間分別爲:秒 分 時 --limit-burst [n] 解釋:在同一時間內容許經過的請求」n」爲數字,不指定默認爲5
兩種思想:對於默認策略爲容許狀態,防火牆規則就至關於黑名單;對於默認策略爲禁止狀態,防火牆規則就至關於白名單。
首先清空默認規則,而後設置遠程鏈接規則,防止本身被踢出,更改默認規則
iptables -F iptables -X iptables -Z iptables -A INPUT -p tcp --dport 22 -j ACCEPT --- 防止被踢出門外 iptables -P INPUT DROP iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
被指安全白名單策略
iptables -A INPUT -i lo -j ACCEPT --- 讓本身能夠ping本身 iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT --- 容許哪些網站服務能夠訪問 iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT --- 容許架構內部服務進行訪問 iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT --- 容許一些合做企業的外網服務器進行訪問
這幾條就是最簡單的企業防火牆部署
[root@iptables ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@iptables ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Wed Jan 17 16:12:23 2018 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [82:9632] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT -A INPUT -s 172.16.1.0/24 -j ACCEPT COMMIT # Completed on Wed Jan 17 16:12:23 2018
iptables-save >/etc/sysconfig/iptables
# 容許關聯的狀態包經過(web服務不要使用FTP服務)
new說明這個包是咱們看到的第一個包,意思就是,這是conntrack模塊看到的某個鏈接的第一個包,它即將被匹配了。好比,咱們看到一個SYN包,是咱們所留意的鏈接的第一個包,就要匹配它。
表示新創建鏈接的數據包狀態
ESTABLISHED已經注意到兩個方向上的數據傳輸,並且會繼續匹配這個鏈接的包。處於ESTABLISHED狀態的鏈接是很是容易理解的。只要發送並接到應答,鏈接就是ESTABLISHED的了。一個鏈接要從new變爲ESTABLISHED,只須要接到應答包便可,無論這個包是發往防火牆的,仍是要由防火牆轉發的。ICMP的錯誤和重定向信息包也被看做是ESTABLISHED,只要他們是咱們所發出的信息的應答。
表示新創建鏈接數據包發送以後,回覆響應的數據包狀態
RELATED是個比較麻煩的狀態,當一個鏈接和某個已處於ESTABLISHED狀態的鏈接有關係時,就會被認爲是RELATED的了。換句話說,一個鏈接要想是RELATED的,首先要有一個ESTABLISHED的鏈接。這個ESTABLISHED鏈接再產生一個主鏈接以外的鏈接,這個新的鏈接就是RELATED的了,固然前提是conntarck模塊要能理解RELATED。
表示藉助已經創建的鏈路,發送新的鏈接數據包
INVALID說明數據包不能被識別屬於哪一個鏈接或沒有任何狀態。有幾個緣由能夠產生這種狀況,好比,內存溢出,收到不知屬於哪一個鏈接的ICMP錯誤信息。通常地,咱們DROP這個狀態的任何東西,由於防火牆任務這是不安全的東西。
無效沒法識別的數據包
防火牆服務配置在FTP服務器上時,須要配置如下策略
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
route add default gw 172.16.1.200 --- 首先在內網服務器設置網關(網關爲擁有外網網卡的防火牆服務器內網地址)
在防火牆服務器開啓路由轉發功能
[root@iptables ~]# vim /etc/sysctl.conf [root@iptables ~]# sysctl -p net.ipv4.ip_forward = 1
實現內網訪問外網的NAT映射
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.200 -s 172.16.1.0/24 --- 指定將哪些內網網段進行映射轉換 -o eth0 --- 指定在共享上網哪一個網卡接口上作NAT地址轉換 -j SNAT --- 將源地址進行轉換變動 -j DNAT --- 將目標地址進行轉換變動 --to-source ip地址 --- 將源地址映射爲何IP地址 --to-destination ip地址 --- 將目標地址映射爲何IP地址
需求:將網關的IP和9000端口映射到內網服務器的22端口
端口映射 10.0.0.88:9000 -->172.16.1.8:22
實現命令:
iptables -t nat -A PREROUTING -d 10.0.0.88 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.8:22 -d 10.0.0.8目標地址 -j DNAT 目的地址改寫
效果:鏈接88服務器的9000端口,會自動跳轉鏈接到8服務器的22端口
[e:\~]$ ssh 10.0.0.88 9000 Connecting to 10.0.0.88:9000... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Wed Jan 17 09:48:56 2018 from 172.16.1.88 [root@web01 ~]#