2018年4月4日星期三

用 Heavy Hitter Filter (HHF) qdisc 有效解决多线程下载软件霸占网速问题

  多线程下载软件,例如迅雷和IDM,在有效提升下载速度、压榨下行全部潜力的同时,也给其他网络活动带来了灾难性的后果。BBR拥塞控制算法的使用,更使得本来狭小的网络空间变得缓慢不堪。一旦局域网内一个用户开始下载,其他用户的网页浏览都将受到严重影响,甚至一分钟都无法显示网页首屏,体验十分糟糕。
  fq_codel、pie、cake等调度器的使用,在一定程度上缓解了这种情况,但并不能解决多线程下载软件和BBR的“强势进攻”。即使提高丢包率(如降低target,提高αβ),也无法降低对正常的网络活动的影响。若能有这样一个调度器,能把大流量下载流量和正常流量区分开来,并给予正常流量极大的优先级,将会极好地解决这一问题。
  Heavy Hitter Filter (HHF) 的诞生,解决了大流量和小流量的区分问题。在一系列参数的控制下,HHF能够自动地把大流量连接和正常流量连接区分开来,分配到两个队列中,并赋予不同的传输优先级,具体介绍可以看这里

HHF的关键参数介绍:
  1. reset_timeout:重置计数器的间隔时间,HHF以一个间隔时间内连接传输的流量为标准来判断该连接是否为大流量连接。默认为40ms。
  2. hhf_admit_bytes:将连接分类为大流量连接的阈值。默认为131072Bytes(128KBytes)。
  3. non_hh_weight:正常流量的权重。默认为2(2:1)。设置为1000以上时对霸占网速的连接遏制有良好的效果
当连接速度超过hhf_admit_bytes/reset_timeout时(默认参数下为128KB/40ms=25.6Mbps),该连接即被分类为大流量连接。若要设置为速度大于1Mbps时连接被定义为大流量连接,可将hhf_admit_bytes设为1Mbps×40ms=5120Bytes。

最后的命令,与htb配合使用:
tc qdisc add dev $dev parent x:y hhf limit 1024 non_hh_weight 1000 admit_bytes 5120

2017年10月30日星期一

解决自编译pdnsd在Padavan下无法将缓存保存到硬盘上的问题

最近为了IPV6 DNS的需求自己编译了一份pdnsd,thread-lib选择的是NPTL。发现在Padavan下出现了无法保存缓存到硬盘上的问题,结合帮助文档以为是NPTL的问题,遂换成LinuxThread重新编译,结果照旧。
于是分析pdnsd的源代码,首先从处理缓存的cache.c源代码入手,找到read_disk_cache()函数,发现如下代码:
  if(memcmp(buf,cachverid,sizeof(cachverid))) {
   log_warn("Cache file %s ignored because of incompatible version identifier",path);
   goto free_data_fclose;
  }
结合日志中出现了这样一条错误信息,初步认为是pdnsd.cache文件开头少了“pd13”,加上后,查看除错日志,没有报错,但仍旧无法保存。
继续研究代码,发现write_disk_cache()函数,这个函数实现了把缓存写入硬盘的功能。回到main.c,来到这行代码:

 if(sig) DEBUG_MSG("Signal %i caught.\n",sig);
 write_disk_cache();

这个函数被执行的条件是sig不等于0。突然想起平时结束进程用的都是 kill -9(强制终止),怀疑是进程没有接收到信号就被终止了。于是将9改成15,果然缓存能够保存到硬盘上了。

2017年2月23日星期四

Padavan固件定时命令改变信号强度,夜间节能

  利用cron定时命令,实现夜间路由器无线信号自动降低功率,节能环保。

  • 2.4G
    nvram set rt_TxPower=100 && nvram commit
  • 5G
    nvram set wl_TxPower=100 && nvram commit

  其中100是信号强度,范围0-100。

2017年2月4日星期六

交叉编译适用于Padavan的Transmission 2.92

  Padavan路由器固件自带的Transmission版本比较老旧,为了使用新特性,可以自行编译transmission使用。
  使用Padavan提供的toolchain编译Transmission之前,需要先编译以下几个依赖
  其中openssl使用1.1.0编译会报错,不知是什么原因,故使用1.0.2版本进行编译。也可以用polarssl代替openssl,但性能会有所损失。
  编译libevent和curl,执行以下命令(toolchain目录自行修改):
./configure --host=mipsel-linux-uclibc --prefix=/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x
  编译zlib,需用export CC=mipsel-linux-uclibc-gcc指定gcc编译器。
  编译openssl,执行以下命令
./Configure no-asm shared --prefix=/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x linux-mips32
  然后手动修改Makefile,找到以下部分,按如下所示修改
CC= mipsel-linux-uclibc-gcc
AR= mipsel-linux-uclibc-ar $(ARFLAGS) r
RANLIB= mipsel-linux-uclibc-ranlib
NM= mipsel-linux-uclibc-nm
  编译transmission,需要指定lib和include所在位置,执行以下命令
./configure OPENSSL_LIBS="-L/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib -lcrypto -lssl" OPENSSL_CFLAGS="-I/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include/" LIBCURL_LIBS="-L/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib -lcurl " LIBCURL_CFLAGS="-I/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include/" LIBEVENT_LIBS="-L/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib" LIBEVENT_CFLAGS="-I/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include" --enable-lightweight --prefix='/opt/transmission-binaries/' --with-zlib=/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/ LDFLAGS="-L/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib -levent -ldl" --disable-nls --without-gtk --host=mipsel-linux-uclibc
  configure成功后,执行 make && make install,完成生成可执行文件。如果在make的时候出现"undefined reference to"错误,说明没有正确指定lib和include所在位置,执行make distclean,检查目录是否正确,然后重新configure。
  生成的可执行文件体积非常大,用 mipsel-linux-uclibc-strip * 减小体积,可减小到450KB左右。

2016年12月9日星期五

利用路由器iptables实现家长控制定时断网

iptables -I FORWARD -m mac --mac-source 00:00:00:00:00:00 -m time --timestart 22:00 --timestop 7:00 --days Mon,Tue,Wed,Thu,Fri -j DROP
mac-source后的地址改为被控制的客户端的MAC地址,时间的起始自由设定,上面为晚上十点到早上七点禁止上网,周一到周五生效。

改变路由器DNS服务端口而不影响对内网正常DNS服务的方法

  在“绕过校园网无线认证,实现免账号上网”一文中,有一个步骤为设置OpenVPN端口为53。而我们知道,DNS服务器的端口也是53。如果不改变DNS服务器的端口,就无法将OpenVPN的端口成功设置为53。然而在修改dnsmasq配置文件将DNS服务端口改为5353后,内网无法正常解析DNS,因为没有做对应的端口映射。
  只需下面两条命令,即可让内网机器正常解析DNS。其中5353为修改后的DNS端口,192.168.1.1为路由器的IP地址。
iptables -t nat -A PREROUTING -d 192.168.1.1 -p udp --dport 53 -j DNAT --to 192.168.1.1:5353
iptables -t nat -A PREROUTING -d 192.168.1.1 -p tcp --dport 53 -j DNAT --to 192.168.1.1:5353

2016年11月26日星期六

解决校园网在Padavan路由器固件下客户端IPV6网络访问的问题

适用条件
  1. 路由器能够获得原生IPV6地址
  2. 上网需要通过锐捷认证(访问IPV6无需认证可用三个命令解决
步骤
  1. 进入路由器管理界面,外部网络 (WAN) - IPv6 设置
  2. USB 应用程序 - 其他设置:允许运行 Optware:选Entware
  3. 准备一个NTFS/EXT4格式的U盘或TF卡(依路由器而定),并在根目录新建一个文件夹命名为opt
  4. 将存储介质连上路由器,查看路由器日志,若出现“Entware:Congratulations”,则表示opt环境配置完成。
  5. 登录路由器SSH,执行以下命令:
    opkg update;opkg install 6relayd
  6. 运行6relayd:
    /opt/sbin/6relayd -d -A eth2.2 br0
    eth2.2对应WAN口,br0表示整个内网,可用ifconfig查看它们对应的名称,一般不用改变。 
  7. 自定义用户脚本,使6relayd开机自动启动:自定义设置 - 脚本 - 在路由器启动后执行:
    /opt/sbin/6relayd -d -A eth2.2 br0
    logger -t "【IPV6】" "6relayd 启动完成"
缺点

  6relayd的缺点很明显,就是一段时间不走IPV6流量后,就需要重新获取IPV6地址才能继续使用IPV6(可用一个命令解决)。对于校园网最好的解决方法就是刷OpenWRT最新版本,用IPV6 NAT实现内网对IPV6的访问。

参考