iptables實現網絡防火牆(一)

前言

    關於防火牆的相關概念,我們在之前的文章中已經進行了相關的介紹,這裏就不再重複。感興趣的朋友可以移步 
     初識Linux防火牆 
    今天重點記錄一下,如何使用iptables來搭建網絡防火牆,實現控制訪問。

實驗環境準備

    如果要實現網絡防火牆,至少需要三臺主機A,B,C,B用來搭建網絡防火牆,A來模擬局域網內主機,C模擬網絡客戶端。 
    根據我們之前四表五鏈的介紹,我們知道,作爲網絡防火牆的主機B還要充當網關的角色,使用filter表的FORWARD鏈。
    實驗拓撲如下圖所示。

實驗環境拓撲

    這裏有一點需要注意,192.168 網段和172.18網段在實際生產中都屬於私有地址,只不過,在我這裏172.18網段可以實現鏈接互聯網,所以這裏我們模擬了了實驗環境,請注意不要產生誤解。

設置網關

        主機B雖然擔任的是防火牆的角色,但是它還需要把主機A和主機C的數據包進行轉發和傳輸,所以主機主機A和主機C還需要配置一下網關,指向主機B分別鏈接在內網和外網的兩個IP地址。  

        下面爲主機A和主機C添加兩個路由。

# 給主機A添加一個默認的網關地址,指向192.168.2.77   
route add default gw 192.168.2.77   

# 給主機C添加一條默認的網關地址,指向172.18.2.77
route add default gw 172.18.2.77

清空主機的防火牆策略,開啓主機B的轉發功能,關閉SELinux

爲了避免對實驗環境的影響,首先對三臺主機清空防火牆策略。

# 查看目前filter表是否具有防火牆策略
iptables -vnL   

# 清除filter表的防火牆策略
iptables -F

因爲主機B要兼職轉發功能,所以要開啓主機B的轉發功能。

# 開啓主機B的轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward

最後關閉三臺主機的SELinux策略。 
實驗環境準備好之後,可以從主機A ping 到主機C 。如下圖所示。

實驗環境準備

下面開始搭建主機B的防火牆規則

下面我們開始在主機B上模擬建立防火牆的過濾規則。

允許局域網ping通外網,不允許外網ping局域網

    我們的目標是隻能內網ping通外網,但是不允許外網ping通內部主機,這樣的話,我們應該如何操作?

 ~]#iptables -A FORWARD -s 192.168.2.0/24 -d 172.18.0.0/16 -p icmp --icmp-type 8 -j ACCEPT
 ~]#iptables -A FORWARD -s 172.18.0.0/16 -d 192.168.2.0/24 -p icmp --icmp-type 0 -j ACCEPT
 ~]#iptables -A FORWARD -j REJECT
 
 # 查看一下建立好的防火牆策略
 ~]#iptables -vnLChain INPUT (policy ACCEPT 72 packets, 7907 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     icmp --  *      *       192.168.2.0/24       172.18.0.0/16        icmptype 8
    0     0 ACCEPT     icmp --  *      *       172.18.0.0/16        192.168.2.0/24       icmptype 0
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 23 packets, 2060 bytes)
 pkts bytes target     prot opt in     out     source               destination

這裏解釋一下,有兩種狀態碼,分別表示請求和應答。

  • 0/0 echo-reply icmp應答

  • 8/0 echo-request icmp請求

    第二種方法,我們可以通過狀態鏈接的方式來定義防火牆規則。我們允許從內部網絡發出的,凡是ESTABLISHED狀態的包,通過防火牆。

# 凡是已經建立的鏈接都允許通過防火牆
 ~]#iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
 
 # 凡是符合源地址爲192.168.2的網段 ,目的地址爲172.18網段的icmp數據包都允許通過防火牆
 ~]#iptables -A FORWARD -s 192.168.2.0/24 -d 172.18.0.0/16 -p icmp --icmp-type 8 -j ACCEPT
 
 # 凡是符合源地址爲192.168.2的網段 ,目的地址爲172.18網段的icmp數據包都允許通過防火牆
 # 下面這條命令也同樣可行,與上面的命令使用其中一個就可以
 # iptables -A FORWARD -s 192.168.2.0/24 -d 172.18.0.0/16 -p icmp -m state --state NEW 8 -j ACCEPT   
 
 # 其餘的協議都拒絕
 ~]#iptables -A FORWARD -j REJECT

內部主機可以訪問互聯網上特定服務如httpd服務,SSH服務,ftp服務,但是外網不能訪問內網的服務

    只是禁用ping 命令話,在實際生產中的作用並不是很大。但是如果我們想讓內網的主機能夠訪問互聯網上的特殊服務,而不允許外網的主機訪問內網應該如何去做。

# 源地址爲內網網段的允許經過防火牆
 ~]#iptables -A FORWARD -s 192.168.2.0/24 -p tcp -m multiport --dports 21:22,80 -j ACCEPT 

# 目的地址爲內網地址的允許經過防火牆
 ~]#iptables -A FORWARD -d 192.168.2.0/24 -p tcp -m multiport --sports 22,80,21 -j ACCEPT   
# 其餘的全部拒絕
 ~]#iptables -A FORWARD -j REJECT
 
 # 查看一下定義好的防火牆策略
 ~]#iptables -vnLChain INPUT (policy ACCEPT 60 packets, 6088 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   492 ACCEPT     tcp  --  *      *       192.168.2.0/24       0.0.0.0/0            multiport dports 21:22,80
    4   471 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.2.0/24       multiport sports 22,80,21
   10   816 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 27 packets, 2604 bytes)
 pkts bytes target     prot opt in     out     source               destination

    現在內網的主機已經能夠順利的訪問外網的主機,而且外網的主機不能夠對內網的主機進行訪問了。 
    但是現在又有了新的問題,ftp雖然能夠鏈接到外網的服務,但是ftp卻不能訪問ftp服務器上的內容,這說明外網的數據不能夠通過防火牆返回到內網的主機,所以我們的防火牆策略還要進行一定的修改。也就是說,要允許已經建立鏈接的,和相關的請求數據,返回時能夠通過防火牆。 
    爲此,我們在防火牆策略中,重新插入下面這樣一條策略。

# 加載額外的模塊 
 ~]#modprobe nf_conntrack_ftp
 
 # 源地址爲內網網段的允許經過防火牆
 ~]#iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT   

# 查看一下當前的防火牆策略
 ~]#iptables -vnLChain INPUT (policy ACCEPT 69 packets, 5364 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
   26  1692 ACCEPT     tcp  --  *      *       192.168.2.0/24       0.0.0.0/0            multiport dports 22,80
    4   471 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.2.0/24       multiport sports 22,80
  373 31092 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 31 packets, 2940 bytes)
 pkts bytes target     prot opt in     out     source               destination

    如果我們使用了狀態策略的話,第三條規則已經沒有多大必要的了,因爲已經包含在狀態中了。所以實際生產中,通常建議將狀態鏈接寫在第一條,這樣可以省略很大的工作量。 
    還有一點需要注意,如果是擴展的匹配條件,需要加載額外的擴展模塊(/usr/lib64/xtables/*.so),方可生效,關於額外的擴展模塊可以 man 8 iptables-extensions來查看。

    經過上面的這些操作,我們就實現了一個具有路由功能的網絡防火牆,但是,這個防火牆的功能還僅僅限於網絡協議的控制和防護,這在實際生產中還遠遠不夠,我們會在後續繼續介紹關於網絡防火牆的相關知識,歡迎關注。



個人博客地址:http://www.pojun.tech/ 歡迎訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章