随着寬帶網絡使用者數量的迅速膨脹,網絡管理者通常面臨IP位址缺乏、使用者通路計費困難以及内部網絡安全難于管理等一系列問題,而使用代理伺服器是解決這些問題的有效方法之一。Squid以其權限管理靈活、性能高和效率快等特點成為Linux和UNIX平台下最為流行的高性能免費應用層代理伺服器。但隻有解決了該伺服器軟體本身不提供日志分析軟體功能所帶來的計費和流量控制等問題,才能提高其應用性能
實作思路
使用MySAR對Squid日志進行分析,将使用者通路外網的記錄儲存在MySQL資料庫中,然後利用所編寫的程式,對使用者的流量進行統計。當流量超過設定值時調用iptables防火牆,禁止使用者再通路Squid伺服器。
實作方法
操作前需要檢視系統ulimit連接配接數,打開limit連接配接限制。
# ulimit -n
1024
# vi /etc/security/limits.conf
添加如下内容:
* soft core unlimited
* hard core unlimited
* soft fsize unlimited
* hard fsize unlimited
* soft data unlimited
* hard data unlimited
* soft nproc 65535
* hard nproc 65535
* soft stack unlimited
* hard stack unlimited
* soft nofile 409600
* hard nofile 409600
第一步:安裝和配置Squid服務。
1.使用下面指令安裝Squid:
# rpm -ivh /mnt/CentOS/squid-2.6.STABLE21-3.el5.i386.rpm
2.先将Squid主配置檔案/etc/squid/squid.conf複制為/etc/squid/squid.conf.bak,然後删除/etc/squid/squid.conf配置檔案的原有内容,并加上下面這些語句,有了這些最基本的設定Squid就可以啟動使用了。
http_port 192.168.1.201:3128
cache_mem 64 MB
cache_dir ufs /var/spool/squid 4096 16 256
cache_effective_user squid
cache_effective_group squid
dns_nameservers 192.168.1.201
visible_hostname test.com.cn
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
acl all src 0.0.0.0/0.0.0.0
http_access allow all
logfile_rotate 30
#設定循環儲存日志檔案的個數
3.使用指令/usr/sbin/squid -z建立硬碟緩沖區的緩存目錄結構。
第二步:安裝Apache和PHP解釋器。
1.使用下面指令安裝Apache服務:
# rpm -ivh /mnt/CentOS/httpd-2.2.3-31.el5.centos.i386.rpm
# rpm -ivh /mnt/CentOS/httpd-devel-2.2.3-31.el5.centos.i386.rpm
2.使用下面指令安裝PHP解釋器:
# rpm -ivh /mnt/CentOS/php-5.1.6-23.2.el5_3.i386.rpm
第三步:安裝MySQL:
1.安裝MySQL服務及相關程式
# rpm -ivh /mnt/CentOS/perl-DBD-MySQL-3.0007-2.el5.i386.rpm
# rpm -ivh /mnt/CentOS/mysql-server-5.0.77-3.el5.i386.rpm
# rpm -ivh /mnt/CentOS/mysql-devel-5.0.77-3.el5.i386.rpm
2.安裝MySQL用戶端程式。
# rpm -ivh /mnt/CentOS/mysql-5.0.77-3.el5.i386.rpm
3.安裝PHP -MySQL支援包
# rpm -ivh /mnt/CentOS/php-mysql-5.1.6-23.2.el5_3.i386.rpm
4.啟動MySQL服務
使用下列指令啟動MySQL服務
/etc/init.d/mysqld start
5.修改MySQL使用者root的密碼。
預設MySQL的root使用者沒有密碼,為了保證資料庫安全,應該使用以下指令修改MySQL使用者root的密碼(本例設定密碼為test_dba):
mysqladmin -u root password test_dba
第四步:安裝和設定MySAR。
1.通路http://giannis.stoilis.gr/software/mysar,點選 “download”下載下傳最新版的MySAR安裝軟體mysar-2.1.4.tar.gz。
2.使用指令tar zxvf mysar-2.1.4.tar.gz -C /usr/local将其解壓到/usr/local目錄中。
3.使用指令vi /usr/local/mysar/www/install/index.php打開安裝向導的源檔案index.php,在第86行的PRIMARY KEY (id),前,插入語句"usr_iptables tinyint(1) unsigned NOT NULL default '0',",建立usr_iptables字段用于判斷使用者是否已被限制通路伺服器。
4.使用指令vi /etc/httpd/conf/httpd.conf打開httpd.conf配置檔案,在配置檔案的末尾添加語句
“Alias /mysar/ "/usr/local/mysar/www/" ”
ServerName 192.168.1.201:8080
設定虛拟目錄,使虛拟目錄指向MySAR目錄中的www子目錄。
[root@jrcz squid-source]# cat /etc/httpd/conf/vhost_mysar.conf
# VirtualHost for mysar Solution
<VirtualHost *:8080>
ServerName 192.168.1.233
DocumentRoot /usr/local/mysar/www/
# Suexec config
SuexecUserGroup root root
</VirtualHost>
5.使用指令/etc/init.d/httpd restart重新開機Apache伺服器。如圖1所示,通過通路http://伺服器IP位址或域名/mysar/這一位址打開MySAR的安裝向導,并依照向導提示完成MySAR的安裝。
# vi /usr/local/mysar/etc/config.ini
dbUser = mysar
dbPass = mysar
dbHost = localhost
dbName = mysar
config.ini檔案需要重新建立才行。否則報錯。
# rm -rf /usr/local/mysar/www/install
6.使用指令vi /usr/local/mysar/bin/mysar-importer.php打開mysar-importer.php檔案(注:該檔案的作用是讀取Squid的日志檔案/var/log/squid/access.log,并對日志進行分析,然後将相應的資料寫入資料庫中),并在134行插入以下紅色三行代碼,用于判斷通路的目的主機是否為網内主機(該處假設網内目的主機為IP位址192.168.*.*),如果為網内目的主機,則通路流量不進行統計。找到語句“debug('Record received: ',40,__FILE__,__LINE__);”在該語句前插入如下語句。
$test_head=preg_split("[//]",$record[6]);
if (substr($test_head[1],0,7)=="192.168")
{continue 1 ;}
7.使用指令vi /usr/local/mysar/etc/mysar.cron打開檔案mysar.cron,并在檔案末尾添加語句“01 1 * * * root squid -k rotate”,使Squid的日志每天循環儲存一次(注:由于MySAR是通過分析Squid日志的方法來統計流量的,如果日志檔案太大會降低MySAR的運作效率,同時也可能使統計出錯)。然後再使用指令crontab /usr/local/mysar/etc/mysar.cron設定自動作業,這時就可以通過通路http://伺服器IP位址或域名/mysar/檢視使用者使用Squid代理伺服器通路外網的情況了。
第五步:編寫C程式用于執行iptables指令。
出于安全上的考慮,PHP程式預設情況下是不允許直接調用Linux系統指令的,是以通過該C程式來間接調用iptables指令可以在很大程度上保護伺服器的安全。具體程式源代碼如下。
#include <stdio.h>
#include <getopt.h>
#include <unistd.h>
int main(int argc ,char *argv[])
{int optch;
while( (optch = getopt( argc , argv , "ad" ) ) != -1 )/*分析指令行參數*/
{switch( optch ) {
case 'd':
execlp("iptables","iptables","-I","INPUT","-s",argv[2],"-j","DROP",(char *) 0 );
break;/*設定iptable規則,禁止使用者通路伺服器*/
case 'a':
execlp("iptables","iptables","-D","INPUT","-s",argv[2],"-j","DROP",(char *) 0 );
break;/*删除iptable規則*/
default: printf("error \n");} }}
1.編寫完成後以.c為字尾名儲存檔案(本例檔案名為uip.c),然後再分别使用gcc -c uip.c –o uip
2.使用指令chmod u+x uip修改程式uip的執行權限,使PHP程式能夠調用它。
第六步:編寫PHP程式mysar.php用于管理代理使用者。
#!/usr/bin/php
<?php
$link = mysql_connect("localhost", "root", "ygjalarm");
//mysql_connect(伺服器名,mysql使用者名,mysql密碼)
if (!$link) {die('Could not connect: ' . mysql_error());
exit;}
mysql_select_db("mysar",$link);
$result = mysql_query("select traffic.ip, hostnames.hostname,sum(traffic.bytes) from traffic,hostnames where traffic.ip=hostnames.ip and hostnames.usr_iptables=0 group by traffic.ip");
if (!$result) {
die("query failed: " . mysql_error());
}
//彙總每個使用者的流量,并得到該使用者的IP位址資訊
while ($row = mysql_fetch_array ($result)) {
if($row["sum(traffic.bytes)"]>= 107374182400)
{system('./uip -d '.$row["hostname"]);
$usr_update= mysql_query("update hostnames set usr_iptables=1 where hostname='".$row["hostname"]."'");}}
//判斷使用者的總流量是否大于107374182400B,如果大于則調用c程式設定iptables規則,禁止使用者通路代理伺服器
?>
該程式通過統計資料庫中代理使用者的流量資料判斷是否超出限制,如果超出則調用c程式設定iptables規則,禁止使用者通路代理伺服器。
注意事項:
1. cron計劃任務裡應該包括以下幾項:
*/5 * * * * /usr/local/mysar/bin/mysar-resolver.php > /usr/local/mysar/log/mysar-resolver.log 2>&1
*/5 * * * * /usr/local/mysar/bin/mysar-maintenance.php > /usr/local/mysar/log/mysar-maintenance.log 2>&1
*/5 * * * * /usr/local/mysar/bin/mysar-importer.php > /usr/local/mysar/log/mysar-importer.log 2>&1
*/5 * * * * /usr/local/mysar/bin/mysar-ip.php > /usr/local/mysar/log/mysar-ip.log 2>&1
01 1 * * * root squid -k rotate
2.在頁面安裝 mysar資料庫時,可能會報錯,會提示手動建立:
config.ini檔案需要重新建立才行。否則報錯找不到config.ini檔案。
2. 第一次啟動mysqld時,如果報錯:
101020 15:21:29 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295
解決方法:
#echo “max_join_size=4294967295”>>/etc/my.cnf
#mysql -uroot -p
mysql> select @@max_join_size;
+-----------------+
| @@max_join_size |
| 4294967295 |
1 row in set (0.00 sec)
再重新開機mysqld服務即可:
# service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
總結:
通過以上六個步驟的設定,解決了基于Linux系統代理伺服器Squid的計費與流量控制。不僅有效掌握了使用者的上網情況,而且實作了對大量占用網絡帶寬的使用者的有效的控制。
本文轉自vcdog 51CTO部落格,原文連結:http://blog.51cto.com/255361/837788,如需轉載請自行聯系原作者