CentOS下给pptp限速

其实PPP的配置文件里有一个限速的配置项,但该配置项在Linux系统下不起作用。因此只好从其它方向研究一下限速的办法了。本文在CentOS 6 64bit系统上测试成功。

假设已经安装好了pptpd,且pptpd的子网段是172.16.36.0/24。

1,准备工作

yum install /sbin/tc

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

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

2,限速设置

vim /etc/ppp/ip-up

在最后一行的exit 0上面,添加如下内容 继续阅读

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