http://cha.homeip.net/blog/archives/200 ... squid.html
Jamyy's Weblog
« 網路安裝 Linux | 首頁 | VB6 HTML Parser 備忘 »
2005年06月28日
Linux NAT + Squid + SARG 製作使用者上網記錄報表
公司老闆想掌握員工上網情況? 家長想瞭解孩子們都在逛哪些網站?
一台 Linux 電腦, 加上 Transparent Proxy 機制與 SARG 報表, 當 Client PC 透過 Linux NAT 上網時, 即可記錄每個使用者的上網瀏覽狀況.
環境需求
Linux NAT (以下三種環境皆可應用, 本文以 Fedora Linux 為例)
* 雙網卡, eth0 接 Hub, eth1 接 ADSL Router
* 單網卡, eth0 接 Hub, ADSL Router 接入 Hub, Linux pppoe 上網
* 單網卡, eth0 接 Hub, IPSharing WAN Port 接 ADSL Router (並於 IPSharing 設定禁止 Client PC 直接透過 IPSharing 上網)
Linux NAT 基本設定:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s your.local-area.network/netmask -j MASQUERADE
Client PC 基本設定:
Gateway 指向 Linux LAN IP 即可
架設 Transparent Proxy
安裝 Squid (以 yum 安裝為例)
yum install squid
設定 Squid
vi /etc/squid/squid.conf
http_access deny all → 改成 → http_access allow all
#以下是 Squid 2.5 以前的做法
httpd_accel_host your.host.name
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
#以下是 Squid 2.6 以後的做法
http_port 3128 transparent
設定 iptables
iptables -t nat -A PREROUTING -s your.local-area.network/netmask -p tcp --dport 80 -j REDIRECT --to-ports 3128
安裝分析報表
安裝 SARG (以 sarg-2.0.8 source install 為例)
wget http://nchc.dl.sourceforge.net/sourcefo ... 0.8.tar.gz
tar -zxf sarg-2.0.8.tar.gz
cd sarg-2.0.8
./configure
make
make install
建立 SARG 報表目錄
mkdir /var/www/html/sarg
設定 SARG
vi /usr/local/sarg/sarg.conf
access_log /var/log/squid/access.log
output_dir /var/www/html/sarg
resolve_ip yes
overwrite_report yes
設定每小時更新報表資料
vi /etc/cron.hourly/sarg
#!/bin/sh
/usr/bin/sarg > /dev/null 2>&1
chmod a+x /etc/cron.hourly/sarg
選擇性的其他相關設定
編輯 /etc/hosts IP hostname 對照表, 例如:
192.168.1.100 Mary
192.168.1.101 Jack
192.168.1.102 David
.
.
.
設定每日 23:59 清除 Proxy Cache 資料
vi /etc/squid/squid.freshcache
#!/bin/sh
/usr/bin/sarg
sleep 5s
sync
service squid stop
sleep 5s
true > /var/log/squid/access.log
true > /var/log/squid/cache.log
true > /var/log/squid/store.log
true > /var/log/squid/squid.out
sleep 5s
sync
rm -rf /var/spool/squid/*
sleep 5s
sync
service squid start
chmod a+x /etc/squid/squid.freshcache
vi /etc/crontab
59 23 * * * root /etc/squid/squid.freshcache
參考資料: 鳥哥的 Linux 私房菜 - 簡易 Proxy Server 架設
延伸閱讀:
網路監控套件
* BandwidthD
* MRTG
* Nagios
* ntop
* OpenNMS
* SARG
網站流量分析套件
* AWStats
* Webalizer
Jamyy's Weblog 相關文件
* Fedora Core Sendmail 開放遠端收發信件
* Netmeeting 目錄伺服器 (ILS) on Linux
* Replication in MySQL
* proftpd.conf 設定備忘
* PHP@Linux vs MS-SQL Server database (using FreeTDS)
* Sendmail + MailScanner + ClamAV 安裝實錄
* 讓 AWStats 顯示 UTF-8 繁體中文
* 使用 mgetty 建立 Linux Fax Server
* Building Linux NAT with MRTG network monitoring
* iptables / route command notes
* Samba-vscan 安裝實錄
* 從 Linux 發送訊息到 Windows 作業系統
* 解決 Linux NAT ip_conntrack: table full 的方法
--- 2005.11.26 補充
Linux NAT + Transparent Proxy 的 CBQ 頻寬限制設定備忘:
環境: eth0 對內, eth1 對外, TCP Port: 3128
iptables -t mangle -A OUTPUT -p tcp --sport 3128 -d 192.168.0.0/24 -j MARK --set-mark=80
file: /etc/sysconfig/cbq/cbq-0080.tcp80
DEVICE=eth0,100Mbit,10Mbit
RATE=200Kbit
WEIGHT=10Kbit
PRIO=5
MARK=80
相關網頁: cbq.init 設定手札
--- 2005.12.27 補充
嫌 SARG 報表不夠 "即時" 嗎? 這裡還有 兩款不錯的 Squid Logfile 分析軟體 喔!
Posted by Jamyy at 2005年06月28日 15:03
Trackback Pings
TrackBack URL for this entry:
http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/95
Comments
請教站長:
原本環境是上網統一由一台硬體式防火牆連出去,
如果要用squid 做Transparent Proxy ,
該如何和這台防火牆做搭配呢?
Posted by: aven at 2006年04月15日 00:18
假設原環境如下:
Internet
↑
Firewall (192.168.0.254)
↑
LAN PCs (IP Range=192.168.0.[100-199], Gateway=192.168.0.254)
方式(1):
Internet
↑
Firewall (192.168.0.254, 針對 192.168.0.1 控管即可)
↑
Linux NAT with Transparent Proxy (eth0=192.168.1.254, eth1=192.168.0.1)
↑
LAN PCs (IP Range=192.168.1.[100-199], Gateway=192.168.1.254)
優點: 可在 Linux NAT 進行各種封包蒐集、過濾、管制、監控
缺點: Linux NAT 使用之網卡會影響區域網路的效能與品質
方式(2):
Internet
↑
Firewall (192.168.0.254, 只允許 192.168.0.253 對外連結 tcp 80 port)
↑
Linux Proxy Server (eth0=192.168.0.253)
↑
LAN PCs (IP Range=192.168.0.[100-199], Gateway=192.168.0.254, Proxy=192.168.0.253)
優點: 不影響原網路架構
缺點: 需在 LAN PCs 瀏覽器設定使用 Proxy
Posted by: Jamyy at 2006年04月15日 09:46
我現在是用第二種方式,因為每個user都要去設定proxy所以才想改成Transparent Proxy,看了您的回覆,已瞭解該怎麼改了,謝謝.
Posted by: aven at 2006年04月15日 16:47
請問一下
文章中的squid + CBQ是指上傳還是下載
我現在已經有架設squid
CBQ我也有用過
但是沒用過squid + cbq
可否舉個例子來說明squid + cbq的上下載做法
謝謝
Posted by: akong at 2007年04月18日 15:51
文中 cbq 設置是針對 HTTP 下載限制
若要限制上載速度:
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 10
vi /etc/sysconfig/cbq/cbq-0010.http_upload
DEVICE=eth0,100Mbit,512Kbit
RATE=50Kbit
WEIGHT=5Kbit
PRIO=5
MARK=10
其中, mark number 與 cbq-xxx filename 可隨意設置
上例是假設總上載頻寬 512Kbit, 限制上載頻寬為 50Kbit
Posted by: Jamyy at 2007年04月19日 10:35
感謝大大的教學
那假如我想限制某個User對某個網站的上傳頻寬
例如無名小站的上傳
iptables -t mangle -A OUTPUT -p tcp -d pic.wretch.cc --dport 80 -j MARK --set-mark 10
是這樣改嗎
那cbq那有需要動嗎
謝謝
Posted by: akong at 2007年04月19日 11:39
例外想請問一下
您範例中的eth0
是對client的user對吧
就是虛擬IP的User對吧
不好意思一次問了那麼多問題
謝謝
Posted by: akong at 2007年04月19日 11:45
您的做法是可行的
不過若要針對 "某個使用者" 還要加上 -s 參數搭配內部 user ip
如:
針對內部 IP: 192.168.1.100
iptables -t mangle -A OUTPUT -p tcp -s 192.168.1.100 -d pic.wretch.cc --dport 80 -j MARK --set-mark 10
當然 cbq 設定檔案也要設定 MARK=10 才能對上 iptables 的 mark number
至於要限制使用多少頻寬, 也是在 cbq 設定檔中調整就行了
我覺得編寫 iptables rule 與 cbq 設定檔需要有點 "想像力", 以 linux host 為中心, 想像封包行進的方向, 什麼時候應該設在 eth0? eth1? 還真的有點傷腦筋~
設定好後最好測試一下:
cbq stats
iptables -t mangle -L -n -v
查看是否有符合條件的封包流過
一開始設錯了也沒關係, 多試幾次總會成功的 :)
Posted by: Jamyy at 2007年04月19日 11:52
您好
我測試了一下午
有一個很奇怪的問題
我用iptables -A OUTPUT -t mangle -s 192.168.2.4 -p tcp -d www.wretch.cc --dport 80 -j MARK --set-mark 240
不管我怎麼去連無名
都沒有任何封包進出
可是我用iptables -A PREROUTING -t mangle -s 192.168.2.4 -p tcp -d www.wretch.cc --dport 80 -j MARK --set-mark 240
就有封包進出
另外
在CBQ這裡
DEVICE=dev1804289383,100Mbit,10Mbit
RATE=32Kbit
WEIGHT=3Kbit
MARK=240
PRIO=5
RULE=192.168.2.4
這是我的設定
但是我也是不論怎麼RUN
cbq stats的結果都是沒封包
class cbq 1:2 parent 1: leaf 2: rate 32000bit (bounded) prio 5
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
borrowed 0 overactions 0 avgidle 2.12805e+07 undertime 0
class tbf 2:1 parent 2:
是我的設定有問題嗎
以下是我的網路
LAN(192.168.2.0)--Gateway+squid(192.168.2.254)--Internet
eth0連Internet
dev1804289383連LAN
Posted by: akong at 2007年04月19日 17:02
封包主要流程分兩段:
LAN User:dynamic_port → Linux:3128 (dev=dev1804289383)
Linux:dynamic_port (dev=eth0) → Internet:80
依您的環境可設定如下
(使用者不透過 squid 上網的設置) --> LAN PC 預設網關為 Linux 內部 IP
iptables -t mangle -A FORWARD -s 192.168.1.101 -d www.wretch.cc -p tcp --dport 80 -i dev1804289383 -j MARK --set-mark 240
(透過 squid 上網的設置) --> LAN PC 瀏覽器 Proxy 指向 Linux 內部 IP, 或 Linux 當 Transparent Proxy
iptables -t mangle -A OUTPUT -p tcp -d www.wretch.cc --dport 80 -j MARK --set-mark 240
以上設置完成後, cbq 不需使用 RULE 參數即可作用
Posted by: Jamyy at 2007年04月20日 00:14
感謝大大的指導
不知大大有沒有研究過一套軟體
叫Dansguardian這個軟體
小弟在公司的環境
有用這套軟體來加強Proxy的功能
他是必須搭配squid的軟體
走的port也有些不同
但是他是必須啟動好squid才能用
也就是squid+dansguardian=Proxy
squid是走3128
Dansguardian是走8080
這個會不會是影響iptables及cbq呢
另外若搭配L7 filter有沒有什麼要注意的呢
Posted by: akong at 2007年04月20日 10:02
Squid 和 Dansguardian 主要負責網頁內容的 cache、log、filter
iptables 加上 l7-filter 主要針對網路封包做條件限制
cbq 則配合 iptables 的 set-mark 進行頻寬管制
以這個規則來說:
iptables -t mangle -A OUTPUT -p tcp -d www.wretch.cc --dport 80 -j MARK --set-mark 240
無關 3128 或 8080 port (proxy 使用的 port)
反正只要從本機 (proxy) 出去, 目的地是 web server 的封包, 通通打上 240 的 mark, 讓 cbq 去限速
這張圖清楚說明 iptables 對網路封包的管制流程
http://linux-ip.net/nf/nfk-traversal.html
我已經供奉很久了 :)
Posted by: Jamyy at 2007年04月20日 11:50
謝謝哦
那以我現在的環境
有兩個LAN
一個是192.168.2.0/24(PC)
另一個是192.168.1.0/24(Server)
那如果我不要CBQ檔到PC-->Server的流量
我該怎麼做呢
因為我會多用一行指令
設定所有的PC總上傳速度
但因為是指定到0.0.0.0
所以PC-->Server的速度就會被管制到了
可以設定內部網路不受CBQ控制嗎
謝謝
Posted by: akong at 2007年04月20日 12:56
您可以用 -d ! 192.168.1.0/24 排除往 server 網段的封包
Posted by: Jamyy at 2007年04月20日 13:45
感謝大大長期的指導
小弟已成功封鎖上傳
現在有一個很奇怪的現象
iptables -t mangle -A OUTPUT -p tcp -m layer7 --l7proto jpeg -s 192.168.2.254 --sport 8080 -d 192.168.2.0/24 -j MARK --set-mark 100
這是我封鎖下載jpeg時限速
看iptables -t mangle -L -n -v時
有封包進來
但是我用cbq時
DEVICE=eth2,100Mbit,10Mbit
RATE=300Kbit
WEIGHT=30Kbit
MARK=100
PRIO=5
然後再去執行cbq compile 及 cbq start
從cbq stats查看
卻沒有任何反應
class cbq 1:3 parent 1: leaf 3: rate 300000bit (bounded) prio 5
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
borrowed 0 overactions 0 avgidle 2.26384e+06 undertime 0
請問是怎麼回事
如果說同一張網卡上我有鎖上傳及下傳
可以這樣做嗎
Posted by: akong at 2007年04月27日 18:50
您客氣了, 所謂教學相長, 我也因此學到不少經驗 :P
您的設定看起來都正確, 不過 cbq 設定裡應該是對內的網卡才是
請問您的 eth2 是對內的網卡嗎?
cbq 可以同時在同一張網卡鎖上/下載頻寬, 沒問題的.
Posted by: Jamyy at 2007年04月30日 12:00
感謝大大的回覆
我的eth2的確是對內的
ip為192.168.2.254
只是不知為何不行
Posted by: akong at 2007年05月02日 15:09
我試了也是不行
而且 iptables 所設定的 rule 也沒有符合條件的封包通過
(您之前可能看錯了)
當然 cbq 也就沒能發揮作用
後來試著將 rule 設到 FORWARD, 並試著以 HTTP、FTP 等方式傳輸 JPEG 圖檔, 觀察結果還是一樣 -- 沒有任何封包符合條件
很抱歉沒能幫上忙了
Posted by: Jamyy at 2007年05月02日 21:08
Post a comment (張貼後若沒看到您的留言, 請按 "F5" 重新整理網頁)
Name:
Email Address:
URL:
Remember Me? YesNo
Security Code:
Comments:
SARG
前往
- Software
- ↳ CodeCharge Studio
- ↳ CodeCharge
- ↳ DemoCharge
- ↳ SuperPDF
- ↳ 551einv
- ↳ E3進銷存
- 程式語言
- ↳ PHP
- ↳ CodeLobster PHP Edition
- ↳ Yii
- ↳ CodeIgniter
- ↳ Phalcon
- ↳ Symfony
- ↳ FuelPHP
- ↳ Zend Framework 2
- ↳ laravel
- ↳ WordPress
- ↳ ASP.NET/C#
- ↳ ASP/VBScript
- ↳ JSP
- ↳ Java Servlets
- ↳ ColdFusion
- ↳ Perl
- ↳ Java Script
- ↳ jQuery
- ↳ HTML + CSS
- ↳ jQuery
- ↳ nodejs
- ↳ VB6
- ↳ Git
- ↳ App Inventor 2
- ↳ bash
- ↳ C++/ VC/ OpenCV
- ↳ OpenCV
- ↳ go
- ↳ cordova
- ↳ python
- ↳ Xamarin
- ↳ Assembly
- 資料庫
- ↳ MySQL
- ↳ PostgreSQL
- ↳ ORACLE
- ↳ Access
- ↳ SQL Server
- ↳ SQLite
- ↳ MariaDB
- ↳ Mongodb
- 作業系統
- ↳ Linux
- ↳ Ubuntu
- ↳ CentOS
- ↳ Mint
- ↳ Mandriva
- ↳ Debian
- ↳ Red Hat Enterprise Linux
- ↳ Oracle Linux
- ↳ Fedora
- ↳ Kali Linux
- ↳ OpenSUSE
- ↳ Elementary OS
- ↳ Microsoft
- ↳ Server 2008 R2
- ↳ Server 2012 R2
- ↳ Server 2012
- ↳ 8
- ↳ 10
- ↳ System Center 2016
- ↳ NOVELL
- ↳ FreeBSD
- ↳ VMware
- ↳ VirtualBox
- ↳ Mac OS X
- ↳ Solaris
- ↳ iOS
- ↳ Android
- ↳ Cloud
- ↳ OpenStack
- ↳ Docker
- ↳ Proxmox VE
- ↳ CloudReady
- ↳ chrome
- 網頁伺服器
- ↳ apache
- ↳ tomcat
- ↳ nginx
- ↳ IIS
- ↳ JBoss
- ↳ weblogic
- ↳ WebHosting
- 硬體
- ↳ 硬體及週邊
- ↳ RouterOS
- ↳ LEGO NXT
- ↳ Arduino
- ↳ MSP430
- ↳ Raspberry Pi
- ↳ OpenERP
- ↳ Storage
- ↳ Server
- ↳ Brocade
- ↳ MODELS
- ↳ FortiGate
- 軟體
- ↳ sublime
- ↳ LibreNMS