大头龙仔Blog

A strong man can save himself. A great man can save another.

DRouter路由篇

| Comments

早些入手了一个华硕AC88U,一星期左右就闲鱼出去了,之后入了网件R7000,一直用网件,非常稳定。 前段时间又想着买个NAS玩玩,随便看看感觉都不便宜,于是决定自己DIY一个,那不如也带上路由的功能吧,于是就有了drouter的计划,本篇先从主机组装、Linux和基本路由功能说起吧。

硬件列表

  • 技嘉J1900主板(低功耗, ITX,有PCI预防网卡坏掉,板载双网卡)
  • 4G笔试本内存
  • 两个2T日立企业盘,后面要组软RAID 1(企业盘就是贵,预算多的这里上SSD做系统盘感觉爽好多)
  • JONSBO C2机箱(装得下两个3.5硬盘,又小巧的,只找到了这个)
  • 全汉400W服务器电源(买上了档次的电源我都选择全汉,本来想试试新巨的)

系统安装

我选的是slackware 14.1,这个自己喜欢就好,但安装过程因为要组RAID 1,slackware还是说得很详细,大体上是:

  • 使用cfdisk分区,我是分了root 100G,swap 8G
  • 分区同步: sfdisk -d /dev/sda | sfdisk --Linux /dev/sdb
  • root: mdadm --create /dev/md0 --level 1 --raid-devices 2 /dev/sda1 /dev/sdb1 --metadata=0.90
  • swap: mdadm --create /dev/md1 --name=1 --level 1 --raid-devices 2 /dev/sda2 /dev/sdb2
  • mkswap: mkswap /dev/md1
  • 开始常规的slackware setup,lilo那里会失败,不用管先安装完
  • chroot /mnt,修改lilo.conf,加入raid-extra-boot = mbr-only,root和boot设为/dev/md0,执行lilo
  • mdadm -Es > /etc/mdadm.conf以记录软raid的信息,如果不执行这个,有可能会reboot失败

PPPOE拨号

  • pppoe-setup
  • 填入账号密码等
  • FIREWALL=MASQUERADE
  • pppoe-start,应该就可以拨上去了,使用网口eth1,ifconfig应该出现ppp0
  • 如果要让系统访问外网,要加iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT,可以看看/etc/ppp/firewall-masq
  • /etc/resolv.conf,我用的是119.29.29.29114.114.114.114

DHCPD(动态分配IP)

  • /etc/dhcpd.conf
1
2
3
4
5
6
7
8
9
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.1.0 netmask 255.255.255.0{
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  option domain-name-servers 119.29.29.29;
  option ip-forwarding off;
  option broadcast-address 192.168.1.255;
}

最后

eth0是对内网的,所以接到交换机,PC, AP等接入交换机,自动获取IP后,就可以上网啦,至此完成一台有基本路由功能的server。下面几个是为了增强稳定性的。

  • 断线自动重连/etc/cron.d/pppoe-keep.sh
1
2
3
4
5
6
7
8
9
#!/bin/sh

while true; do
    /sbin/ifconfig ppp0 > /dev/null
    if [ $? -ne 0 ]; then
        /usr/sbin/pppoe-start
    fi
    sleep 5
done
  • 断线自动重连watch dog/etc/cron.d/pppoe-keep_watchdog.sh
1
2
3
4
5
6
#!/bin/sh

ps uax | grep 'pppoe-keep.sh' | grep  -v grep
if [ $? -ne 0 ]; then
    /bin/sh /etc/cron.d/pppoe-keep.sh &
fi
1
2
# keep pppoe connecting
* * * * * /bin/sh /etc/cron.d/pppoe-keep_watchdog.sh
  • 每天自动断线一次 /etc/cron.daily/pppoe-stop
1
2
3
#!/bin/sh

/usr/sbin/pppoe-stop
  • 每周机器自动重启一次 /etc/cron.weekly/reboot
1
2
3
#!/bin/sh

/sbin/reboot

NOT THE END

一些脚本和配置都在这里https://github.com/imlcl/DRouter/。后面会有DDNS, NAS等续篇 : )

A Little SCNUCrew

| Comments

那天偶然和bbin一起找回以前的一些视频看,然后哈哈大笑,接着我去SCNUCrew Blog寻宝,找了一些,放在这里做一个纪念吧(blog图片区:P)

视频系列

随笔系列

其它

人生总有一次不懂,生活总有一次茫然,突然发现,自己的身边已经走失了那么多人,有些人,不知不觉,就淡了关系,有些人,无声无息,就远离视线,时间一天天过,好像什么也没改变,但当你回头看,每个人都变了,有的从眼前走到了天边,有的从陪伴进入了心间,明明入心的人,转身就变的陌生,明明不在意的情,有时瞬间让你感动,缘分这东西,不经意会错过,太认真会难过,落花有意水无情,有缘无份空叹息,相识相知本不易,人走茶凉奈何兮,不怕身隔南北,只怕心在天涯,不畏暖心多年,只恐心凉一瞬,唯有时间能看清真心,鉴别真情,曲终人散后依然为你而留的,才叫陪伴,物是人非中依旧拿心而守的,才是珍惜。

国庆在家刷个票

| Comments

刷票什么鬼的已经不是一个什么新鲜话题了。放假期间受朋友所托去刷个票,整个过程还是有些东东可以分享的。

一、为什么可以刷票

基于HTTP协议是处于应用层,所以HTTP包是很容易可以构造出来的,也就是说,人通过浏览器去投票发出的HTTP请求包,机器是可以模拟构造出来的。

二、刷票前我们要了解什么

1、投票时是否绑定session

2、投票时是否识别ip

3、投票时是否需要验证码

4、投票时需要提交什么数据到什么目标地址(这里包括是否要带上特定的cookie字段,是否要识别终端等HTTP头信息)

所以,针对不同的投票网站,可能会有不一样的变通方案,但都不会离开上面四点。 这次投票的网站,经过分析,1、2是yes,3是no,不用验证码哦,这个刷票门槛马上低了n个层次,不过发现是识别ip的,一个ip投一票,请空cookie后可以继续投。 一个ip经测试,一般可以投20-30票,如果速度不快的话。

三、来来来,开刷了

感觉没上代码不舒服,先上个代码先

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
include_once('ip.php');

$url     = URL;
$timeout = TIMEOUT;

# USER AGENT哦, 多搞几个是好事
$user_agents = array(
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'
    );

while (1)
{
    # 通过代理API获取IP
    $ret        = file_get_contents(IP);
    $ret        = json_decode($ret, true);
    $proxy_list = $ret['data']['proxy_list'];
    print_r($proxy_list);

    foreach ( $proxy_list as $proxy ) {
A:
        $ua = $user_agents[array_rand($user_agents)];
        $options = " -v
                     -A \"$ua\"
                     -m $timeout
                     -x $proxy
                     -H \"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\"
                     -H \"X-Requested-With: XMLHttpRequest\"
                     -H \"Origin: http://abc.com\"
                     --referer \"http://abc.com/vote.html\"";
        $cmd = "/usr/bin/curl $options -d \"i=xxx\" \"$url\"";
        # 用的是cmd, 用php curl也可以
        $output = exec($cmd);
        echo $cmd;
        echo "\n*******************\n$output\n******************\n";

        $ret = json_decode($output, true);
        print_r($ret);
        if ( $ret['success'] == '1' ) {
            echo $proxy . "\n";
            # 模拟停一秒, 感觉可以停久一些
            sleep(1);
            # 神奇的goto
            goto A;
        }
    }
}
?>

因为是和IP相关的投票,所以只能通过代理了,这里就只能去买代理啦,只用高匿的,因为这样server那边是不知道你是用了代理的,这个请自行google了。 另外curl需要给个user agent,这样就不需显示curl了,更加真实一点,多点user agent随机会比较靠谱。

四、这次刷票遇到的其它问题

1、估计大家都用代理嘛,代理资源可能有很多是重复的,你会发现很多取回来的代理已经不能投票了(别人已经用这个代理投过票,并且该代理IP已入黑名单), 或者说投一到两票就不能投了,所以这样刷票是有点不稳定的,如果有一手的代理资源这个问题就可以解决。

2、大家都在刷,大家都在抢占资源,所以我们可以多开些进程去刷,这里要考虑代理获取IP的API调用频率限制问题了,太快的也是不行的。

3、代理也分布在不同网络,电信、移动、网通、铁通之类,所以刷票机在多个网络会更好一些。

4、刷票的时间最好和人正常的作息时间对应,也就是说要更智能一点,更像人在投票一点。

5、因为朋友说不想名次太高,所以我另外也写了一个程序来判定是否在前几名之外,如果不在前几名,就开始刷。这些边边角角的代码就不好意思贴出来了,写得比较快,所以比较粗烂……

五、如果有验证怎么办

这个比较恶心,因为验证码要涉及图形识别,不同图形验证码的识别率也不一样,这一块我没有深入研究过,但知道Tesseract Open Source OCR Engine可以通过不断学习来提高图形验证码的识别率。当然也可以自己写识别算法来处理,图形学是博大精深,小弟只懂个皮毛,不过有时间还是想试试这个东东。

刷票软件什么的也很厉害,以前好像有用过,大家都可以找找看吧。我这里只是分享其中一种方法与思路,应该算是刷票的基本功吧,因为软件什么的也是基于这个思路来写的,不过功能更多强大和自动化而已。

话说刷票不便, 这种无验证码的淘宝也要四毛一票呢,我这帮朋友刷了4w多票,Just a joke : )

EOF

Less Is Less

| Comments

想了很久,很不情愿地用了这个标题。

这一年里,无论从个人情感上、心理上还是行动上,都发生了巨大的变化,甚至可以说是有生以来最大的一次巨变: 放弃公办教师来到腾讯CDC,与家庭磨合分隔两地的工作生活, 从小影响着我并深爱着我的老爸中风半身偏瘫,一下子打破了家里平静小幸福的生活状态, 妈妈全职照顾老爸,爱人辞职带小孩,也突然感觉得生活艰难了好几分。 没有把这事情诉说给什么人去听,因为除非对方的家庭也有相似的经历,否则根本没有办法理解的。

偶尔静下心来想想,真的说不出这一年来,我真正收获了什么东西。 可能收获的都是无形的,我看不到,但有这样的感觉,我就会觉得是件很恐怖的事情。 在一个设计师的团队里做一名死开发,感觉这就是我的现状,同时感觉内部这样的开发环境和氛围,对于专业的提升真的是非常有限,可能是因为一定程度的封闭。 然后,需求淹满了一些想法,直到变成让自己都讨厌的习惯。 而我也努力在寻找某种提升的方法与动力,抑或是针对我个人,抑或是“团队”。

一年前的改变,然后发现自己在某些东西上依旧没什么变化,甚至渐行渐远,在这样的压力下并不是一件好事。

可是这就是生活,这就是现实,收拾一下心情,不在沉默中死亡,就是沉默中爆发。

我离开了,其实我回来了

| Comments

今晚下起了一场大雨,仿佛带着点不必要的伤感似的。 是的,我下星期就要离开我待了四年,充满了回忆的,美丽的西溪小学,是的,我选择离开东莞,再次回到深圳,是的,就为了那依然年轻的那一丝追求,还有那谁都不能定义的未来。 这是思考了将近一年时间的决定,很艰难的抉择,毕竟我已经成家了,家庭因素是首要考虑的。 这里首先要感谢小静,她总是能理解我的想法,支持我的决定,虽然的确是很纠结。BBin说得对的,如果能努力找到一个工作与家庭的平衡点,也未尝不可是一个选择方案,因为男孩子早晚都要肩负起应有的东西。 虽然我知道,你舍不得,我也舍不得,长辈朋友们都舍不得。就如同我老友说的:什么都不能舍弃的人,就无法带来任何改变——《进击的巨人》

在学校这四年时间,我学到了很多珍贵的东西,多少的人和事都历历在目,甚至咋一想,就能想起某人的嘻哈大笑。Bird说我四年最大的收获是结婚生子,我去,好像这也对。而我遇到了前卫的校长,开始接触苹果的产品,直到我遇上MacBook才发现这才是程序员用的神器,再到在学校搞起了Rails,还有很多很多……还记得当时到学校时没有办法室,我就整天在机房里编程,用PHP花了一个月左右的时间做了一个数字化平台的雏形出来,还记得那时在RTX上介绍自己:大家好,我叫刘楚龙,毕业于华南师范大学软件工程,酷爱街舞……我相信这些历练,会使得我与众不同,感谢这些日子。

下面这段话是我老师说的,我完整的摘录下来: “人的一生是漫长的,我们总在不停遇见与离别之间徘徊、反复。很荣幸地遇见,彼此相识、熟悉、牵挂、思念,到了最后,随着时光的推移,来了,又去了;留下了,又走了;然而,我们要懂得珍惜每一次的遇见,珍惜所有踏过的足迹。 某一些事,某一些人,在我们的心里形成瞬间成永恒的影映,我们会因此哭或笑,然后就那般安静下来,一颗心恬然自得。人生就是这样一场又一场的际遇,只是多么希望我们都能够在这场际遇里,收获自己内心最渴望的那一缕情愫,满足自己的需求。 坚定、坚强、执著、淡然、随缘,无论我们的生命里那些曾心心相惜的人来与不来,在与不在,愿我们都能够站成优雅的姿态,守护在自己的心灵后花园里,不离不弃、不远不近、默然相守、寂静欢喜。 ”

是的,我离开了,不代表我不感恩,也不代表我不尊敬您,感谢你和你们对我的包容与鼓励,真的。

2010年,HBin说不如你不要走吧,那时我坚决地走了;2014年,感谢他给我带来的机会。 我清晰地记得那晚你对我说的话:当年你在深圳,我去面试时,你请我吃沙县,你要走时,我叫你不要走,而现在你又想回来,你不需要感谢我。这些东西可能是一个轮回,就像一个婴儿出生时,婴儿在哭,我们都在喜悦地欢笑,当你慢慢老去,在某一天,你周围的人在伤心地哭了,而你可能是很安详地开心地走了。

感谢每一位小伙伴,这里就不一一点名了,谨此纪念!