之前的水星MW4530R路由器退役了,现在入手了华硕的RT-AC86U路由器作为替代。本文将记述AC86U的作用。

路由器选择

我选路由器有几个原则:

  1. 必须可以自行刷系统,无论是OpenWRT还是其它系统,只要能进行二次开发,能安装第三方软件,能写脚本即可。

  2. 路由性能必须足够,因为现在家中网络设备一般都比较多。

  3. 路由器必须能稳定运行,最好是7x24不间断运行,被动散热。

  4. 无线信号必须支持5G信号。

  5. USB必须支持3.0。

  6. 网口必须支持千兆。

  7. NAT刷机后也支持硬件加速。

在购买路由器之前,在网上搜了一些资料,发现只有网件R6300和华硕AC86U两款,最终因为梅林系统和AC86U血缘比较近,就选择了AC86U(某东购入价829)。

路由刷机

刷入梅林系统,具体刷机过程比较简单,网上教程也很多。不再赘述。

基本功能配置

  1. PPPoE拨号配置

  2. WIFI配置

  3. DHCP配置

  4. VPN配置

  5. 端口转发配置

  6. 开启SSH管理功能

jffs配置

  1. 新增 /jffs/config/dnsmasq.conf.add ,内容可以填入需要屏蔽的域名,绑定特定IP的域名等

  2. 新增 /jffs/script/ddns-start , 该脚本在路由WAN口IP地址变更时会调用,目前该脚本实现两个功能,一是邮件通知当前最新IP,另一个功能是更新域名对应的IP。

  3. 新增 /jffs/script/firewall-start , 该脚本在防火墙启动时被调用,可以添加自定义防火墙规则。

  4. 新增 /jffs/script/post-mount , 该脚本在U盘挂载后被调用,可以在这脚本里添加U盘处理规则,比如挂载SWAP分区文件,执行U盘内脚本等。

  1. alidns.sh, 本脚本可以通过阿里云提供的接口自动更新域名对应的IP。

      #!/bin/sh
      # usage: alidns.sh 192.168.1.1
    
      aliddns_name="router" # your sub domain
      aliddns_domain="example.com" # your domain
      aliddns_ak="******" # your ali key
      aliddns_sk="********" # your ali key
    
      aliddns_dns="1.1.1.1" # your isp dns
      aliddns_ttl="600"
      ip=$1
    
      current_ip=`nslookup $aliddns_name.$aliddns_domain $aliddns_dns 2>&1`
    
      if [ "$?" -eq "0" ]
      then
          current_ip=`echo "$current_ip" | grep 'Address 1' | tail -n1 | awk '{print $NF}'`
          if [ "$ip" = "$current_ip" ]
          then
              echo "DNS: IP not changed"
              exit 0
          fi 
      fi
    
      timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`
    
      urlencode() {
          # urlencode <string>
          out=""
          while read -n1 c
          do
              case $c in
                  [a-zA-Z0-9._-]) out="$out$c" ;;
                  ,*) out="$out`printf '%%%02X' "'$c"`" ;;
              esac
          done
          echo -n $out
      }
      enc() {
          echo -n "$1" | urlencode
      }
      send_request() {
          local args="AccessKeyId=$aliddns_ak&Action=$1&Format=json&$2&Version=2015-01-09"
          local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$aliddns_sk&" -binary | openssl base64)
          curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
      }
      get_recordid() {
          grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
      }
      query_recordid() {
          send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$aliddns_name.$aliddns_domain&Timestamp=$timestamp"
      }
      update_record() {
          send_request "UpdateDomainRecord" "RR=$aliddns_name&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddns_ttl&Timestamp=$timestamp&Type=A&Value=$ip"
      }
      add_record() {
          send_request "AddDomainRecord&DomainName=$aliddns_domain" "RR=$aliddns_name&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddns_ttl&Timestamp=$timestamp&Type=A&Value=$ip"
      }
      if [ "$aliddns_record_id" = "" ]
      then
          aliddns_record_id=`query_recordid | get_recordid`
      fi
      if [ "$aliddns_record_id" = "" ]
      then
          aliddns_record_id=`add_record | get_recordid`
          echo "added record $aliddns_record_id($aliddns_name.$aliddns_domain) = $ip"
      else
          update_record $aliddns_record_id
          echo "updated record $aliddns_record_id($aliddns_name.$aliddns_domain) = $ip"
      fi