• 极路由如何走到濒临破产:沿着悬崖奔跑 辉煌与沉寂后的思考

    转载自:https://www.cnbeta.com/articles/tech/753389.htm

    这些年智能硬件单品层出不穷,一些被上帝眷顾的技术大佬偶尔会因为一些生活中遇到的小问题,一言不合,就创造出一个属于自己的时代符号,极路由创始人王楚云就是这样一个人,而他选中的是智能路由器。

    2011年,王楚云在做微博营销,当时他经常被公司的宽带网络“贵”、“慢”两大问题所困扰,为解决这一问题,尝试过各种办法无果后,想到了“改装”路由器——在一台有USB口的路由器上刷Openwrt,将三大运营商的网络做负载均衡,新网络带宽神奇地从原来的1M变成了10M,而网费却由原来的1000元变成了600元,正是这一次的魔术手使得王楚云走上了他的创业之路。

    创业最艰难的就是构建核心团队,最初王楚云找来了大街网的前同事李恺,同为技术出身的李恺自然与其一拍即合,接着是曾在TP-Link带队研发过红极一时的WR-703N的张利鹏的加入,使得核心团队基本成型。至此,极路由三驾马车已到齐,产品研发开始进入正轨,而摆在未来的却是未知的考验。

    阅读更多…

  • 在OpenWrt中使用iptables过滤特定字符串

    当前的需求如下:需要选择性地过滤掉远程客户端向NAT下的服务器发送的特定请求。
    网络拓扑:Client—Internet—WAN–OpenWrt Router–LAN–Server

    经过实践,方法如下:

    # 安装iptables-mod-filter
    opkg update
    opkg install iptables-mod-filter
    
    # 丢弃包含 abcd 字符串的数据包
    iptables -I FORWARD 1 -p tcp -m string --string "abcd" --algo bm -j DROP
    iptables -I FORWARD 1 -p udp -m string --string "abcd" --algo bm -j DROP
    
    # 恢复正常
    iptables -L --line-numbers
    iptables -D FORWARD 1   # 这个1是刚才输出的对应序号

    在执行命令后,在LAN抓包,发现对应的数据包果然不见了,证明命令生效。再执行后续的命令,在LAN抓包,又可恢复正常的不丢包状态。

    对于其他网络拓扑,可把FORWARD链改为INPUT或OUTPUT。

  • 为OpenWrt/LEDE编译rpcapd 用于Wireshark远程抓包

    rpcapd是winpcap带的专门用来远程抓包的小工具,但是winpcap是给Windows用的,Linux下需要自己编译,如果要放到路由器上用,就要交叉编译了。

    以前编译都是直接在OpenWrt/LEDE的menuconfig里面选,现在不能选了,需要直接用toolchain手动编译。

    步骤如下:

    # 首先要把OpenWrt/LEDE的SDK下载或者编译出来
    # 以下的路径自行修改
    
    export PATH=$PATH:/root/lede/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16/bin
    export STAGING_DIR=/root/lede/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16
    
    export CC=mipsel-openwrt-linux-musl-gcc
    export CXX=mipsel-openwrt-linux-musl-g++
    export AR=mipsel-openwrt-linux-musl-ar
    export RANLIB=mipsel-openwrt-linux-musl-ranlib
    export ac_cv_linux_vers=4.4.61
    
    # 在https://www.winpcap.org/devel.htm 下载winpcap源码
    unzip source.zip
    cd winpcap/wpcap/libpcap
    chmod +x configure
    ./configure --build=x86_64-unknown-linux-gnu --host=mipsel-openwrt-linux --with-pcap=linux
    make
    
    # 在winpcap/wpcap/libpcap/pcap-int.h 里加上一行 #include <string.h> 否则在 strlcpy 处会报错
    cd rpcapd
    # 修改 Makefile
    # 修改编译器,改成CC=mipsel-openwrt-linux-gcc
    make
    
    file rpcapd
    # rpcapd: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-musl-mipsel-sf.so.1, not stripped

    相关参考:https://talpachen.github.io/2016/07/20/Net/rpcapd/

     

    附我编译的
      适用于LEDE(musl)的ar71xx版rpcapd:rpcapd_ar71xx.7z
      适用于LEDE(musl)的ramips版rpcapd:rpcapd_ramips.7z

  • OpenWrt USB挂载的一些备忘

    在挂载U盘时失败,dmesg提示找不到某些codepage,才知道这还和Native Language Support有关。

    要记得装上 kmod-nls-cp437、kmod-nls-iso8859-1、kmod-nls-utf8 这3个包。

    另外还有 kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-usb2 kmod-usb-storage kmod-usb-storage-extras block-mount kmod-fs-vfat kmod-fs-ntfs 等包。

  • 使用iptables模拟Symmetric NAT

    如果想让一个P2P程序不能穿透,比较好的办法就是把NAT类型改为对称型的,即Symmetric.

    之前以为NAT类型对于一个路由器是固定的,后来google到了使用iptables模拟的方法,当然Symmetric NAT也有很多不同的具体实现形式,这里模拟的是其中的一种。

    系统为OpenWrt,执行命令

    WAN_IF = “eth0”  # 你的WAN接口
    iptables -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE --random

    即可。

     

    测试的结果是,对于同一个LAN IP:Port,对不同的Dst IP,映射到的WAN Port会差异比较大;而如果只改Dst Port,端口增量不大,可能为1。

     

    相关参考:
    http://albert-oma.blogspot.bg/2013/12/nat-router.html

  • OpenWRT配置IPv6的NAT

    本人所在学校的IPv6因为各种原因(好吧其实是因为我不懂),默认情况下只能让路由器获得正常的IPv6访问,又或者是不用路由器直接接PC,PC可以正常使用IPv6。使用了路由器,下面的设备可以获取IPv6地址,可以通过IPv6 Ping通路由器,然而不能访问外网的IPv6地址。

    尝试过各种方案,如已经被OpenWRT抛弃的6relayd,还有ndppd和北邮的napt66(insmod之后路由就重启了),均失败。最后只能在路由器上架设代理,PC通过代理才勉强解决。

    今天偶然得知:ip6tables可以NAT IPv6,而且是相当久之前的功能了,怎么我之前就不知道呢 (;´д`)ゞ

     

    好了进入正题。

    首先我们需要在基于OpenWRT的路由器上安装两个kernel modules: kmod-ip6tables 和 kmod-ipt-nat6,如果提示内核版本不对,刷固件换内核吧。(自己编译固件就没这样的问题)

    之后,运行

    ip6tables -t nat -L

    如果有输出就说明NAT表可用。

    然后,在开机启动脚本上添加一行

    #有人说这样比较不优雅,其实也可以直接改LAN的配置
    ifconfig br-lan xxxx:xxxx:xxxx:xxxx::1/64

    其中,IPv6地址是路由器WAN6自动获取到的地址的前4段。

     

    之后是在 /etc/config/network 里删除 IPv6 ULA prefix。

     

    然后打开 /etc/config/dhcp ,config dhcp ‘lan’ 里改成类似这样:

    config dhcp 'lan'
        option interface 'lan'
        option start '100'
        option limit '150'
        option leasetime '12h'
        option ra 'server'
        option dhcpv6 'server'
        option ra_management '1'
        option ndp 'relay'

    最重要的应该是 option ra ‘server’ 和 option dhcpv6 ‘server’ 两行。(改成server或者hybrid)

    最后配置ip6tables。在 /etc/firewall.user 中加入

    ip6tables -t nat -I POSTROUTING -s xxxx:xxxx:xxxx:xxxx::/64 -j MASQUERADE  #其中的IP是LAN的前4段

    然后重启路由器,应该就OK了。

     

    相关参考:

    1. OpenWRT配置IPv6的NAT(一般结合isatap使用):https://blog.blahgeek.com/2014/02/22/openwrt-ipv6-nat/

  • OpenWrt使用无线网络桥接LAN与WAN

    先上图。最近我正要搭建一个类似上图的网络,我要从图中的LAN Host 1通过wifi访问图中的WLAN Client,其中两个无线路由器都运行OpenWrt。后来我找到了这篇文章。从中发现了来自OpenWrt Wiki的方法(上图也是取自此wiki),正好解决了这个问题。

  • Openwrt上通过ddns-scripts实现dnspod域名的基于ipv6的ddns

    上一篇文章中,我们通过ddns-scripts和一个外部的.php文件,实现了dnspod上的ipv4的ddns功能。

    最近有了ipv6的ddns的需求,于是在上文的基础上小改了一下,现在dnspod上的ipv6的ddns也没问题了。

     

    How?

    1.在上一篇文章的基础上,修改了一下dnspodupdate.php中的“’record_type’=>’A”为“’record_type’=>’AAAA’”,也可以直接下载:dnspodupdate6.zip,并上传到一个外网的空间上。

    2.修改路由器里的/usr/lib/ddns/dynamic_dns_functions.sh,把位于约75行的

    current_ip=$(ifconfig $ip_interface | grep -o 'inet addr:[0-9.]*' | grep -o "$ip_regex")
    

    改为

    current_ip=$(ifconfig $ip_interface | grep 'Global' | grep -o 'addr: [0-9a-f:]*' | cut -c7-)
    #我的grep和cut是现学现卖的,有没有更好的写法?
    

    不过这样一来,以“接口”来获取ip的就只能获取ipv6的地址了,如果要获取ipv4的地址,“”就选“网络”吧。

    3.打开/usr/lib/ddns/services,添加一行

    "dnspod.com_ipv6" "http://www.xxxxx.com/api/dnspodupdate6.php?username=[USERNAME]&password=[PASSWORD]&domain=[DOMAIN]&myip=[IP]"
    #注意这里的http://www.xxxxx.com/要改
    

    4.更改/etc/config/ddns的配置,service_name选dnspod.com_ipv6,再填上各种参数,这样就完成了~

  • 在Openwrt上搭建ipv6的OpenVPN服务器

    服务器端的配置

    安装OpenVPN软件

    opkg update
    opkg install openvpn openvpn-easy-rsa  #easy-rsa不一定要安装,我把easy-rsa的操作在PC上进行
    

     

    [important]下面的操作在Windows上进行,请先下载并安装Windows版的OpenVPN。如果你打算在路由上使用easy-rsa,对应的操作见文末参考来源的[/important]

    生成CA和各种证书

    修改 OpenVPN\easy-rsa\vars.bat.sample 为你的信息:

    set KEY_COUNTRY=CN
    set KEY_PROVINCE=Guangdong
    set KEY_CITY=Guangzhou
    set KEY_ORG=7forz
    set KEY_EMAIL=7f@7forz.com
    set KEY_CN=7forz
    set KEY_NAME=7forz
    set KEY_OU=7forz
    set PKCS11_MODULE_PATH=7forz.com
    set PKCS11_PIN=1234

     

    打开cmd,进入 OpenVPN\easy-rsa,运行以下命令:

    init-config

    vars

    clean-all

    build-ca (创建根证书)
    Country Name (2 letter code) [CN]:
    State or Province Name (full name) [Guangdong]:
    Locality Name (eg, city) [Guangzhou]:
    Organization Name (eg, company) [7forz]:
    Organizational Unit Name (eg, section) [7forz]:
    Common Name (eg, your name or your server’s hostname) [7forz]:
    Name [7forz]:
    Email Address [7f@7forz.com]:

    build-dh

    build-key-server server (服务器证书,server为机器名)
    Country Name (2 letter code) [CN]:
    State or Province Name (full name) [Guangdong]:
    Locality Name (eg, city) [Guangzhou]:
    Organization Name (eg, company) [7forz]:
    Organizational Unit Name (eg, section) [7forz]:
    Common Name (eg, your name or your server’s hostname) [7forz]:
    Name [7forz]:
    Email Address [7f@7forz.com]:
    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:password
    An optional company name []:

    build-key client1 (创建客户端证书,client1为用户名,之后还可以创建client2,client3)
    Country Name (2 letter code) [CN]:
    State or Province Name (full name) [Guangdong]:
    Locality Name (eg, city) [Guangzhou]:
    Organization Name (eg, company) [7forz]:
    Organizational Unit Name (eg, section) [7forz]:
    Common Name (eg, your name or your server’s hostname) [7forz]:
    Name [7forz]:
    Email Address [7f@7forz.com]:
    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:password
    An optional company name []:

    如果出现
    failed to update database
    TXT_DB error number 2
    错误,貌似是因为Common Name相同而导致的,请在生成时修改之或者打开keys\index.txt并清除其中内容,再执行一次build-key client1命令

    之后把 ca.crt  server.*  dh*.pem  传到路由的 /etc/openvpn 目录下

    再把 ca.crt client*.* 放到你电脑的 OpenVPN\config 目录下

    阅读更多…