存档

文章标签 ‘网络’

tc pfifio_fast及PRIO对没有filter的包的处理

2009年1月15日

看好多网站上的讲tc的教程都有类似下面的例子:
tc filter add dev eth0 protocol ip parent 2: prio 1 u32 match ip sport 23 0xffff flowid 2:1
tc filter add dev eth0 protocol ip parent 2: prio 2 flowid 2:2
后一句的本意是不符号上面各种filter的默认分到classid 2:2中去,可是实际我用的时候发现后一句被告知不能用(tc竟然没有–version参数,我也不知道是啥版本的)
看了一下文档,说不符合任何filter的包按classifier的root的默认分类发送,那这个“默认分类”是什么呢?
对于CBQ来说,它本身就是在搞复杂的分类,就不说了;这里只说简单的以频道分类的classifier:pfifo_fast的PRIO,默认来说这两个classifier建立的时候会生成3个band,然后也会有一个默认的priomap,形如:1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
这些数字是干什么用的呢,它们与IP包头的TOS字段有关,TOS字段一共4个bit,每个bit代表不同的特性,如果最高位是表示最小延迟,最低位是表示最小成本等。这4个bit一共能组合成16种TOS值,linux内核会根据这4个bit的TOS值给该包判定一个priority值(从0开始),这个priority值对应了priomap中相应位置的数字,每个数字就表示该TOS值将被默认地送往这个classifier的哪个band。
例如:对于什么标志都不带的包,TOS=0000b=0,linux会给它分配priority值0,对应priomap中的第1个数字――1,也就是说什么标志都没有的包装被送往band 1;对于telnet包,一般TOS=1000b=8,linux会给它分配priority值6对应priomap中第9个数字――0,就是说telnet包默认会被送到band0
对上述两个Classifier,band号越小,优先级越高,所以telnet包的优先级高于普通包,合理,嗯
下面列出linux内核会给各种TOS值分配什么样的priority,选自tc手册。
TOS     Bits  Means                    Linux Priority    Band
————————————————————
0×0     0     Normal Service           0 Best Effort     1
0×2     1     Minimize Monetary Cost   1 Filler          2
0×4     2     Maximize Reliability     0 Best Effort     1
0×6     3     mmc+mr                   0 Best Effort     1
0×8     4     Maximize Throughput      2 Bulk            2
0xa     5     mmc+mt                   2 Bulk            2
0xc     6     mr+mt                    2 Bulk            2
0xe     7     mmc+mr+mt                2 Bulk            2
0×10    8     Minimize Delay           6 Interactive     0
0×12    9     mmc+md                   6 Interactive     0
0×14    10    mr+md                    6 Interactive     0
0×16    11    mmc+mr+md                6 Interactive     0
0×18    12    mt+md                    4 Int. Bulk       1
0x1a    13    mmc+mt+md                4 Int. Bulk       1
0x1c    14    mr+mt+md                 4 Int. Bulk       1
0x1e    15    mmc+mr+mt+md             4 Int. Bulk       1
还有常见的协议的TOS值:
TELNET                   1000           (minimize delay)
FTP
        Control          1000           (minimize delay)
        Data             0100           (maximize throughput)
TFTP                     1000           (minimize delay)
SMTP
        Command phase    1000           (minimize delay)
        DATA phase       0100           (maximize throughput)
Domain Name Service
        UDP Query        1000           (minimize delay)
        TCP Query        0000
        Zone Transfer    0100           (maximize throughput)
NNTP                     0001           (minimize monetary cost)
ICMP
        Errors           0000
        Requests         0000 (mostly)
        Responses        <same as request> (mostly)
Classes
另,IP头中,TOS这4个bit再往高处3个bit的定义也叫priority,但是好像linux是根据tos的4个bit分配priority值,不是直接以这3个bit为准。(priomap是16个数字,如果是以这3个bit为准,就是8个了,呵呵)

技术 , ,

关于open-wrt下实现vpn客户端以及带动电脑从vpn上网的笔记

2007年6月3日

以下内容我是在Linksys WRT54G v2.0上实践的
安装open-wrt的主要文字可以看http://wiki.openwrt.org/OpenWrtDocs
首先当然是把它本来带的firmware刷成open-wrt,我用的是openwrt-wrt54g-squashfs.bin
我刷的方法是在他本来的web页面上上传的,其实保险起见应该把boot_wait开启,再这样做,但是web界面版本太新,我用了各种方法也没成功,就直接刷了,好在没失败。
然后要装一个webif^2(webif_latest_stable.ipk),因为本来自带的web页面功能太弱了。
基本设置我就不提了,然后就是安装一些与vpn有关的包,如下:

kmod-crypto_2.4.30-brcm-5_mipsel.ipk
kmod-mppe_2.4.30-brcm-5_mipsel.ipk
kmod-tun_2.4.30-brcm-5_mipsel.ipk
liblzo_2.02-1_mipsel.ipk
libopenssl_0.9.8d-1_mipsel.ipk
openvpn_2.0.9-1_mipsel.ipk
pptpd_1.3.0-1_mipsel.ipk

这些包我是装了cygwin,用scp命令传到路由上的。open-wrt默认是不带sftp的
pptp本身和普通电脑没什么区别,这里先介绍一open-wrt中与这部分相关的配置文件及脚本

在/etc/ppp/目录下,有peers.pptp和users.pptp两个文件,这是web界面下对pptp进行设置时保存的文件。
在/etc/init.d/
目录就下就启动时的脚本啦,有关的包括S35firewall, S90pptp,
S95custom-user-startup.其中S35firewall里就是很多iptables的命令,路由的设置主要就是由它决定的啦,
S35firewall还会调用到/etc/firewall.user,这里是由用户自行添加iptables命令的地方,不过我还是直接改动
S35firewall本身。
S90pptp则是启动VPN客户端的地方啦,它会按/etc/ppp/peers.pptp中的列表依次启动
VPN,这里有个功能让我耽误了好久。就是路由在启动的时候会根据上面提到的peers.pptp和users.pptp自动生成/etc/chap-
secrets和/etc/ppp/peers下的各文件,所以说你如果直接改动这些文件,下次启动时就又会被自动生成的文件内容覆盖,所以我只得把自己
编辑的上述配置文件存在/jffs下,然后在S90pptp启动VPN语句之前将他们cp到他们本应在的位置。路由自动生成的配置文件里要求mppe,我
把这一点给去掉了,我的pptp:XXXX如下:

pty “pptp 162.105.123.123 –nolaunchpppd”
#mppe required,stateless
name loudly
remotename vpn123
#file /etc/ppp/options.pptp
ipparam pptp:XXXX

usepeerdns

# do not require the server to authenticate to our client
noauth

lock
#noauth
refuse-eap
#refuse-chap
#refuse-mschap
nobsdcomp
#nodeflate

persist

另外,由于我要指定客户端的IP,还要改一下S90pptp中启动vpn的命令,也就是第一个循环中的runppp $peer那句,我改成了只针对XXXX的:

if [ $peer = BDWM ]; then
    pppd call pptp:XXXX 192.168.123.66: updetach
else
    runppp $peer
fi

至此,与vpn有关的部分就写完了

再说一下关于iptables的设置。
首先要设好路由,确定路由上接的电脑访问哪些地址直接走WAN口,哪些走vpn,这些设置可以写在S95custom-user-startup中,这里就不用帖出例子了。路由设好后,先在路由的shell下用wget试试对不对。
然后就是改S35firewall文件:
首先,为了允许转发从vpn走的包,在### FORWARDING段加入下面这行:

iptables -A FORWARD -i $LAN -o ppp0 -j ACCEPT

然后,再设置一下在vpn这条路径上的nat,在### MASQ段添加如下:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

最后的问题就是vpn是在S90中才建立的,S35执行时还没有ppp0呢,所以我把S35firewall改成S91firewall,就OK了。

然后把路由电源拔掉,再插上,让他全自动地执行一下上面的操作,看看能不能正常,bless~~~~
PS:vpn连不上时看log很重要,客户端及服务器端都要看,open-wrt的syslogd默认情况下是不写/var/log/messages文件的,要在www界面下的log页面中设一下让它这样做。

网络 , ,

简要介绍一下用nat支持内网被动ftp的方法

2007年4月1日

先做如下假设:
内网的FTP地址为192.168.1.100
做网关的机器,公网IP 1.2.3.4,内网IP 192.168.1.1

这里要求你的网关的机器的iptables必须支持监听ftp的内容,也就是有如下模块:
ip_conntrack_ftp ports及ip_nat_ftp,可以用modprobe来监测是不是有。
如果没有的话,你就得自己编译的啦,还会动到内核,挺麻烦,patpat

insmod ip_conntrack_ftp ports=21
insmod ip_nat_ftp ports=21

iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp –dport 21 -j DNAT –to 192.168.1.100:21

另外,如果你的内网有多个FTP主机,你可以在网关上开1021,2021两个端口用以映射,上面的ports=21写成ports=1021,2021这个形式,下面的iptables命令也相应写两份。

最后,你还应该在内网的FTP上设源地址路由,使其往公网的流量走网关机,就OK啦。

网络 , ,