Pages

Saturday, 17 December 2016

用Banana Pi R1做一个翻墙路由器

想来想去还是ARM板比较合适,偶然发现Banana Pi R1这块ARM板,CPU和内存其实跟最新版的树莓派从数据上看差不多,但关键是它有千兆网口,而且是5个口,1个WAN和4个LAN口!然后偶然发现了Banana Pi的官方Telegram群,询问了一些我关心的问题后,觉得R1是很适应我的需求,于是上淘宝买一块,昨天收到,包括一块板子,一块散热片,一块TF卡,一个输出5V3A DC的电源。贪便宜在另一家拍了一个外壳,快一周了也没发货,郁闷。
昨天晚上就开始折腾,本来打算装Archlinux的,不过这个比树莓派上的要麻烦,本来我想照archlinuxarm.org上for Cubieboard 2的安装说明做的,但除了拷入archlinux的文件外,还需要另外刷入对应的uBoot bootloader的,但是我并不能确定它用的是哪一个包,照网上某个帖子说的刷了linux-sunxi的某个uBoot bootloader和Cubieboard 2的boot.scr,然后板子并不能点亮,于是我便放弃了,还是老老实实刷Raspbian吧,开箱即用,适合小白
Raspbian镜像也是从Banana Pi的官网上 下载的(我居然没用官网上那个archlinux镜像试试!),写到TF后直接就能点亮板子了。然后跟树莓派上一样,从路由器上找到DHCP分配给它的 IP,从SSH登录进去,用户名密码分是pi和bananapi,这个密码是我猜出来的,竟然没在哪里看到有说明!之后便是运行raspi-config,扩大分区容量,调整时区等等。到此为止,我就拥有了一个可以运行的基本的ARM系统了,之后便是进行翻墙路由器的配置。
做为翻墙路由器,要做这些事:
  • 宽带拨号上网。这个是通过pppoe实现的,通过命令sudo apt-get install pppoe pppoeconf pppoestatus安装必要的软件,然后运行sudo pppoeconf进行拨号设置,基本上全都使用默认设置即可,填入宽带账号和密码,让它开机即拨号即可,平时可以用sudo poff -a停止拨号,或用sudo pon dsl-provider拨 号。我发现甚至可以多拨,但在上海电信虽然能多拨成功,也能得到新IP,但貌似带宽并没有叠加,不过不排除是我的光猫下行带宽只有百兆,或者 Raspbian本身没有把流量叠加,Bond可能正常工作。而且马上ppp0会断掉,然后ppp1即使存在也连不出去,所以多拨实际上还没什么用。另外 就是昨天晚上折腾的时候,一运行pppoeconf,就板子掉电了,而 且手去拿板子时会被电一下,连续发生了三次,只能拔插电源重新上电才行。怀疑了电源不稳,怀疑了光猫出来的网线带poe等等。今天再折腾时仍然无规律掉 电,一次是编译程序时,一次是跑满带宽下载测速时等等。官方群里的人叫我用TTL看一下dmesg输出,我一直懒得找TTL线,就没看。我还怀疑是pppoeconf因为载入到内核中,是不是内核的问题,于是想着不用pppoeconf,装了rp-pppoe来配置,结果一运行pppoe-start就SSH连不上板子了,后来是撞大运般地运行完了pppoeconf才搞定的。
  • DHCP服务器。从网上的各种文章说,dnsmasq就可以实现,但我怎么都弄不好,而且连DNS缓存都会搞坏,真是奇怪,我甚至怀疑板子掉电也有可能是dnsmasq引起的。后来就想用udhcpd来做这个,刚装好时倒是能工作了,后来重启了一次系统,udhcpd就不能运行了,没有任何错误信息输出,总之就是进程起不来,反复卸载重装再配置n次,也没用。最后用了isc-dhcp-server,配置还算简单,修改/etc/dhcp/dhcpd.conf,把IP范围,路由IP,DNS IP等等填入即可。
  • 翻墙。这个跟之前在树莓派上完全一样,可以把树莓派2B上的程序原样copy过来直接使用。
另外有一些需要注意的点:
  • 要做网关,需要打开包转发,即/etc/sysctl.conf里有一行net.ipv4.ip_forward=1,去掉开头的注释符号#,然后运行sudo sysctl -p使设置生效。也可以直接在shell上运行命令sysctl -w net.ipv4.ip_forward=1即可设置并生效。
  • 要在iptables上做转发,运行命令sudo iptables -t NAT -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE,我就是假设我就只用ppp0这个端口了。我现在还没搞好多拨,不然我觉得可能要用bond0这个端口。
  • WAN口上是eth0,要给eth0设置一个静态地址,当成板子的IP,一般是192.168.x.1这种,修改/etc/network/interfaces
    auto eth0
    allow-hotplug eth0
    iface eth0 inet static
      address 192.168.66.1
      netmask 255.255.255.0
    
    配合isc-dhcp-server/etc/dhcp/dhcpd.conf在配置:
    subnet 192.168.66.0 netmask 255.255.255.0 {
      range 192.168.66.50 192.168.66.80;
      option routers 192.168.66.1;
    }
    
    如此其他电脑通过网线连到R1的任意一个LAN口,即可得到一个192.168.66.5x这样的IP,便可以通过ssh pi@192.168.66.1连接到板子上去了。
  • pppoe虽然是通过WAN口走的,但它是会创建一个pppx的端口,所以不用担心eth0上的设置,从设置角度上看这两个是独立分开的。4个LAN口并不会有eth1…eth4这些端口,不要想多了。DHCP server是服务于eth0的,isc-dhcp-server会自己找range IP应该对应哪个端口(假设有多个端口的话,比如R1除了eth0还有wlan0)。
至今没确认掉电的root cause,不过我把电源换成了一个输出5V1.5A的,而且彻底不用dnsmasq了,跑了几个小时了,似乎没问题了。
到此为止,基本的翻墙路由器便能正常工作了,剩下的便是些周边工作,比如要在iptables里设置一下不能从外网连接进来,要做几个端口映射等等,