前段时间,写了 openwrt 第一篇,但是第二篇一直拖到现在也没有写,今天强迫自己写出来,不然不知道又要拖到什么时候了。

上次主要是联网遇到的问题和文件共享的设置,今天我写写离线下载文件,和 DDNS。

文件共享搞好了,就做离线下载,这样电脑可以直接读取路由器下载的电影,手机也可以直接读取,减少复制和存储空间(U 盘存储不够,你可以用挂载移动硬盘)。离线下载主要依靠的是 aria2,openwrt 路由器已经有编译好的软件包,你可以直接在软件管理的地方安装 (或者 opkg install aria2), 安装好了需要给它设置配置文件(我在下面贴出来),用 aria2c --conf-path=/root/aria2.conf 命令启动它,如果不出错,就可以用 web 管理面版给它添加东西了,下载 这里 的压缩包,解压放在 / www 目录,然后访问 http://192.168.1.1/yaaw 或者 http://192.168.1.1/xunlei ,添加下载文件。

aria2 配置文件,放在 / root 目录,里边的路径修改一下对应你的。 如果需要开机自启动在 系统》启动项添加 aria2c --conf-path=/root/aria2.conf -D 命令。

#允许rpc
enable-rpc=true  
#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true  
#允许非外部访问
rpc-listen-all=true  
#RPC端口, 仅当默认端口被占用时修改
rpc-listen-port=6800  
# 保存日志到文件,没有该文件用 touch 命令新建,不然会报错
log=/mnt/upan/aria2.log

disable-ipv6=true  
#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=3  
#断点续传
continue=true  
#同服务器连接数
max-connection-per-server=10  
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M  
#单文件最大线程数, 路由建议值: 5
split=10  
#下载速度限制
max-overall-download-limit=0  
#单文件速度限制
max-download-limit=0  
#上传速度限制
max-overall-upload-limit=0  
#单文件速度限制
max-upload-limit=0  
#断开速度过慢的连接
#lowest-speed-limit=0
#验证用,需要1.16.1之后的release版本
#referer=*


input-file=/mnt/upan/aria2.session  
save-session=/mnt/upan/aria2.session  
#定时保存会话,需要1.16.1之后的release版
save-session-interval=60


#文件保存路径, 默认为当前启动位置
dir=/mnt/upan/download  
#文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用, 需要1.16及以上版本
#disk-cache=0
#另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)
#enable-mmap=true
#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长
#所需时间 none < falloc ? trunc << prealloc, falloc和trunc需要文件系统和内核支持
file-allocation=none


#启用本地节点查找
bt-enable-lpd=true  
#添加额外的tracker
#bt-tracker=<URI>,…
#单种子最大连接数
#bt-max-peers=55
#强制加密, 防迅雷必备
#bt-require-crypto=true
#当下载的文件是一个种子(以.torrent结尾)时, 自动下载BT
follow-torrent=true  
#BT监听端口, 当端口屏蔽时使用
#listen-port=6881-6999



#不确定是否需要,为保险起见,need more test
enable-dht=true  
bt-enable-lpd=true  
enable-peer-exchange=true  
#修改特征
user-agent=uTorrent/2210(25130)  
peer-id-prefix=-UT2210-  
#修改做种设置, 允许做种
seed-ratio=0  
#保存会话
force-save=true  
bt-hash-check-seed=true  
bt-seed-unverified=true  
bt-save-metadata=true  

如果你要用迅雷离线,或者旋风离线,需要给浏览器安装油猴子 js 脚本,迅雷旋风二合一( http://userscripts.org/scripts/source/153927.user.js )。安装好以后,设置一下 rpc 路径,和 yaaw 设置里边的一致就可以一键添加下载了。旋风是 rpc 导出,迅雷是批量导出。 旋风设置
迅雷设置

离线下载设置好了,但你有时在外边,就需要远程控制了,但是每次拨号路由器的 ip 都是变化的,很多人用的是花生壳,我是用 dnspd 解析的,下面是我用的脚本。

<?php  
error_reporting(0);  
set_time_limit(0);  
header('Content-type:text/html; charset=utf-8');

if(!$_GET['username']||!$_GET['password']||!$_GET['domain']){  
  exit(json_encode(array('msg'=>'username,password,domain 参数必选')));
}

$domain = explode("@", $_GET['domain']);

$config = array(
    'login_email' => $_GET['username'],
    'login_password' => $_GET['password'],
    'sub_domain' => $domain[0],
    'domain' => $domain[1],
    'record_line' => $_GET['line']?$_GET['line']:'默认',
    'ttl' => 120,
    'format' => 'json',
    'lang' => 'cn',
    'error_on_empty' => 'no',
);

$dnspod = new dnspod($config);
$config['ip'] = $_GET['myip']?$_GET['myip']:$_SERVER['REMOTE_ADDR'];
$dnspod->updateRecordIp($config['ip']);
class dnspod {  
    var $config;
    var $domain;
    var $sub_domain;
    var $record_line;
    function __construct($config)
    {
        $this->config = $config;
        $this->domain = $config['domain'];
        $this->sub_domain = $config['sub_domain'];
        $this->record_line = $config['record_line'];

    }
    public function api_call($api, $data) {
        if ($api == '' || !is_array($data)) {
            exit(json_encode(array('msg'=>'内部错误:参数错误')));
        }

        $api = 'https://dnsapi.cn/' . $api;

        $data = array_merge($data,$this->config);

        $result = $this->post_data($api, $data);
        if (!$result) {
            exit(json_encode(array('msg'=>'内部错误:调用失败')));
        }

        $results = @json_decode($result, 1);
        if (!is_array($results)) {
            exit(json_encode(array('msg'=>'内部错误:返回错误')));
        }

        if ($results['status']['code'] != 1) {
            exit(json_encode(array('msg'=>$results['status']['message'])));
        }

        return $results;
    }
    public function updateRecordDdns(){
        $record = $this->getRecordInfo();
        //判断IP是否改变
        if($record['records'][0]['value'] == $_SERVER['REMOTE_ADDR']){
            exit(json_encode(array('msg'=>'记录不需要更新')));
        }

        $response = $this->api_call('Record.Ddns', array('record_id'=>$record['records'][0]['id'],'record_line'=>$this->record_line));
        if($response){
            exit(json_encode($response));
        }else{
            exit(json_encode(array('msg'=>'更新失败')));
        }
    }
    //获取域名信息
    public function getDomainInfo(){
        $response = $this->api_call('Domain.Info', array('domain' =>$this->domain));
        return $response;
    }
    //获取记录
    function getRecordInfo(){
        $response = $this->api_call('Record.List', array('sub_domain'=>$this->sub_domain,'domain' =>$this->domain));
        return $response;
    }
    //修改A记录IP
    function updateRecordIp($ip){
        $record = $this->getRecordInfo();
        //判断IP是否改变
        if($record['records'][0]['value']==$ip){
            exit(json_encode(array('msg'=>'记录不需要更新')));
        }

        $response = $this->api_call('Record.Modify', array('record_id'=>$record['records'][0]['id'],'record_line'=>$this->record_line,'record_type'=>'A','value'=>$ip));
        return $response;
    }

    private function post_data($url, $data) {
        if ($url == '' || !is_array($data)) {
            return false;
        }

        $ch = @curl_init();
        if (!$ch) {
            exit(json_encode(array('msg'=>'内部错误:服务器不支持CURL')));
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_USERAGENT, 'DNSPod MYDDNS/0.1 (www@inbiji.com)');
        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }
}

保存为 php 文件,放在外网可以访问的支持 curl 的 php 空间,然后打开 "/usr/lib/ddns/services" 文件,如果你找不到那就是路由器安装 ddns,在软件管理那里安装一下。在 "/usr/lib/ddns/services" 里边添加 "dnspod.com" "http://api.inbiji.com/dnspod/dnspodupdate.php?username=[USERNAME]&password=[PASSWORD]&domain=[DOMAIN]&myip=[IP]",如果你没有空间,可以直接用我的接口,不会记录密码。

然后在路由器设置页面 服务 -> 动态 DNS-> 添加一条记录,这里服务里现在会出现 dnspod.com 选项,主机名: 二级域名 @顶级域名 (比如你的二级域名是 openwrt.xxx.com, 那么该处就填写 openwrt@xxx.com),用户名: 就是你的 dnspod 账户,密码 : 就是你的 dnspod 密码,网络 : 选 wan,"保存并应用", 最好开启定时更新, 间隔时间不要太短, 10 分钟就好。

这样路由器就可以有一个固定的域名了,但是你直接远程访问 http://openwrt.xxx.com 还是不行的,需要在防火墙里边添加端口转发,将外网 1024 端口转发到 192.168.1.1 的 80 端口(外网端口不建议用 80, 又不是面向公众的服务,而且一些省份是屏蔽 80 端口的),这样就可以通过 http://openwrt.xxx.com:1024 访问路由器管理页面了,当然 yaaw 的管理页面就是 http://openwrt.xxx.com:1024/yaawhttp://openwrt.xxx.com:1024/xunlei 了。

第二次折腾就是这些了,当然还有第三次,准备折腾拿安卓手机做 web 服务器(已经成功),然后通过路由器转发,就可以让外网访问了,搭建一个小网站是可以的,许多人是拿树莓派这样玩的,买不起树莓派,只能拿手机了。

显示评论