linux下使用iptables和tc限制速度

linux下使用iptables和tc限制速度的方法,记录一下。假设本地搭建了PPTPD服务,又或者有多个网卡,需要对其中一些接口做限速处理的情况,非常有用,本文基于CentOS 6.4 64bit。

1,初始配置

yum install /sbin/tc

vim /etc/sysctl.conf
修改net.ipv4.ip_forward = 1
sysctl -p

#清除原来的mangle表规则
iptables -t mangle -F

#加载sch_htb模块
modprobe sch_htb
echo "modprobe sch_htb" >> /etc/rc.local

2,TC限速设置

假设现在有两块网卡
eth0: xx.xx.xx.xx(外网的上网地址)
eth1: 172.16.44.1(做为内网的网关) 继续阅读

CentOS 6使用mutt+msmtp发送邮件

CentOS系统下如果希望向外域发送邮件,需要配置sendmail+dovecot等一系列工具。其实不用这么麻烦,只要mutt+msmtp就可以实现向外域发送邮件的功能了。本文基于CentOS6 64bit。

1,安装配置msmtp

$ yum install gcc gcc-c++ gnutls gnutls-devel gnutls-utils openssl openssl-devel libidn libidn-devel -y
$ wget http://sourceforge.net/projects/msmtp/files/msmtp/1.4.32/msmtp-1.4.32.tar.bz2
$ tar -jxvf msmtp-1.4.32.tar.bz2
$ cd msmtp-1.4.32
$ ./configure --prefix=/usr/local/msmtp
$ cd msmtp-1.4.32
$ make && make install

$ mkdir /usr/local/msmtp/etc

生成配置文件

$ cat >>/usr/local/msmtp/etc/msmtprc<<EOF

直接复制以下内容粘贴在>号的位置即可 继续阅读

Win7系统下修改MTU值

MTU是通讯的两个设备间的协定,PC和路由LAN口之间有一个协定的MTU,路由WAN口和ISP之间又协定另一个。在PC与LAN之间的MTU应该小于等于WAN与ISP的MTU值,否则部分DF的大数据包会被丢弃,部分TCP应用会受到影响。很明显的表现就是:能打开一部分网页,QQ能正常登陆,但却有大量网站无法访问。但如果前者太小,一样能正常通讯,只不过会降低通讯效率(表现为网速慢一点)。

测试封包是否合适:
ping -f -l 1472 www.baidu.com

如果出现信息:Packet needs to be fragmented but DF set,那就表示封包值太大了!而如果出现:Reply from xx.xx.xx.xx: bytes=1472 time

在 Ping 测试中得到最大的封包大小,然后加上 28 。加上 28 byte 是因为 20 byte 是保留给 IP 标头, 8 byte 是给 ICMP 回应要求标头。记住!您必须为 Ping 测试结果加上 28 !

例如:
Ping 测试的最大封包大小是 1440
+ 28 IP 和 ICMP 标头
1468 就是您的最佳 MTU 设定。

查看本机MTU值:
netsh interface ipv4 show subinterfaces

修改本机MTU值:
netsh interface ipv4 set subinterface "无线网络连接" mtu=1460 store=persistent

注意:命令中的“无线网络连接”是连接的名字,每台电脑可能不一样,需要用上一条命令确定连接的名字。

参考资料:
http://www.tp-link.tw/FAQ-190.html

shell之if语句常见错误

以下是一个错误的if语句

#!/bin/bash
oldversion=b3-cdrom
function test()
{
    if [ ! `df -h | grep $oldversion` ]; then
        echo found.
    fi
}
test

以下都是正确的:

#!/bin/bash
oldversion=b3-cdrom
function test()
{
    if [ ! "`df -h | grep $oldversion`" ]; then
        echo found.
    fi
}
test

加双引号引起来就正确了……

下面这个也是正确的:

#!/bin/bash
oldversion=3
function test()
{
    if [ ! $oldversion ]; then
        echo found.
    fi
}
test

shell之按行取文件(及查找失效链接)

shell之按行取文件的三种方法,记录一下。

写法一:

#!/bin/bash
while read line
do
echo $line
done < filename(待读取的文件)

写法二:

#!/bin/bash
cat filename(待读取的文件) | while read line
do
echo $line
done

写法三:

for line in `cat filename(待读取的文件)`
do
echo $line
done

继续阅读

批量下载Linux Kernel版本,并对本地的Kernel进行比较

自己写的一个批量下载Kernel.org版本,并对本地的Kernel进行比较的脚本。记录一下吧。

自己部门6年前维护的一个kernel版本,只知道是基于kernel 2.6版本,却不知道是基于2.6.x版的。于是乎,写了这么个脚本,批量把2.6.x的所有版本全部下载回来,使用diff一一进行比对(导出到conclusion/diff-2.6.x-and-k2.txt文件中),并将所有版本的diff结果进行分析,再将分析数据导出到conclusion/all.txt中。

在conclusion/all.txt中,第一列是diff时官方的版本号,第二列是diff结果(conclusion/diff-2.6.x-and-k2.txt)的行数。重点在于第二列,这些数字中最小的那一个所对应的版本号,应该就是我部门维护的kernel的详细版本号了。

#!/bin/bash
for i in `seq 0 39`
do
    echo donwloading https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.$i.tar.bz2
    wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.$i.tar.bz2
    for a in `seq 1 57`
    do
        echo downloading https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.$i.$a.tar.bz2
        wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.$i.$a.tar.bz2
    done
done

if [ ! -d conclusion ]; then
    mkdir conclusion
fi

for file in `ls linux-2.6.*.tar.bz2`
do
    dirname=${file%.tar*}
    version=${dirname##*-}
    echo $dirname
    echo $version
    tar -jxvf $file
    diff -r $dirname k2_os-kernel-2.6.28.10 > conclusion/diff-$version-and-k2.txt
    rm -rf $dirname

    stat=`cat conclusion/diff-$version-and-k2.txt | wc -l`
    echo $version '        ' $stat >> conclusion/all.txt
done

count=`awk -F ' ' '{print $2}' conclusion/all.txt | sort -n | head -1`
version=`cat conclusion/all.txt | grep $count$ | awk -F ' ' '{print $1}' $line`
echo '' >> conclusion/all.txt
echo The shortest diff is $count, which kernel version is $version >> conclusion/all.txt

Nginx配置索引(目录浏览),美化索引页面,配置目录密码保护

本文演示了为Nginx配置索引(目录浏览),美化索引页面,配置目录密码保护的全部过程,全部完成以后的效果如http://soft.vpser.net/所示。

1,安装Nginx,并加入FancyIndex插件
FancyIndex是一个美化插件,可以引入自定义HTML内容用于美化索引页面。如果仅仅需要开启目录浏览而不需要美化,可以不引入此插件。

$ yum install gcc gcc-c++ make openssl openssl-devel

$ wget http://sourceforge.net/projects/pcre/files/pcre/8.33/pcre-8.33.tar.gz
$ tar -zxvf pcre-8.33.tar.gz
$ cd pcre-8.33
$ ./configure
$ make && make install
$ cd ../

$ groupadd www
$ useradd -s /sbin/nologin -g www www
$ git clone https://github.com/aperezdc/ngx-fancyindex.git ngx-fancyindex

$ wget http://nginx.org/download/nginx-1.6.0.tar.gz
$ tar zxvf nginx-1.6.0.tar.gz
$ cd nginx-1.6.0/
$ ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=../ngx-fancyindex
$ make && make install
$ ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

$ git clone https://github.com/ixbear/nginx
$ mv nginx/nginx.conf /usr/local/nginx/conf/
$ mv nginx/init.d.nginx /etc/init.d/nginx
$ chmod +x /etc/init.d/nginx
$ chkconfig --level 345 nginx on
$ /etc/init.d/nginx start

继续阅读