文章目錄
一、實驗要求
利用Linux自帶的iptables配置防火牆,完成如下配置:
- (1)阻止任何外部世界直接與防火牆內部網段直接通訊
- (2)允許內部用戶通過防火牆訪問外部HTTP和HTTPS服務器
- (3)允許內部用戶通過防火結防問外部FTP服務器。
- (4)其餘功能可自行添加。
網段示意圖:
二、環境配置
概述
新建3個虛擬機,分別作爲內網、網關(防火牆)、外網,如下:
要在VMware中配置一個區分內網和外網並且含有網關的網絡環境,那麼就應該按照以下思路:
- 網關需要進行數據包的轉發,因此需要兩張虛擬網卡,一張對內,一張對外,兩張網卡設置爲不同的網段
- 內網的IP與網關的對內網卡IP處於同一網段,且內網的網關IP是網關主機的對內網卡IP
- 外網的IP與網關的對外網卡IP處於同一網段,且外網的網關IP是網關主機的對外網卡IP
整體思路就是這樣,具體的配置步驟如下
1、配置VMware的虛擬網絡
打開VMware的虛擬網絡選項,將NAT模式的“使用本地DHCP自動分配IP”取消勾選,因爲要創建兩個網絡環境,就需要手動給三個主機設置靜態IP及其網段,而DHCP服務會根據配置將所有虛擬機劃分到同一網段。
子網IP自己設置,但是需要和物理機的網絡適配器選項中的網關處於同一網段,這樣虛擬機纔可以上網,比如我設置IP範圍是192.168.11.0/24,網關就是192.168.11.2
2、配置網關
網關需要有轉發功能,因此需要兩個網卡一個對內,一個對外,在虛擬機設置中,添加一張網絡適配器(網卡),均選擇NAT模式即可
兩個網卡的設置方法相同,如下:
- 對內網卡(網卡1 - ens33)
我是Ubuntu18.04,直接在設置中就可以修改網絡選項
設置網卡1,選擇IPv4的方式爲手動(Manual),在Address欄分別輸入
- IP地址:192.168.11.16
- 子網掩碼:255.255.255.0
- 網關IP:192.168.11.2
(網關主機的網關IP用於和物理機進行數據交互,因此需要和物理主機的VMnet8網絡適配器中的網關一致,否則無法訪問外網)
至此,對內網卡填寫的數據如下:
- 對外網卡(網卡2 - ens38)
對外網卡的配置與對內網卡一樣,只不過IP需要和對內網卡不在同一網段,如下:
- IP地址:192.168.22.11
- 子網掩碼:255.255.255.0
- 網關IP:192.168.22.2
這樣網關的網卡就設置好了,但是默認的IP轉發功能並沒有開啓,需要手動開啓來進行轉發,使用以下語句將ip_forward文件內的值改爲1即可開啓
echo "1" > /proc/sys/net/ipv4/ip_forward
3、配置內網與外網
內外網的配置與網關的對內對外網卡大同小異,如下:
- 內網
配置成以下數據:
- IP地址:192.168.11.12(和網關的對內網卡IP處於同一網段)
- 子網掩碼:255.255.255.0
- 網關IP:192.168.11.16
(此處的網關需要填網關主機的對內網卡IP,因爲是把其作爲內外環境的網關,讓數據包經過網關主機)
- 外網
外網與內網同理
- IP地址:192.168.22.12(和網關的對內網卡IP處於同一網段)
- 子網掩碼:255.255.255.0
- 網關IP:192.168.22.11 (網關主機的對外網卡IP)
至此,所有環境配置完成,各主機IP如下:
- 內網:192.168.11.12
- 外網:192.168.22.12
- 網關:
- 對內:192.168.11.16
- 對外:192.168.22.11
三、環境測試
重啓網卡服務或者虛擬機,通過互相ping來測試環境是否配置成功
內網ping外網與網關(成功):
外網ping內網與網關(成功):
網關ping內網與外網(成功):
OK,測試無誤,可以開始進行iptables的防火牆配置了。
四、iptables規則配置
首先查看當前規則表爲空
1、阻止內外網直接通信
阻止任何外部世界直接與防火牆內部網段直接通訊,有以下兩種方法:
- 1)將轉發鏈的默認策略改爲DROP
可以看到當前轉發鏈的默認策略是允許(ACCEPT)
使用語句 iptables -P FORWARD DROP 修改默認策略爲丟棄
此時內外網互相ping,均無法通信
不僅如此,內網主機也已經無法與任何外部網絡進行通信,例如百度
阻斷成功。
- 2)設置指定IP可以訪問內網
將默認策略改回並重置iptables,並且將非內網的請求目標是內網的請求包拒絕(REJECT)即可。
此處以ping爲例,那麼協議就是icmp,語句如下:
iptables -I FORWARD -p icmp -d 192.168.11.12 -j REJECT
此時再次使用外網ping內網,已經無法ping成功
當然除此之外,還可以不指定數據包類型,那麼就切斷了所有的內外網直接訪問,如下,打開內網的Apache http服務
此時外網可以正常訪問
插入所有數據包均攔截(即不指定協議或端口)的規則:
iptables -I FORWARD -d 192.168.11.12 -j REJECT
再次使用外網訪問內網的http服務,無法訪問
2、內網通過防火牆訪問外網的HTTP和HTTPS
允許內部用戶通過防火牆訪問外部HTTP服務器,允許內部用戶通過防火牆訪問外部HTTPS服務器
該規則的含義是指:內網訪問外網只能訪問HTTP和HTTPS服務,其他的均攔截。
那麼接着上一步,依然將轉發鏈中默認的策略改爲DROP,且刪除所有配置,內網無法與外部進行任何通信,此時添加以下語句:
iptables -I FORWARD -s 192.168.11.12 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 192.168.11.12 -p tcp --dport 443 -j ACCEPT
語句表示:只有源地址是內網地址,目的地址不限,目的端口是80(HTTP)和443(HTTPS)時纔會允許,其餘的默認丟棄(此處均設置兩個服務的默認端口)
此時使用再訪問百度(HTTPS)
學校官網(HTTP),均可成功訪問
但是依然ping不通外網,因爲策略中沒有對其進行允許
3、內網通過防火牆訪問外網的TFP
允許內部用戶通過防火牆訪問外部FTP服務器。
FTP服務的默認端口爲20(傳輸端口)和21(控制端口),先不添加規則,在步驟二的iptables配置基礎上
直接訪問一個上海交大的FTP站點,無法訪問,因爲默認丟棄
此時添加以下語句:
iptables -A FORWARD -s 192.168.11.12 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -s 192.168.11.12 -p tcp --dport 21 -j ACCEPT
再次訪問,即可成功
4、內網服務器端口映射
將內網服務器的80端口映射到網關的9999端口,也就是可以通過訪問網關的9999端口,來訪問內網的80端口提供的HTTP服務
首先需要打開轉發功能,也就是允許所有轉發
iptables -I FORWARD -j ACCEPT
接着輸入以下兩條語句:
- 請求包的NAT映射
iptables -t nat -I PREROUTING -d 192.168.11.16 -p tcp --dport 9999 -j DNAT --to 192.168.11.12:80
- 響應包的NAT映射
iptables -t nat -I POSTROUTING -s 192.168.11.12 -j SNAT --to 192.168.11.16
此時便可成功映射,訪問網關主機的9999端口即訪問內網的HTTP服務
附:iptables & 涉及參數解釋
僅對實驗中涉及到的參數進行解釋,其餘的網上比比皆是,請自行搜查。
1、iptables簡述
iptables的設計是四表五鏈結構
四表:
- filter: 基本過濾表,防火牆,也是不指定表時的默認表
- nat: 用於NAT(網絡地址轉換)功能,如端口映射,地址映射等
- mangle: 用於對特定數據包的修改
- raw: 有限級最高,設置raw時一般是爲了不再讓iptables做數據包的鏈接跟蹤處理,提高性能
五鏈:
- INPUT: 進來的數據包應用此規則鏈中的策略
- OUTPUT: 外出的數據包應用此規則鏈中的策略
- FORWARD: 轉發數據包時應用此規則鏈中的策略
- PREROUTING: 對數據包作路由選擇前應用此鏈中的規則(所有的數據包進來的時侯都先由這個鏈處理)
- POSTROUTING: 對數據包作路由選擇後應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
鏈是相同動作規則的集合,表是相同功能規則的集合。
iptables工作優先級示意圖:
2、參數解釋
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
- -t table:指操作的表,filter、nat、mangle或raw, 默認使用filter
- COMMAND:子命令,定義對規則的管理
- chain:指明鏈路
- CRETIRIA:匹配的條件或標準
- ACTION:操作動作
以以下語句爲例:
iptables -I FORWARD -s 192.168.11.12 -p tcp --dport 80 -j ACCEPT
- 未指定-t table即使用默認表,filter
- -I FORWARD表示在FORWARD鏈首插入(insert)本條規則,-A是在末尾追加(append)
- -s 表示源IP(source)
- -p 表示網絡協議(protocol),一般有TCP、UPD、ICMP等
- –dport 表示目的端口(destination port)
- -j 後跟執行的動作,一般有ACCEPT、REJECT、DROP,或者在nat表中還可能有SNAT(對源地址進行NAT)、DNAT(對目的地址進行NAT)
除此還有一些常用的:
- iptables -t table -L:列出指定表的規則鏈信息
- iptables -t table -D chain 1:刪除指定表的指定鏈的第1條規則
- iptables -t table -F:重置指定表(刪除表中所有規則)
- iptables -t table -P chain ACTION:更改指定表中指定鏈的默認策略
具體的iptables相關知識請看以下博客,非常詳細: