【背景】
你可能辦公司有一個代理,但是不是很穩定,你就需要一個備用的代理了。squid就是一個不錯的選擇
參考
http://www.cnblogs.com/mchina/p/3812190.html
【這種代理上網的優勢 比nat上網】
代理通過squid訪問外網,squid是中也是一種應用層防火牆,可以filter,也有緩存的功能,能夠節省帶寬和流量
nat地址轉換方式,是網絡層的防火牆!
【測試系統環境】
1 vm虛擬機 橋接上網
2 主機關閉windows防火牆
3 虛擬機關閉防火牆
4 由於是橋接的,所有主機和vm是在同一個上網的網段,且必須互相ping通
真實環境機器 192.168.1.4 橋接的虛擬機 192.168.1.8 網關192.168.1.1
[Squid 分類]
按照代理類型的不同,可以將Squid 代理分爲正向代理和反向代理,正向代理中,根據實現方式的不同,又可以分爲普通代理和透明代理。
普通代理:需要客戶機在瀏覽器中指定代理服務器的地址、端口;
透明代理:適用於企業的網關主機(共享接入Internet)中,客戶機不需要指定代理服務器地址、端口等信息,代理服務器需要設置防火牆策略將客戶機的Web訪問數據轉交給代理服務程序處理;http_port 3128 transparent
反向代理:是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個服務器。http_port 3128 vhost
【實現要達到的預期效果】
192.168.1.4---192.168.1.1 --外網
切換到squid代理去上網
192.168.1.4 -- 192.168.1.8(squid) -- 192.168.1.1 --> 外網
【系統安裝環境】
[root@squid ~]# cat /etc/issue | head -1
CentOS release 6.5 (Final)
[root@squid ~]# ifconfig | sed -n 's#.*inet addr:\(.*\) B.*#\1#gp'
192.168.1.8
[root@squid ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
[root@squid ~]# cat /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 192.168.1.1
[root@squid ~]# ping www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125: icmp_seq=1 ttl=54 time=27.2 ms
64 bytes from 61.135.169.125: icmp_seq=2 ttl=54 time=27.6 ms
【軟件版本】
官網:http://www.squid-cache.org/
使用版本: squid-3.5.15.tar.gz 或者yum 安裝 yum install squid
wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.15.tar.gz
首次使用可參考:http://www.deckle.co.uk/squid-users-guide/installing-squid.html
此處我使用yum安裝的方式
【安裝和配置】
yum install squid -y
生成的重要文件和目錄
/etc/squid/
/var/log/squid
/etc/httpd/conf.d/squid.conf
/etc/logrotate.d/squid
/etc/rc.d/init.d/squid
/etc/squid
/etc/squid/cachemgr.conf
/etc/squid/squid.conf
參考
http://www.cnblogs.com/mchina/p/3812190.html
【配置文件】
[root@squid ~]# cat /etc/squid/squid.conf
http_port 3128 cache_mem 64 MB maximum_object_size 4 MB cache_dir ufs /var/spool/squid 100 16 256 access_log /var/log/squid/access.log acl localnet src 192.168.10.0/24 http_access allow localnet http_access deny all visible_hostname squid
注意:
1 rpm包安裝的squid進程默認運行在squid用戶下
[root@squid ~]# ps -ef |grep squid
root 4539 2052 0 17:29 pts/0 00:00:00 tail -f /var/log/squid/access.log
root 5001 1 0 18:38 ? 00:00:00 squid -f /etc/squid/squid.conf
squid 5003 5001 0 18:38 ? 00:00:00 (squid) -f /etc/squid/squid.conf
squid 5005 5003 0 18:38 ? 00:00:00 (unlinkd)
root 5448 5427 0 18:45 pts/3 00:00:00 grep squid
[root@squid ~]# id squid
uid=23(squid) gid=23(squid) groups=23(squid)
2 squid用戶必須對緩存目錄文件有讀寫權限
[root@squid ~]# ls -ld /var/spool/squid/
drwxr-xr-x. 18 squid squid 4096 May 7 18:38 /var/spool/squid/
3 一旦緩存服務器中斷了和外網的連接,即使內網用戶訪問的數據在squid緩存中有,squid也是不會發送給內網用戶的。因爲這是一個不完整的http請求過程
解釋:
A用戶的瀏覽器提交了請求連接 通過設置的代理,請求到了squid服務器,此時squid一定會把請求的url轉到 外網web-serve中去! 無論squid中是否有緩存,如果有緩存提交的請求是詢問webserver是否有更新,如果沒有緩存則直接去請求整個內容。
【結果】
以上步驟的時候,雖然請求到了squid服務器且有日誌,但是客戶端 一致請求超時 返回504。
所以這個實驗squid還是需要兩個網卡,一個內網一個外網
以下的環境方案,可以完美的看到效果:
A(內網用戶 網卡設置 vm1 192.168.10.2) <---> (vm1 eth0 192.168.10.1)squid服務器(vm2 eth1 200.1.1.1) <---> (eth0 vm2 200.1.1.2)web-server模擬外網web服務器
【簡單介紹一下透明代理】
1 配置修改
http_port 3128 transparent
2 路由更改 一定要將客戶機內網的網關指向squid服務器,客戶機無需添加瀏覽器的代理設置
3 squid上面要對iptables進行修改! 將來源80的端的數據包,在進來路由之前直接將數據包定向到3128 squid進程去處理(並未修改數據包的目標IP 和 目標端口,此處做的是數據包重定向)
在nat表中新增一條規則
# iptables -t nat -I PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128