Linux(13):期中架構(5)--- 前端部分:keepalived高可用 & HTTPS & iptables防火牆

keepalived 高可用集羣

1. keepalived服務概念說明

# 1.1 keepalived軟件的做用?
Keepalived軟件起初是專爲LVS負載均衡軟件設計的,
用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的VRRP功能

Keepalived軟件主要是經過VRRP協議實現高可用功能的。
VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗餘協議)的縮寫,
VRRP出現的目的就是爲了解決靜態路由單點故障問題的,它可以保證當個別節點宕機時,
整個網絡能夠不間斷地運行

# 1.2 keepalived軟件工做原理?(重點)
原理 
1)VRRP協議,全稱Virtual Router Redundancy Protocol,中文名爲虛擬路由冗餘協議,
   VRRP的出現是爲了解決靜態路由的單點故障。
2)VRRP是用過IP多播的方式(默認多播地址(224.0.0.18))實現高可用對之間通訊的。
3)工做時主節點發包,備節點接包,當備節點接收不到主節點發的數據包的時候,
   就啓動接管程序接管主節點的資源。備節點能夠有多個,經過優先級競選,
   但通常Keepalived系統運維工做中都是一對。

# 1.3 keepalived軟件主要功能?
①. 管理LVS負載均衡軟件
②. 實現對LVS集羣節點健康檢查功能 
③. 做爲系統網絡服務的高可用功能

2. 部署keepalived高可用服務:

# 1)確認反向代理服務是否工做正常
[root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
web01 www.etiantian.org
[root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
web02 www.etiantian.org
[root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
web03 www.etiantian.org
[root@lb01 ~]# curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html
web03 bbs.etiantian.org
[root@lb01 ~]# curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html
web02 bbs.etiantian.org
[root@lb01 ~]# curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html
web01 bbs.etiantian.org

# 2)安裝部署高可用keepalived服務(05和06主機)
# 第一步:安裝keepalived服務軟件
yum install -y keepalived

# 第二步:編寫keepalived配置文件
vim /etc/keepalived/keepalived.conf
# man keepalived.conf   --- 配置文件說明信息
# 配置文件結構:
   GLOBAL CONFIGURATION  --- 全局配置(*)
   VRRPD CONFIGURATION   --- vrrp配置(*)
   LVS CONFIGURATION     --- LVS服務相關配置

# lb01主負載均衡器配置
global_defs {
   router_id lb01            # 在一個集羣中,每一臺主機的 router_id 都是惟一的
}

vrrp_instance group01 {        # 相同的集羣中,實例是同樣的
    state MASTER            # 只是一個描述性信息
    interface eth0
    virtual_router_id 51    # 主備發送 組播包 的時間間隔
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {        # VIP:虛IP地址(用戶訪問的是這個地址)
        10.0.0.3/24 dev eth0 label eth0:1
    }
}


# lb02配置信息
global_defs {
   router_id LVS_DEVEL
}

vrrp_instance group01 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
    }
}

# 重啓 keepalived 服務 
/etc/init.d/keepalived reload        # 開啓爲 start

# 開啓 keepalived 服務後會在 主(MASTER)上的 eth0 網卡上生成 虛ip 10.0.0.3
# 無論 VIP 在哪臺主機上,用戶訪問時都是訪問的 10.0.0.3 這個 ip

3. 部署keepalived高可用服務問題

# 同時在keepalived高可用集羣中,出現了兩個虛擬IP地址信息,這種狀況就稱爲腦裂

# 腦裂狀況出現緣由:
    1. 心跳線出現問題
    網卡配置有問題
    交換設備有問題
    線纜鏈接有問題
    2. 有防火牆軟件阻止問題
    3. virtual_router_id配置數值不正確
    # 總之:只要備服務器收不到組播包,就會成爲主,而主資源沒有釋放,就會出現腦裂

利用shell腳本實現監控管理:
備用設備有VIP就是表示不正常
01. 真正實現主備切換
02. 出現腦裂狀況了

#!/bin/bash
check_info=$(ip a|grep -c 10.0.0.3)
if [ $check_info -ne 0 ]
then
   echo "keepalived server error!!!"
fi

4. 實現nginx反向代理監控虛擬IP地址

1)編寫nginx反向代理配置 (兩臺反向代理服務器都要作以下配置)
server {
    listen      10.0.0.3:80;                # 在 監聽的端口前加上 虛ip
    server_name  www.etiantian.org;
    root   html;
    index  index.html index.htm;
    location / {
        proxy_pass http://oldboy;
        proxy_set_header host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
server {
    listen       10.0.0.3:80;                # 在 監聽的端口前加上 虛ip
    server_name  bbs.etiantian.org;
    root   html;
    index  index.html index.htm;
    location / {
        proxy_pass http://oldboy;
        proxy_set_header host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
   }
}
/application/nginx/sbin/nginx -s stop        # ngxin 中只要涉及到 ip 地址的修改,都要進行真正的重啓nginx(先stop 再start)
/application/nginx/sbin/nginx
netstat -lntup|grep nginx
tcp        0      0 10.0.0.3:80                 0.0.0.0:*                   LISTEN      53334/nginx    

2)# 實現監聽本地網卡上沒有的IP地址
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
sysctl -p
# 監聽網卡上沒有的 ip 地址

4. 將keepalived服務和反向代理nginx服務創建聯繫

# 假如 keepalived 主機服務器的 nginx 掛掉了,此時的 虛ip 依然會在 keepalived主服務器中,這樣用戶訪問就會出現問題
# 因此此時須要將 keepalived服務和 nginx 反向代理服務創建聯繫,即 nginx 反向代理服務掛掉的時候,keepalived服務也要自動關閉

1)編寫腳本
#!/bin/bash
web_info=$(ps -ef|grep [n]ginx|wc -l)
if [ $web_info -lt 2 ]
then
   /etc/init.d/keepalived stop
fi

2)運行腳本,實現監控nginx服務
# 編輯keepalived服務配置文件
vrrp_script check_web {
    
    script "/server/scripts/check_web.sh"    # 定義我本身寫的一個監控腳本,腳本必須有執行權限
    
    interval 2                                # 指定腳本間隔時間(s)
        
    weight 2                                 #腳本執行完成,讓優先級值和權重值進行運算,從而實現主備切換    
}
# vrrp_script 配置添加到全局配置和vrrp實例配置之間

track_script {    # 調用我寫的監控腳本 
    check_web
}
# track_script 配置要放到 vrrp實例 中
    
chmod +x check_web.sh   --- 修改腳本可執行權限

5. 實現高可用集羣架構中雙主配置(互爲主備配置) 

# lb01 主機的 keepalived 配置文件的實例修改成以下:
vrrp_instance gorup01 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
       }
    }
vrrp_instance gorup02 {        # 新增一個實例 gorup02
    state BACKUP            # 實例 group02 中lb01主機爲 備
    interface eth0
    virtual_router_id 52    # 修改成一個新的 virtual_router_id
    priority 100            # 優先級相對lb02主機中的 group02 要變小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:1        # 添加一個新的 虛ip 10.0.0.4
    }
}

# lb02 主機的 keepalived 配置文件的實例修改成以下:
vrrp_instance gorup01 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
       }
    }
    
    
vrrp_instance gorup02 {        # 新增一個實例 gorup02
    state MASTER            # 實例 group02 中lb02主機爲 主
    interface eth0
    virtual_router_id 52
    priority 150            # 優先級相對lb01主機中的 group02 要變大
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:1        # 添加一個新的 虛ip 10.0.0.4
    }
}     


# 修改nginx反向代理監控地址信息
# lb01 主機 
[root@lb01 ~]# vim /application/nginx/conf/nginx.conf

    server {
    listen       10.0.0.3:80;
    server_name  www.etiantian.org;
    root   html;
    index  index.html index.htm;
    location / {
    proxy_pass http://oldboy;        
    proxy_set_header host $host;    
       }
    }    
    server {
    listen      10.0.0.4:80;            # 新增 bbs.etiantian.org 對應的 虛ip 爲 10.0.0.4
    server_name  bbs.etiantian.org;
    proxy_set_header host $host;
    root   html;
    index  index.html index.htm;
    location / {
    proxy_pass http://oldboy;
    proxy_set_header host $host;
       }

# lb02 主機 
[root@lb02 ~]# vim /application/nginx/conf/nginx.conf

    server {
    listen      10.0.0.3:80;
    server_name  www.etiantian.org;
    root   html;
    index  index.html index.htm;
    location / {
    proxy_pass http://oldboy;        
    proxy_set_header host $host;    
       }
    }    
    server {
    listen       10.0.0.4:80;            # 新增 bbs.etiantian.org 對應的 虛ip 爲 10.0.0.4
    server_name  bbs.etiantian.org;
    proxy_set_header host $host;
    root   html;
    index  index.html index.htm;
    location / {
    proxy_pass http://oldboy;
    proxy_set_header host $host;
       }
    }

 

HTTPS安全證書訪問鏈接實踐配置

1:網絡安全涉及的問題:html

①. 網絡安全問題-數據機密性問題
    傳輸的數據可能會被第三方隨時都能看到    
    
②. 網絡安全問題-數據完整性問題
    傳輸的數據不能隨意讓任何人進行修改
    
③. 網絡安全問題-身份驗證問題
    第一次通信時,須要確認通信雙方的身份正確

2:網絡安全涉及的問題:linux

①. 網絡安全問題-數據機密性問題解決
    a) 利用普通加密算法解決機密性
        利用相應算法,對傳輸數據(明文數據)進行加密(密文數據);再利用對應算法,將加密數據解密變爲真實數據
        優勢:實現了數據機密傳輸,避免了明文傳輸數據的危險性。
        缺點:利用加密算法,將明文改密文,若是第三方得到加密算法,便可將傳輸密文再次變爲明文
        
    b) 利用對稱加密算法解決機密性(重要的一種加密方式)
        對稱加密算法就比如將普通算法的規則手冊放入到了保險櫃裏,只有獲取保險櫃和保險櫃鑰匙才能獲取《算法手冊》
        優勢:密鑰加密算法計算速度很是快;解決了普通加密算法的安全問題
        缺點:加解密過程的安全性徹底依賴於密鑰,而且對稱加密密鑰是公開的,當通信加密對象過多時,沒法解決密鑰管理問題。

        
②. 網絡安全問題-數據完整性問題解決
    a) 利用單項加密算法(全網備份數據完整性)
        根據數據生成特徵碼(數據指紋信息);接收數據方獲取數據信息算出特徵碼,驗證是否與發送過來的特徵碼一致
        若特徵碼一致,表示數據完整性沒被破壞;若特徵碼不一致,表示數據已被破壞,直接丟棄
        ****************************************************************************
        擴展說明:
        01:不一樣數據的特徵碼(數據指紋信息)是不可能一致的
            單項加密算法特徵
            · 數據輸入同樣,特徵碼信息輸出必然相同
            · 雪崩效應,輸入的微小改變,將形成輸出的巨大改變
            · 定長輸出,不管源數據多大,但結果都是同樣的
            · 不可逆的,沒法根據數據指紋,還原出原來的數據信息。
        ****************************************************************************
        
        優勢:有效的解決了數據完整性問題
        缺點:沒有考慮中間人攻擊對數據信息的影響
        
    b) 利用單項加密算法(加密特徵碼)
        利用對稱加密算法對數據加密的同時,也對特徵碼進行加密;
        接收方擁有和發送方同樣的密鑰,才能夠解密加密後的數據和特徵碼
        而中間人加密的特徵碼是沒有辦法讓接收方進行解密的,因此接收方獲取不了特徵碼,直接丟棄數據
        ****************************************************************************
        擴展說明:
        01:那麼對稱密鑰如何有效的讓通信雙方獲取呢
            須要進行對稱密鑰協商過程,即經過密鑰交換機制(Internet key exchange IKE)
            實現密鑰交換機制的協議稱爲diffie-hellman協議
        ****************************************************************************            
        
③. 網絡安全問題-身份驗證問題解決
    a)利用非對稱密鑰加密算法(公鑰加密算法)
       發送方創建私鑰和公鑰,將公鑰發送給接收方,從而實現發送數據方的身份驗證

       讓你的母親驗證你的爸爸身份信息,你的母親就稱爲證書頒發機構
       公鑰信息在網站訪問過程當中,被稱爲證書(身份證)    
           
網絡安全問題結論:實現網絡安全性,須要解決問題的順序爲
1. 解決身份驗證問題
2. 解決數據完整性問題
3. 解決數據機密性問題    

3:網絡安全證書由來:nginx

根據上述結論可知,網絡安全性最首先要解決的就是身份驗證問題;
而解決身份驗證問題,最主要的方式就是藉助私鑰和公鑰
而最主要的公鑰信息獲取就變得尤其重要;利用第三方公正者,公正公鑰信息

目前標準的證書存儲格式是x509,還有其餘的證書格式,須要包含的內容爲:
證書==身份證
?    公鑰信息,以及證書過時時間  
?    證書的合法擁有人信息  
?    證書該如何被使用(不用關注)   
?    CA頒發機構信息 
?    CA簽名的校驗碼    

4: OpenSSL軟件詳細說明

# 獲取OpenSSL軟件的版本信息:
rpm -qa openssl
openssl version                        <- 查看openssl版本信息


# 獲取OpenSSL配置文件信息:
/etc/pki/tls/openssl.cnf            <- openssl配置文件,主要用於配置成私有ca時進行使用
# 說明:基本上openssl配置文件不須要運維過多修改配置


# 利用openssl軟件實現HTTPS訪問過程
# 實現HTTPS:
[root@web01 ~]# mkdir -p /server/key
[root@web01 ~]# cd /server/key/            # 生成的 key 放到該目錄下

# 第一步:建立出一個私鑰文件(出生證實)             --- 運維人員須要會
# 方法1:
openssl genrsa 2048 >server.key            <- 建立私鑰信息,並指定私鑰的長度爲2048,並將生成的私鑰信息保存在一個文件中

# 方法2:
openssl genrsa -out server.key 2048        <- 將私鑰信息直接進行保存,加密長度必定要放在輸出文件後面

# 方法3:
(umask 077;openssl genrsa -out server1024.key 1024)        <- 利用小括號,實現子shell功能,臨時修改umask,使之建立的私鑰文件權限爲600

# 第二步:生成證書文件信息(公鑰)
# ①. 生成自簽發證書                   --- 運維人員能夠自行操做
[root@NFS-server-01 ~]# openssl req -new -x509 -key server.key -out server.crt -days 365
req        <- 用於請求建立一個證書文件
new        <- 表示建立的是新的證書
x509    <- 表示定義證書的格式爲標準格式
key        <- 表示調用的私鑰文件信息
out        <- 表示輸出證書文件信息
days    <- 表示證書的有效期
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN                    <- 定義生成證書的國家
State or Province Name (full name) []:BJ                <- 定義生成證書的省份
Locality Name (eg, city) [Default City]:BJ                <- 定義生成證書的城市
Organization Name (eg, company) [Default Company Ltd]:oldboy              <- 定義生成證書的組織
Organizational Unit Name (eg, section) []:it                              <- 定義生成證書的職能部門
Common Name (eg, your name or your server's hostname) []:oldboy.com.cn    <- 定義主機服務器名稱
說明:此輸出信息很是重要,客戶端在獲取證書前,會利用主機名與相應服務器之間創建鏈接,而後得到證書
Email Address []:
    
# ②. 向證書頒發機構申請證書            --- ca證書版本機構完成
    # 生成請求證書文件 (戶口本)       --- 運維人員完成
    openssl req -new -key server.key -out server.csr
    
    # 獲取獲得證書文件 (身份證)       --- ca頒發機構完成   
    # 省略

# 第三步:配置網站服務,加載私鑰和證書信息
# 修改 nignx 配置文件中的 server 爲以下:
server {
        listen       443;                                # https 的端口號爲 443
        server_name  www.etiantian.org;

        ssl on;                                            # 打開 ssl
        ssl_certificate /server/key/server.crt;            # 公鑰路徑 
        ssl_certificate_key /server/key/server.key;        # 私鑰路徑

        root   html/www;
        index  index.html index.htm;
    }

# 要求:訪問 www.etiantian.org 的 http 時,自動跳轉爲 https
# nginx 配置文件中的 server 修改成以下:
    server {        # 做用:訪問 www.etiantian.org 的 http 時,自動跳轉爲 https
        listen        80;
        server_name  www.etiantian.org;
        rewrite ^(.*)$  https://$host$1 permanent;     # ^表示 URL信息, (.*) 表示 URI 信息;$host表示 URL信息,$1表示 (.*) 中的信息(即也是URI信息); permanent 表示永久跳轉
    }

    server {
        listen       443;
        server_name  www.etiantian.org;

        ssl on;
        ssl_certificate /server/key/server.crt;
        ssl_certificate_key /server/key/server.key;

        root   html/www;
        index  index.html index.htm;
    }

    [root@web01 conf]# netstat -lntup|grep [n]ginx
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3401/nginx          
    tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      3401/nginx  

 

iptables防火牆網路安全實踐配置

1. iptables防火牆網路安全前言介紹

學好iptables的基礎:
    OSI7層模型以及不一樣層對應哪些協議?
    TCP/IP三次握手,四次斷開的過程,TCP HEADER,狀態轉換
    經常使用的服務端口要很是清楚瞭解。
    經常使用服務協議原理http協議,icmp協議。

企業中安全配置原則:
    儘量不給服務器配置外網IP,能夠經過代理轉發或者經過防火牆映射。
    併發不是特別大狀況有外網IP,能夠開啓防火牆服務。
    大併發的狀況,不能開iptables,影響性能,利用硬件防火牆提高架構安全。

2. iptables防火牆概念介紹

Netfilter/Iptables(如下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的徹底自由的基於包過濾
的防火牆工具,它的功能十分強大,使用很是靈活,能夠對流入和流出服務器的數據包進行很精細的控制。

iptables是linux2.4及2.6內核中集成的服務。
iptables主要工做在OSI七層的2、3、四層,若是從新編譯內核,iptables也能夠支持7層控制

3. iptables防火牆使用時名詞概念理解

容器:裝東西的器皿,docker容器技術,將鏡像裝在了一個系統中,這個系統就稱爲容器
iptables稱爲一個容器---裝着防火牆的表
防火牆的表又是一個容器---裝着防火牆的鏈
防火牆的鏈也是一個容器---裝着防火牆的規則
iptables---表---鏈---規則

# 規則:防火牆一條一條安全策略
1.    防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。
2.    若是匹配上規則,即明確表示是阻止仍是經過,數據包就再也不向下匹配新的規則。
3.    若是規則中沒有明確代表是阻止仍是經過的,也就是沒有匹配規則,
    向下進行匹配,直到匹配默認規則獲得明確的阻止仍是經過。
4.    防火牆的默認規則是全部規則執行完才執行的。


# 表和鏈說明:4表5鏈
Filter: 實現防火牆安全過濾功能
· INPUT             對於指定到本地套接字的包,即到達本地防火牆服務器的數據包      外面---->(門)房子iptables
· FORWARD         路由穿過的數據包,即通過本地防火牆服務器的數據包              外面-----(前門)房子(後門)---房子            
· OUTPUT         本地建立的數據包                                                外面<-----(門)房子iptables

NAT:    實現將數據包中IP地址或者端口信息,內網到外網進行改寫/外網到內網進行改寫
· PREROUTING     一進來就對數據包進行改變             在路由以前,進行數據包IP地址或端口信息的轉換           
· OUTPUT         本地建立的數據包在路由以前進行改變   本地防火牆要出去的流量進行相應轉換(瞭解)
· POSTROUTING     在數據包即將出去時改變數據包信息     在路由以後,進行數據包IP地址或端口信息的轉換

Managle  對數據進行標記

raw         忽略不計

4. iptables防火牆操做實踐練習

# 1)iptables防火牆配置初始化
/etc/init.d/iptables start
chkconfig iptables on
iptables -F              --- 清除防火牆默認規則
iptables -X              --- 清除防火牆自定義鏈
iptables -Z              --- 清除防火牆技術器信息


# 2)iptables防禦牆信息查看方法
/etc/init.d/iptables status
iptables -L              --- -L 以列表形式顯示全部規則信息
iptables -L -n           --- -n 以數字形式顯示IP地址或端口信息,不要轉換爲字符串顯示
iptables -t nat -L -n    --- -t 表示指定查看或者配置相應的表
iptables -L -n -v        --- -v 表示顯示詳細規則信息,包含匹配計數器數值信息
iptables  -L -n --line-number      --- --line-number 顯示規則序號信息

    
# 3)iptables防火牆端口規則配置:
# 實踐01:阻止用戶訪問服務器的22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP   --- -A 表示添加規則到相應鏈上,默認表示添加規則到結尾
iptables -t filter -D INPUT -p tcp --dport 22 -j DROP   --- -D 表示刪除規則從相應鏈上。
iptables -t filter -D INPUT 規則序號
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP   --- -I 表示插入規則到相應鏈上,默認表示插入規則到首部
iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP --- 指定規則插入位置
iptables -t filter -R INPUT 6 -p tcp --dport 8080 -j DROP   --- -R 指定將配置好的規則信息進行替換


    # 總結防火牆參數信息:
    -A   --- 表示將規則添加到指定鏈上
    -I   --- 表示將規則插入到指定鏈上
    -D   --- 表示將規則從指定鏈上刪除
    -R   --- 表示將規則信息進行修改
    -p   --- 指定相應服務協議信息(tcp udp icmp all)
        --dport    --- 表示指定目標端口信息
        --sport    --- 表示指定源端口號信息
    -j   --- 指定對相應匹配規則執行什麼操做(ACCEPT DROP* REJECT)

    
# 實踐02:阻止相應網段主機訪問服務端指定端口服務
10.0.0.0/24 -- 22端口(阻止)
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP   
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP 
iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22 -j DROP 

    # 總結參數信息:
    -s   --- 指定匹配的源地址網段信息,或者匹配的主機信息
    -d   --- 指定匹配的目標地址網段信息,或者匹配的主機信息
    -i   --- 指定匹配的進入流量接口信息 只能配置在INPUT鏈上
    -o   --- 指定匹配的發出流量接口信息 只能配置在OUTPUT鏈上

# 實踐03:除了某個地址能夠訪問22端口以外,其他地址都不能訪問
10.0.0.1 ~ 10.0.0.253 中 ,  10.0.0.9(只容許)
# 方式1:
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP 

# 方式2:
iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j DROP
經過利用 !進行規則取反,進行策略控制

實踐04:指定阻止訪問多個端口服務
22--80 22,24,25
iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP                     --- 匹配連續的端口號訪問
iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP   --- 匹配不連續的端口號訪問

總結參數信息:
-m   --- 指定應用擴展模塊參數
    multiport   --- 能夠匹配多個不連續端口信息

    
# 實踐05: 經過防火牆實現禁ping功能
# 實現ping功能測試鏈路是否正常,基於icmp協議實現的
# icmp協議有多種類型:
    # icmp-type 8:請求類型  icmp-type 0:回覆類型       

# 狀況一:實現禁止主機訪問防火牆服務器(禁ping)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP            # ping 的請求禁止輸入
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP        # ping 的響應禁止輸出

# 狀況二:實現禁止防火牆訪問主機服務器(禁ping)
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP        # ping 的請求禁止輸出
iptables -A INPUT -p icmp --icmp-type 0 -j DROP            # ping 的響應禁止輸入

# 默認狀況:全部icmp類型都禁止
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP

# 實踐06:實現防火牆狀態機制控制
NEW: 發送數據包裏面控制字段爲syn=1,發送第一次握手的數據包
ESTABLISHED: 請求數據包發出以後,響應回來的數據包稱爲回覆的包
RELATED: 基於一個鏈接,而後創建新的鏈接
INVALID: 無效的的數據包,數據包結構不符合正常要求的

iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

5. 企業當中應用防火牆方法

# 項目:部署一個最安全的企業級防火牆(案例)
# 兩種思想:針對默認規則而言。
# 逛公園:黑名單
# 一、默認規則默認是容許的狀態。
# 看電影:白名單(更安全,推薦配置)
# 二、默認規則默認是不容許的狀態。更安全。
# 看電影的思想更安全。

# 1)保存防火牆配置文件信息
cp /etc/sysconfig/iptables{,.bak}

# 2)清除配置規則
iptables -F    <- 清空iptables全部規則信息(清除filter)
iptables -X    <- 清空iptables自定義鏈配置(清除filter)
iptables -Z    <- 清空iptables計數器信息(清除filter)

# 3)別把本身踢出到門外
iptables -A INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT

# 4)配置防火牆filter上各個鏈的默認規則
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

-P   --- 指定相應鏈的默認規則策略,是容許仍是阻止

# 5)容許iptables服務端ping本身的網卡地址
iptables -A INPUT -i lo -j ACCEPT   --- 讓本身能夠ping本身

# 6)指定外網能夠訪問的端口信息
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT 

# 7)企業中內網之間不要配置防火牆策略
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT  --- 容許架構內部服務進行訪問

# 8)企業之間有合做關係的,不要將友商的網絡禁止(主要常常改動)
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT    --- 容許一些合做企業的外網服務器進行訪問
iptables -A INPUT -s 10.0.2.0/24 -j ACCEPT

# 9)若是防火牆上配置了FTP服務,須要配置網絡狀態機制
iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT  --- 容許web服務與ftp服務器創建鏈接

# 10)實現iptables策略配置永久保存
# ①. 利用防火牆啓動腳本命令參數,實現永久保存
/etc/init.d/iptables save

# ②. 利用防火牆配置信息保存命令,實現永久保存
iptables-save >/etc/sysconfig/iptables
   
# 實例拓展:避免本身被踢出門外
    01. 去機房重啓系統或者登錄服務器刪除剛纔的禁止規則。
    02. 讓機房人員重啓服務器或者讓機房人員拿用戶密碼登陸進去
    03. 經過服務器的遠程管理卡管理(推薦)
    04. 先寫一個定時任務,每5分鐘就中止防火牆
    05. 測試環境測試好,寫成腳本,批量執行
    
# 以上內容爲防火牆filter表的配置實踐與原理說明

6. 防火牆nat表的配置實踐

iptables NAT:(配置NAT表示就是配置如下兩個鏈)
01. postrouting(內網---外網-NAT  源私網IP地址---源公網IP地址)
    路由以後,進行地址映射轉換,把源地址進行轉換(源私網地址==>源公網地址)
02. prerouting(外網---內網-NAT  目標公網IP地址---目標私網IP地址  映射目標端口)
    路由以前,進行地址映射轉換,把目標地址進行轉換(目標公網地址==>目標變爲私網地址)

# 實踐一:iptables實現共享上網方法(postrouting)
# 第一步:配置內網服務器,設置網關地址
[root@web02 ~]# /etc/init.d/iptables stop                            # --- 內網服務器中止防火牆服務
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@web02 ~]# ifdown eth0                                            # --- 模擬關閉內網服務器外網網卡
[root@web02 ~]# setup                                                # --- 修改內網網卡網關和DNS地址信息
[root@web02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         172.16.1.7      0.0.0.0         UG    0      0        0 eth1
# 說明:內網服務器網關地址指定爲共享上網服務器內網網卡地址(172.16.1.7)

# 第二步:配置共享上網服務器,開啓共享上網服務器路由轉發功能
[root@web01 ~]# vim /etc/sysctl.conf
[root@web01 ~]# sysctl -p
net.ipv4.ip_forward = 1

# 第三步:配置共享上網服務器,實現內網訪問外網的NAT映射
[root@web01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7

    -s 172.16.1.0/24          --- 指定將哪些內網網段進行映射轉換
    -o eth0                      --- 指定在共享上網哪一個網卡接口上作NAT地址轉換
    -j SNAT                   --- 將源地址進行轉換變動
    -j DNAT                   --- 將目標地址進行轉換變動
    --to-source ip地址        --- 將源地址映射爲何IP地址
    --to-destination ip地址   --- 將目標地址映射爲何IP地址


# 擴展若是開啓:forward默認drop策略,配置forward鏈以下(172.16.1.7 主機)
   iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
   iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
   iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
   iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
   
   # 網絡數據包傳輸過程必定是有去有回的

# 實踐二:iptables實現共享上網方法(postrouting)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE        <- 假裝共享上網
# 說明:在企業中如何沒有固定外網IP地址,能夠採起以上假裝映射的方式進行共享上網

# 總結:配置映射方法
01. 指定哪些網段須要進行映射    -s 172.16.1.0/24 
02. 指定在哪作映射               -o eth0
03. 用什麼方法作映射             -j SNAT/DNAT
04. 映射成什麼地址               --to-source  ip地址/--to-destination ip地址


# 實踐三:iptables實現外網IP的端口映射到內網IP的端口
   # 需求:將網關的IP和9000端口映射到內網服務器的22端口
   # 端口映射 10.0.0.7:9000 -->172.16.1.8:22  
   # 實現命令:
   iptables -t nat -A PREROUTING -d 10.0.0.7  -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22

   # -d 10.0.0.8目標地址。
   # -j DNAT 目的地址改寫。
相關文章
相關標籤/搜索