3月 23

脚本放入crontab不能运行

【整理:张子萌】

linux下编写shell脚本,手动运行正常,但是放到crontab中,就不能正常运行了,这是环境变量的问题。即使使用同一个账户,手动登陆和crontab自动运行所加载的环境变量也是不同的。

有两种方法可以解决:

1. 比较简单,应该在shell编写时就注意。

在shell脚本的头部添加”. $HOME/.bash_profile”(要注意前面有个点,点后面是空格,之后是环境变量位置)。

也可以直接写环境变量的绝对位置。如test用户的根目录在/home/test下可以在shell头部添加”. /home/test/.bash_profile”

2.比较紧急情况,再确认可以手动执行脚本情况下,可以使用另一种方法。使用root权限调用shell脚本。

如果有/home/test/test.sh需要每分钟运行一次,可以使用root登陆,在root的crontab中添加如下:

# crontab -e

*/1 * * * * /home/test/test.sh

3月 21

linux 简单搭建vpn服务器

[整理 :张子萌 如有转载请保留整理人信息]

测试系统为redhat linux

搭建pptpd VPN服务需要内核支持mppe,内核为2.6以后的内核支持该选项。

查看内核命名# uname -r。注意:如果要远程安装调试,首先将防火墙设置为

不随操作系统启动。

1. 需要安装ppp和pptp服务,本文为使用yum安装。如果希望手动安装请到

http://poptop.sourceforge.net下载pptp源码包。

#yum -y install ppp

#yum -y install pptpd

查看内核是否加载 mppe 模块

# lsmod | grep ppp

如下图:

linux 简单搭建vpn服务器   - simon-zzm - simon个人观点

说明pptp 所又模块加载成功

2. 修改配置文件

安装完成后修改配置文件

2.1 配置pptpd.conf文件

#vi /etc/pptpd.conf

option /etc/ppp/options.pptpd # PPP使用的配置文件位置

stimeout 10 # 控制pptp连接超时,单位为秒

localip 192.168.0.1 # 服务器VPN虚拟接口将分配的IP地址

remoteip 192.168.0.234-238,192.168.0.245 # 客户端VPN连接成功后将分配的IP或IP地址范围。

说明localip和remoteip 不需要必须在同一网段,网络可以连通网段均可。

2.2 配置options.pptpd文件,此处只是对配置文件中部分配置做说明,如无特殊要求可以使用默认配置。

# vi /etc/ppp/options.pptpd

lock

auth # 启用身份验证

name cc3 # 相当于身份验证时的域,这里填上VPN服务器的名字

refuse-pap # 拒绝pap身份验证

refuse-chap # 拒绝chap身份验证

refuse-mschap # 拒绝mschap身份验证

refuse-eap # 拒绝eap身份验证

require-mschap-v2 #使用mschap-v2身份验证,使用windows可以直接建客户端

require-mppe-128 # 要求128位MPPE加密

nomppe-stateful # 无状态,有状态有mppe-stateful

ms-dns 202.106.46.151 # VPN客户端连接成功后将被分配的DNS参数,如只是ip访问可以不用此项

ms-wins 64.32.16.8 # VPN客户端连接成功后将被分配的WINS参数

proxyarp # 启用ARP代理

2.3 创建用户名和密码,可以再文件中直接编写,也可以使用命令创建。推荐使用命令创建。

2.3.1 创建用户

账户为vpntest 密码为123

#vpnuser add vpntest 123

2.3.2 删除用户:

删除 vpntest账户

#vpnuser del vpntest

2.3.3 查看当前用户表

# vpnuser show

2.3.4 直接文件编辑修改账户

#vi /etc/ppp/chap-secrets

格式如下

test pptpd 123 *

注:末尾“*”为分配给vpn客户端ip池的地址,也就是上面设置的remoteip部分。如需要分配指定IP,可以直接打入IP地址。

3. 启动pptpd服务

#service pptpd start

# /etc/init.d/pptpd start

pptpd参数有start|stop|restart|restart-kill|status,分别为启动、停止、重启、直接杀进程后重启、查看进程运行状态。

要查看连入vpn服务器的客户端信息,可以使用route命令,Use Iface列为ppp的为连入vpn服务器的客户信息。也可以使用ifconfig查看。

到此linux pptp vpn配置完成,可以使用windows来连接看看是否正常。

4. 安全防范

VPN使用GRE协议用的47端口 也需要开放 1723,如果使用防火墙需要添加如下配置。

#i ptables -A INPUT -p gre -j ACCEPT

如果开启selinux 还需要设置

#setsebool pppd_disable_trans 1

#setsebool pptp_disable_trans 1

如果客户端想用vpn server来上网的话,需要打开vpn server上的ip_forward

# echo “1” > /proc/sys/net/ipv4/ip_forward

永久更改:

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 0 将 0 改为 1

保存后运行# sysctl –p 是参数生效。

设置ip伪装

#iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source XXX.XXX.XXX.XXX (vpn 服务器公网ip)

#iptables -t nat -A FORWARD -o eth0 -j ACCEPT

如果还想访问vpn server所在的局域网,还需要在vpn server上添加路由

* 使用route 命令配置路由表 */

//添加到主机路由

# route add –host 192.168.168.110 dev eth0:1

# route add –host 192.168.168.119 gw 192.168.168.1

//添加到网络的路由

# route add –net IP netmask MASK eth0

# route add –net IP netmask MASK gw IP

# route add –net IP/24 eth1

//添加默认网关

# route add default gw IP

//删除路由

# route del –host 192.168.168.110 dev eth0

5. 常见问题处理

a) MGR: Maximum of 10 connections reduced to 3, not enough IP addresses given

说明配置文件中最大连接为10,但是只分配了3个地址。通过/etc/pptpd.conf配置文件修改

b)连接vpn后经常断线
pppd[18052]: Terminating on signal 15
pppd[18052]: Modem hangup
pppd[18052]: Connect time 1.0 minutes.
pppd[18052]: Sent 12143 bytes, received 4968 bytes.
pppd[18052]: MPPE disabled
pppd[18052]: Connection terminated.
pppd[18052]: Exit.

查看日志发现以上信息:

“Connect time 1.0 minutes.”说明用户连接vpn服务器后只连接了1分钟就断开了。

“Sent 12143 bytes, received 4968 bytes.”说明客户在连接后与vpn服务器间的传输量也不大。如

果流量过大,需要注意检查是否存在攻击。

“Terminating on signal 15”此条信息比较主要,说明vpn程序是被系统其它程序发出停止命令后强行

中断连接的。具体信号可以查看http://simon-zzm.blog.163.com/blog/static/8880952220103110240877/

3月 18

mysql 主从服务器数据同步

[整理:张子萌 2009-10-12]

操作系统:CentOS

数据库版本:mysql-5.1.44-linux-i686-glibc23.tar.gz

A服务器: 192.168.1.100 主服务器(master)

B服务器: 192.168.1.101 从服务器(slave)

主副服务器安装比较简单,此处只列安装顺序的命令。

详细操作可以见http://simon-zzm.blog.163.com/blog/static/88809522201028104721790/中mysql部分。

1. mysql安装

在主从服务器上做以下操作。

# groupadd -g700 mysql

# useradd -g700 -u700 mysql mysql

# tar zxvf mysql-5.1.44-linux-i686-glibc23.tar.gz

# cp mysql-5.1.44-linux-i686-glibc23 /usr/local/mysql

# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

# chown -R mysql:mysql /usr/local/mysql

2. 配置主服务器

2.1 登录主服务器。初始化数据库,并启动

# /usr/local/mysql/scripts/mysql_install_db –user=mysql

–basedir=/usr/local/mysql –datadir=/usr/local/mysql/data

# /etc/init.d/mysql start

2.2 连接数据库,并创建所使用的库。本文为了测试创建名为testas的数据库

# /usr/local/mysql/bin/mysql -u root

mysql> create database testas;

Query OK, 1 row affected (0.03 sec)

2.3 创建从服务器同步主服务器时使用的账户。账户名为slavetest,密码为123;

Mysql>grant replication slave,reload,super on *.* To

slavetest@192.168.1.101 identified by ‘123’ ;

Mysql> flush privileges;

2.4 停止mysql数据库

# /etc/init.d/mysql stop

2.5 使用系统拷贝命令将主服务器的已经创建的数据,拷贝到备用服务器上。

# scp r /usr/local/mysql root@1192.168.1.101:/usr/local/mysql

注: 向备机传送备份数据库有两种方法。
a)备份数据直接将data目录需要备份数据库的文件夹传到备份数据中。
b)使用MySQLdump的方式来备份主数然后导入备库中(备份时加上”–master-data “参数)。
本文使用第一种方法来备,也建议使用第一种。如果是不能停机,则将主数据库进行锁库后在进行备份操作。
数据库锁定:
FLUSH TABLES WITH READ LOCK;
数据库打开:
UNLOCK TABLES;

2.6 修改主服务器的配置文件。在/etc/my.cnf文件[mysqld]后添加两个参数。第一个是

server-id=master_id,master_id的值为1到2^32-1之间的正整数,推荐使用1。第二个是

选择添加skip-name-resolve,如果开启远程访问,可以防止远程连接失败。

# vi /etc/my.cnf

修改后结果[mysqld]部分,部分截图如下:

2010年3月18日 - simon-zzm - simon个人观点

2.7 启动数据库,记录同步数据的点。

# /etc/init.d/mysql start

# /usr/local/mysql/bin/mysql -u root

mysql> show master status;

获得数据如下图:

2010年3月18日 - simon-zzm - simon个人观点

请记录file和Position的值,在配置从服务器中需要用到。

3. 开始配置从服务器

3.1 登录从服务器,修改从主服务器上所传文件的权限

# chown -R mysql:mysql /usr/local/mysql

3.2 修改配置从服务器的文件。在/etc/my.cnf文件[mysqld]后添加slave_id 的值是 1 到 2^32-1 之间的正整数,这个值一定不能与主服务器中master_id一样。推荐值为2。

# vi /etc/my.cnf

修改后结果[mysqld]部分,部分截图如下:

2010年3月18日 - simon-zzm - simon个人观点

3.3 启动从数据库

# /etc/init.d/mysql start

3.4 编辑sql(使用组服务器上记录的数据),登录数据库后运行sql。

Sql 编写如下:

CHANGE MASTER TO

MASTER_HOST=’192.168.1.100′,

MASTER_USER=’slavetest’,

MASTER_PASSWORD=’123′,

MASTER_LOG_FILE=’mysql-bin.000004′,

MASTER_LOG_POS=106 ;

如下图:

2010年3月18日 - simon-zzm - simon个人观点

3.5 启动从服务器同步服务

mysql> slave start;

4. 服务器配置完成,可以连到主服务器上,创建表、添加数据后,再看从数据库是否也有相同数据。如果数据相同,则配置成功。

注意:为了安全日常登录和操作最好不要使用root用户。不可以在从数据库中修改数据,最好将从数据库连接账号的权限修改为只读。

5. 登录主从数据库使用命令查看当前状态

5.1 登录从服务器,查看当前I/O情况

mysql> show slave statusG

Connecting to master

该线程证尝试连接到master上。

Checking master version

确定连接到master后出现的一个短暂的状态。

Registering slave on master

确定连接到master后出现的一个短暂的状态。

Requesting binlog dump

确定连接到master后出现的一个短暂的状态。该线程向master发送一个请求,告诉它要请求的二进制文件以及开始位置。

Waiting to reconnect after a failed binlog dump request

如果二进制日志转储(binary log dump)请求失败了(由于连接断开),该线程在休眠时进入这个状态,并定期重连。重连的时间间隔由

–master-connect-retry 选项来指定。

Reconnecting after a failed binlog dump request

该线程正尝试重连到master。

Waiting for master to send event

已经连接到master,正等待它发送二进制日志。如果master闲置时,这个状态可能会持续较长时间,如果它等待超过 slave_read_timeout 秒,就会发生超时。这时,它就会考虑

断开连接,然后尝试重连。

Queueing master event to the relay log

已经读取到一个事件,正把它拷贝到中继日志中以备SQL线程处理。

Waiting to reconnect after a failed master event read

读日志时发生错误(由于连接断开)。该线程在重连之前休眠 master-connect-retry 秒。

Reconnecting after a failed master event read

正尝试重连到master。当连接确定后,状态就变成 Waiting for master to send event。

Waiting for the slave SQL thread to free enough relay log space

relay_log_space_limit 的值非零,中继日志的大小总和超过这个值了。I/O线程等待SQL线程先处理中继日志然后删除它们以释放足够的空间。

Waiting for slave mutex on exit

当前线程停止了,这个时间很短。

3月 16

squid 配置 和常用命令

【收集整理:张子萌 2009-11-2】

设置为缓荐服务器
cache_mem 30 M #内存使用大小。一般来说如果系统有内存,设置该值为(n/)3M。现在是3G 所以这里1G
cache_swap_low 90
cache_swap_high 95
max_open_disk_fds 0 #允许最大打开文件数量,0 无限制
minimum_object_size 0 KB #磁盘cache中最小的object的大小(低于这个值则不缓存)
maximum_object_size 20000 KB #磁盘cache中最大的object的大小(超过这个值则不缓存)
maximum_object_size_in_memory 4096 KB #装入内存缓存的文件大小,默认值是8K,超过8K的文件都不装入内存,可以在这里设成4M

cache_swap_low 90 #最小允许使用swap 90%
cache_swap_high 95 #最多允许使用swap 95%
cache_dir ufs /tmp1 10000 16 256 #磁盘缓存的类型和目录,大小,一二级目录的设置,这里磁盘缓存大小是10G
#ufs是一种文件存储方式 因为os一般都是从内存获取数据 那么内存的东西必须最后写的硬盘上
#sync 同步的时候用的ufs 那么squid也是一样
#ufs一般是同时写入内存和硬盘
#注意:size是按照M为单位的也就这个目录中最大存储容量的上限

acl QUERY urlpath_regex -i cgi-bin .php .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe #-i为不区分大小写
cache deny QUERY #设置不想缓存的目录或者文件类型

cache_mgr webmaster@test.com #管理员邮箱

###相关日志记录,可以设为none成不记录日志####
cache_store_log /var/log/squid/store.log
cache_log /var/log/squid/cache.log
access_log /var/log/squid/access.log combined

http_port 80 # squid监听的端口,客户访问网站的端口
httpd_accel_host ip_address # WEB服务器的IP地址
httpd_accel_single_host on # 设置转发为缓冲的请求到一台单独的机器
httpd_accel_port 81 # WEB服务器的端口
httpd_accel_uses_host_header off # 完成单台WEB服务器的反向代理功能
httpd_accel_with_proxy off # 停用代理
cache_peer www.XXXXX.com parent 80 0 no-query originserver name=www #定义不同的父节点,将节点设为no-query以及originserver说明这些节点是实际服务器
cache_peer_domain www.XXXXX.com #设定不同域名转发到不同的cache_peer上,如果没有这项.不同域名的域名可能被分发到同一台服务器上.
hierarchy_stoplist cgi-bin ? #用来强制某些特定的对象不被缓存,主要是处于安全的目的。

refresh_pattern . 0 20% 4320 override-expire override-lastmod reload-into-ims ignore-reload #更新cache规则
client_lifetime 120 minute #最大客户连接时间 120分钟
cache_mgr sky@test.com #指定当缓冲出现问题时向缓冲管理者发送告警信息的地址信息
request_entities off #禁止非http的标准请求,防止攻击
acl buggy_server url_regex ^http://…. http:// #只允许http的请求
# 设定可以访问的域名别名
acl HostA dstdomain www.XXXX.com
acl HostB dstdomain bbs.XXXX.com
# 加速器采用http协议在8000端口监听
acl acceleratedProtocol protocol HTTP
acl acceleratedPort port 8000
acl all src 0.0.0.0/0.0.0.0 #允许所有IP访问
acl manager proto http #manager url协议为http
acl localhost src 127.0.0.1/255.255.255.255 #允午本机IP
acl to_localhost dst 127.0.0.1 #允午目的地址为本机IP
acl Safe_ports port 80 # 允许安全更新的端口为80
acl CONNECT method CONNECT #请求方法以CONNECT
http_access allow all #允许所有人使用该代理.因为这里是代理加速web服务器
http_reply_access allow all #允许所有客户端使用该代理
acl OverConnLimit maxconn 16 #限制每个IP最大允许16个连接,防止攻击
http_access deny OverConnLimit
icp_access deny all #禁止从邻居服务器缓冲内发送和接收ICP请求.
miss_access allow all #允许直接更新请求
ident_lookup_access deny all #禁止lookup检查DNS

half_closed_clients off #半关闭状态的TCP连接,设为off,则一旦从客户端返回“no more data to read”的信息,squid就立即关闭该连接
refresh_pattern .htm 0 25% 8 #设置htm文件过期时间为10分钟

一些关于squid调试的命令:
1,初始化squid.conf 里配置的 cache 目录
#squid/sbin/squid -z
如果有错误提示,请检查 cache目录的权限。

2. squid.conf 排错,即验证 squid.conf 的语法和配置。
#squid/sbin/squid -k parse
如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。

3.在前台启动squid,并输出启动过程。
#squid/sbin/squid -N -d1
如果有到 ready to server reques,启动成功。
然后 ctrl + c,停止squid,并以后台运行的方式启动。

4.启动squid在后台运行。
#squid/sbin/squid -s
可以通过ps -ef|grep squid 来查看系统进程。

5.停止 squid
#squid/sbin/squid -k shutdown

6.重引导修改过的 squid.conf
#squid/sbin/squid -k reconfigure
修改squid.conf配置后,先检查配置文件是否正确,然后再执行此指令,即可让squid按新quid.conf 来运行。

7.把squid添加到系统启动项 编辑
/etc/rc.d/rc.local 添加如下行:
/usr/local/squid/sbin/squid -s

8.查看你的日志文档。
#more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中