iptables+squid綜合案例分析

netfilter/iptables+squid綜合案例分析
 
實驗背景
     小諾公司內部搭建了web服務器和FTP服務器,爲了滿足公司需求,要求使用Linux構建安全、可靠的防火牆。具體要求如下:
1、 防火牆自身要求安全、可靠,不允許網絡中任何人訪問;防火牆出問題,只允許在防火牆主機上進行操作。
2、 公司內部的web服務器要求通過地址映射發佈出去,且只允許外部網絡用戶訪問web服務器的80端口,而且通過有效的DNS註冊。
3、 公司內部的員工必須通過防火牆才能訪問內部的web服務器,不允許直接訪問。
4、 FTP服務器只對公司內部用戶起作用,且只允許內部用戶訪問FTP服務器的21和20端口,不允許外部網絡用戶訪問。
5、 公司內部的員工要求通過透明代理上網(不需要在客戶機瀏覽器上做任何設置,就可以上網)
6、 內部用戶所有的IP地址必須通過NAT轉換之後才能夠訪問外網。
 
實驗網絡拓撲圖
實驗原理:
----------------netfilter/iptables架構---------------------
 
iptables默認具有5條規則鏈:PREROUTING、POSTROUTING、FORWARD、INPUT、OUTPUT
 
iptables默認的規則表以及對應的規則鏈:
filter:INPUT、FORWARD和OUTPUT。
nat:PREROUTING、POSTROUTING和OUTPUT。
mangle:PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD。
 
nat的主要用處是網絡地址轉換,即Network Address Translation,縮寫爲NAT。做過NAT操作的數據包的地址就被改變了,當然這種改變是根據我們的規則進行的。屬於一個流的包只會經過這個表一 次。如果第一個包被允許做NAT或Masqueraded,那麼餘下的包都會自動地被做相同的操作。也就是說,餘下的包不會再通過這個表,一個一個的被 NAT,而是自動地完成。這就是我們爲什麼不應該在這個表中做任何過濾的主要原因,對這一點,後面會有更加詳細的討論。PREROUTING 鏈的作用是在包剛剛到達防火牆時改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產生的包的目的地址。POSTROUTING鏈在包就要離開防火 牆之前改變其源地址。
 
mangle主要用來mangle數據包。我們可以改變不同的包及包頭的內容, 比如 TTL,TOS或MARK。注意MARK並沒有真正地改動數據包,它只是在內核空間爲包設了一個標記。防火牆內的其他的規則或程序(如tc)可以使用這種 標記對包進行過濾或高級路由。這個表有五個內建的鏈: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。PREROUTING在包進入防火牆之後、路由判斷之前改變包,POSTROUTING是在所有路由判斷之後。 OUTPUT在確定包的目的之前更改數據包。INPUT在包被路由到本地之後,但在用戶空間的程序看到它之前改變包。FORWARD在最初的路由判斷之 後、最後一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改變數據包的 TTL,TOS或MARK,而不是其源目地址。NAT是在nat表中操作的。
 
filter是專門過濾包的,內建三個鏈,可以毫無問題地對包進行DROP、 LOG、ACCEPT和REJECT等操作。FORWARD 鏈過濾所有不是本地產生的並且目的地不是本地(所謂本地就是防火牆了)的包,而 INPUT恰恰針對那些目的地是本地的包。OUTPUT 是用來過濾所有本地生成的包的。
實驗步驟:
 
實驗思想:先將進出防火牆的策略設置到最嚴格,然後一步步添加需要放行的策略。
 
一、Linuxiptables的具體設置
 
1、 清空filter表和nat表中的配置策略。
清空所選的系統表filter中的默認鏈(不影響默認策略):iptables -F (INPUT OUTPUT FORWARD),不加參數,表示全部清除
清空所選的系統表nat中的默認鏈(不影響默認策略):iptables -F (PREROUTING、POSTROUING、OUTPUT) –t nat ,不跟參數,表示全部清除
刪除表中的自定義規則鏈:iptables -X <自定義規則鏈名1、鏈名2....>
指定鏈的所有計數器歸零:iptables -Z (INPUT OUTPUT FORWARD)
clip_image006
 
2、 放行filter表的默認OUTPUT鏈,阻止FORWARD鏈和INPUT鏈。全部放行nat表中的PREROUTING鏈、POSTROUTING鏈以及OUTPUT鏈。(設置完成之後,目前的狀態是隻允許數據從內網出去,不允許外網任何數據進來。)
設置默認策略規則: iptables -P -t (nat、filter、mangle) (INPUT OUTPUT FORWARD) <DROP、ACCEPT>
clip_image008
clip_image010
 
3、 將內網web服務器的IP地址映射到防火牆連接外網接口的IP地址上。
設置完成之後,外網用戶就可以通過80端口訪問防火牆外網接口的IP地址。並能夠將目的IP地址轉換爲內網web服務器的IP地址,但是還不能夠訪問web服務器。
格式:iptables -t nat -A PREROUTING -p tcp -d 防火牆對應外網的IP --dport 80 -j DNAT --to-destination web服務器的IP地址
clip_image012
 
4、 放行轉發訪問內網web服務器的數據包
設置完成之後,外網用戶就可以通過80端口訪問防火牆外網接口的IP地址,並且能夠將外網IP地址映射爲內網web服務器的IP地址,進而訪問內部web服務器。
格式:iptables –A FORWARD –p tcp –d 內網web服務器的IP地址 --dport 80 –j ACCEPT
clip_image014
 
5、 將內網web服務器的IP地址映射到防火牆連接內網接口的IP地址上。
設置完成之後,內網用戶就可以通過訪問防火牆內網接口的IP地址來訪問內部web服務器。爲什麼不直接讓內網用戶通過內網IP地址直接訪問呢?是爲了增加內網Web服務器的安全性。
格式:iptables -t nat -A POSTROUTING -p tcp -d http服務器的IP地址 --dport 80 -j SNAT --to-source 防火牆對應內網的IP地址
clip_image016
 
6、 在防火牆中添加透明代理設置的規則。
設置完成之後,內網用戶訪問外網的web服務器的80端口都轉換爲內網代理服務器squid的默認端口3128。只要代理服務器能夠訪問互聯網,內網用戶也就可以訪問互聯網。
格式:iptables –t nat –A PREROUTING –s 子網地址/子網掩碼 -p tcp --dport 80 -j REDIRECT –to-posts 3128
clip_image018
 
7、 設置Linux作爲網關服務器。
設置完成之後,內網所有IP地址如果訪問外網都映射爲防火牆外網接口的IP地址。
格式:iptables –t nat –A POSTROUTING –s 子網地址/子網掩碼 -o 外部接口 -j MASQUERADE
clip_image020
 
8、 保存iptables的配置。
當管理員已經對Linux防火牆設置完畢,並且需要永久保存防火牆的設置時,需要使用iptable-save 命令將設置內容保存到一個指定的文件中。默認配置文件在/etc/sysconfig/iptables中。當重新啓動系統之後,需要使用 iptables-restore命令將保存的文件重新恢復到/etc/sysconfig/iptables中。
clip_image022
 
二、Linuxsquid的具體設置
 
1、squid服務器的初始化
第一次使用squid服務器之前需要先使用squid –z命令對squid服務器進行初始化。其主要作用是在squid服務器的工作目錄“/var/spool/squid/”中建立需要的子目錄。
只有在第一次啓動squid服務器之前才需要進行服務器的初始化工作,如果不手動執行squid –z命令,squid服務腳本在第一次啓動服務時也會自動完成相應的初始化工作,再啓動squid腳本程序。
注意:在配置squid之前,要確保主機具有完整的域名。
clip_image024
 
1、編輯squid服務器的配置文件
clip_image026
 
修改服務端口,squid服務器的服務端口使用http_port配置項設置,其默認值是3128,爲了用戶使用方便,可以添加服務端口8080或其它端口。
clip_image028
 
修改緩衝內存數量,squid服務器的性能和squid服務器使用的緩衝內存數量有很大關係,使用內存越多,squid服務器的性能會越好。一般設置cache_mem的值設置爲服務器物理內存的三分之一到四分之一比較合適,cache_mem默認的設置只有8MB。
clip_image030
 
設置squid的工作目錄,squid服務器緩存的內容只有很少的一部分是保存在緩衝內存中的,而代理服務中使用的所有文件都會保存在squid的工作目錄中。在squid.conf配置文件中使用cache_dir設置squid服務器的工作目錄路徑和屬性。
“100 16 256”分別表示目錄中最大的容量是100MB,目錄中的一級子目錄的數量爲16個,二級子目錄爲256個。
squid工作目錄的容量和子目錄的數量也會在一定程度上影響squid服務器代理服務的性能,在實際應用中可根據實際情況適當擴大工作目錄的總容量。
clip_image032
 
在squid.conf配置文件中默認只允許本機使用squid服務器,這種策略也體現了squid服務器默認 設置的嚴謹。爲了讓局域網所有用戶能夠通過squid的代理服務訪問外部網頁,需要設置訪問控制列表,在acl *條目下添加 “acl clients src 子網地址/子網掩碼”
clip_image034
 
在squid.conf文件的http_access deny all設置行之前添加如下設置:http_access allow clients。並添加提供透明代理的相關功能,需要進行如下配置:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
clip_image036
 
設置完成之後,重新啓動squid服務,使squid.conf配置文件生效。
clip_image038
 
Squid服務啓動後,使用netstat命令可以看到squid服務程序在3128端口進行代理服務的監聽,這與通常的代理服務器使用8080端口是不同的。
clip_image040
 
測試略!!
 
附錄:
---iptables命令總結---
在規則末尾添加一條規則: iptables -A INPUT(OUTPUT、FORWARD) <要添加的新規則>
刪除某一個規則:iptables -D INPUT(OUTPUT、FORWARD) <規則序列號> <==> iptables -D INPUT(OUTPUT、FORWARD) <新規則>
替換某一條規則:iptables -R INPUT(OUTPUT、FORWARD) <規則序列號> <要替換的新規則>
在某一序列號上插入某一條規則:iptables -I INPUT(OUTPUT、FORWARD) <規則序列號> <要插入的新規則>
顯示規則: iptables -L (INPUT OUTPUT FORWARD)
清空所選的系統表filter中的默認鏈(不影響默認策略):iptables -F (INPUT OUTPUT FORWARD)
刪除表中的自定義規則鏈:iptables -X <自定義規則鏈名1、鏈名2....>
指定鏈的所有計數器歸零:iptables -Z (INPUT OUTPUT FORWARD)
添加一條新鏈:iptables -N <鏈名>  刪除添加的新鏈 iptables -X <鏈名> 重命名新鏈 iptables -E <舊鏈名> <新鏈名>
設置默認策略規則: iptables -P (INPUT OUTPUT FORWARD) <DROP、ACCEPT>
 
---通用匹配---
匹配指定的協議  -p tcp/udp/icmp   -p tcp,udp,icmp   -p ALL  --protocol ! tcp<==>-p udp,icpm
以IP源地址匹配包  -s 192.168.1.1   -s 192.168.1.0/24  -s 192.168.1.0/255.255.255.0 --source ! 192.168.1.0/24
以IP目的地址匹配包  -d 192.168.1.1   -d 192.168.1.0/24  -d 192.168.1.0/255.255.255.0 --destination ! 192.168.1.0/24
以包進入本地所使用的網絡接口來匹配包  iptables -A <INPUT、FORWARD>  -i <eth0、ppp0>    -i +    -i eth+   -i ! eth0
以包離開本地所使用的網絡接口來匹配包  iptables -A <INPUT、FORWARD>  -o <eth0、ppp0>    -o +    -o eth+   -o ! eth0
 
---TCP匹配---
基於TCP的源端口來匹配 --sport 22   -p tcp --source-port 22:80  --source-port :80  --source-port  22:
基於TCP的目標端口來匹配 --dport 22   -p tcp --destination-port 22:80  --destination-port :80  --destination-port  22:
---UDP匹配---
基於UDP的源端口來匹配 --sport 53  -p udp --source-port 53:69  --source-port :53  --source-port  53:
基於UDP的目標端口來匹配 --dport 53  -p udp --destination-port 53:69  --destination-port :53  --destination-port  53: 
---ICMP匹配---
-p icmp --icmp-type 8
 
---顯示匹配---
基於包的MAC源地址匹配包  iptables -A <INPUT FORWARD> -m mac --mac-source 00:00:00:00:00:01
源端口多個不連續端口匹配 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
目標端口多個不連續端口匹配 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
 
----target匹配---
-j ACCEPT 運行鏈中定義的數據包通過
-j DROP  丟棄鏈中定義的數據包
----DNAT target----
配置SNAT命令基本語法
iptables -t nat -A POSTROUTING -o 網絡接口 -j SNAT --to-
source IP地址
配置DNAT命令基本語法
iptables -t nat -A PREROUTING -i 網絡接口 -p 協議 --dport 端口 -j DNAT  --to-destiantion IP地址
 
-----iptables連接狀態設置--------------------
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
連接跟蹤存在四種數據包狀態
NEW:想要新建連接的數據包
INVALID:無效的數據包,例如損壞或者不完整的數據包
ESTABLISHED:已經建立連接的數據包
RELATED:與已經發送的數據包有關的數據包
【【實例1】】:TCP的負載均衡(web服務器的負載均衡)
iptables -t nat -A PREROUTING -p tcp -d 22.22.22.22 --dport 80 -j DNAT  --to-destination  192.168.1.1-192.168.1.10
 
【【實例2】】:公司內部沒有dns服務器,web服務器域名通過公網上一臺DNS註冊,要求內外包括防火牆在內都能訪問內部web服務器。
地址映射:
外網用戶訪問內網web服務器
iptables -t nat -A PREROUTING -p tcp -d 防火牆對應外網的IP --dport 80 -j DNAT --to-destination http服務器的IP地址
內網用戶訪問內網web服務器
iptables -t nat -A POSTROUTING -p tcp -d http服務器的IP地址  --dport 80 -j SNAT --to-source 防火牆對應內網的IP地址
防火牆訪問內網web服務器
 
放行DHCP數據:iptables  -A INPUT -i eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT
 
------------開啓路由轉發功能------------------
外網IP地址爲靜態:開啓IP地址轉發功能:echo "1" &gt; /proc/sys/net/ipv4/ip_forward <==>vi /etc/sysctl.conf 修改 net.ipv4.ip_forward = 1
(注意:在防火牆策略做好之後再打開,否則會有安全隱患存在)
外網IP地址爲動態獲得:開啓IP地址轉發功能:echo "1" &gt; /proc/sys/net/ipv4/ip_dynaddr
iptables -P INPUT DROP
iptables -p tcp -s ALL -d 192.168.10.100 -j ACCEPT
iptables -A INPUT -j DROP
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章