菜鸡路由器拼装之路(2):PPPoE+科学上网及Dashboard

上一篇文章中,我们已经配置好了一个最基础的网关。然而学校情况比较特殊,需要我们PPPoE上网。此外,我还有一个可以科学上网的虚拟专用网连接资源,也希望配置到路由器上。另外,为了让资源访问更方便,我还要建立一个Dashboard。这篇文章我们就来完成这个操作。

PPPoE上网

上一篇文章中,我们决定将VLAN做如下规划:

  • eth0.100 与wlan1lan桥接,局域网
  • eth0.200 外网PPPoE
  • eth0.300 外网DHCP(暂时不做配置)

现在就来配置eth0.200。用apt安装好pppoe这个包之后,我们用这条命令来探测一下当前网内有哪些提供商:

root@router ~ # pppoe -I eth0.200 -A
Access-Concentrator: PPPOE_01-AC
AC-Ethernet-Address: da:3e:79:8f:cf:d0

接下来就可以写PPPoE的配置了。在/etc/ppp/peers/下新建一个名称为PPPOE_01-AC的文件,写入如下配置:

plugin rp-pppoe.so  # PPPoE插件
eth0.200            # 网络端口
#defaultroute       # 不要让他添加默认路由。一会我们自己还要修改
#connect /bin/true
+ipv6               # 启用IPv6

接下来,我们用下面这个命令,测试一下网络是否正常:

ip link set dev eth0.200 up
poff PPPOE_01-AC
pon PPPOE_01-AC user <username> password <password>

如果一切正常的话,通过ip addr,你应该可以看到你已经被分配到了一个IPv4和IPv6地址。如果你再手动添加一条默认路由,就可以上网了。

接下来,我们配置一下防火墙。在/etc/ppp/ip-up.d/下放一个0001pppoe_ipv4_start,并加上执行权限,这样这个文件会在建立IPCP链路之后被执行。我的习惯是在/root/scripts/下建立这个文件,然后做一个软链接。文件的内容是这样的:

#!/bin/bash

# Import scripts
SCRIPT_ROOT=/root/scripts
source $SCRIPT_ROOT/iptables_helper

#echo Interface: $1 > /dev/kmsg
#echo Local IP:  $4 > /dev/kmsg
#echo Remote IP: $5 > /dev/kmsg

# Add default route
ip route add default dev $1 via $5

# Base rules
iptables_init

# Create zones
iptables_zone_create Wan
iptables_zone_create Lan

iptables_zone_member_add Wan $1
iptables_zone_member_add Lan br0

iptables -A ZoneLanInput -j ACCEPT
iptables -A ZoneLanForward -j ACCEPT
iptables -t nat -A ZoneWanPostrouting -j MASQUERADE

# fix mss problems
iptables -t mangle -X
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

再执行一次poffpon。现在所有客户端应该可以正常上网了。如果不能上网,看看你的eth0.200有没有up。没有up也不要紧,先手动搞定他,一会再细处理。

科学上网

自古以来,我国勤劳而坚韧的劳动人民,就学会了如何科学的进行互联网傲游工作。我们作为后来人,自然也不能免俗。首先安装工具vpnc。之后直接去编辑/etc/vpnc/default.conf

IPSec ID warispeace
IPSec secret freedomisslavery
Xauth username Ignoranceisstrength
Xauth password bigbrotherlonglive

然后我们拨一下试试:

vpnc --debug 0 --gateway 1984.gov.cn && curl -nv4L www.google.com

如果内容正常,说明加速器工作也是正常的。那么我们就可以进行下面的工作了

进一步科学上网

建立一个network_pppoe_boot.sh,写入:

#!/bin/bash

SCRIPT_ROOT=/root/scripts
source $SCRIPT_ROOT/iptables_helper

# Dial network
echo Dialing...
ip link set dev eth0.200 up   #还记得之前说要先up吗?这里我们搞定了
poff PPPOE_01-AC
pon PPPOE_01-AC user <username> password <password>
# Wait until network being connected...
until curl neverssl.com > /dev/null 2>&1
do
  sleep 1
done

curl neverssl.com > /dev/null 2>&1
if [[ $? -ne 0 ]]; then
    echo ***NETWORK BAD!***
    exit 1
fi

# generate our route table
table_number=451
table_source="$SCRIPT_ROOT/chnip_list.txt"   # Where can I get it? visit ipip.net if u like!
table_target="ppp0"                          # 有点丑陋,不过先这样吧
# Flush old items first
echo Route table flushing...
ip route flush table $table_number
echo Route table adding...
while read table_item; do
  ip route add $table_item dev $table_target table $table_number
done < $table_source
ip route add 10.0.0.0/8 dev $table_target table $table_number
ip route add 172.16.0.0/12 dev $table_target table $table_number
# and items didnot added will be fallback to main route table, which is what we want


# Time to dial VPN at now
echo Dialing VPN...
vpnc --debug 0 --gateway 1984.gov.cn 
iptables_zone_member_add Wan tun0

echo Modifying Route rule...
ip rule add from all table $table_number

echo Testing now...Should show a good result
curl school_internal.site -I
echo Testing now...Should show a foreign ip
curl ifconfig.co

IP列表的来源是多种多样的。我建议,在不影响正常使用的前提下,可以适当降低路由表的精度,从而减少硬件压力。

检查后执行脚本,稍等片刻,直到脚本执行结束,如果一切正常,你应该可以在任一台客户端上访问国内外所有站点,并保持正常的身份了。

Dashboard搭建

Netdata是个好东西,安装也很方便,装好后可以按照官方Wiki中的优化指南做一些设置。

跑起来后,我们立刻就能发现,CPU0接收的中断有点多:

img

很容易就能发现,实际是eth0的中断占了大头。想想也难免,eth0同时承担者WAN和LAN的接口任务,负载大也很正常:

img

所以我们就手动做一下负载的分配:

echo 2 > /proc/irq/$(grep eth0 /proc/interrupts| cut -f 1 -d \: )/smp_affinity

现在再来看一下:

img

img

嗯,明显好了很多。

现在我们可以更新一下rc.local了:

echo Modifying IRQ of eth0 to CPU1 > /dev/kmsg
echo 2 > /proc/irq/$(grep eth0 /proc/interrupts| cut -f 1 -d \: )/smp_affinity
echo Modified. > /dev/kmsg

echo default-on > /sys/class/leds/green:ph24:led1/trigger

echo Getting ready to run PPPoE CONNECTION settings now! > /dev/kmsg
bash /root/scripts/network_pppoe_boot.sh > /dev/kmsg

echo mmc0 > /sys/class/leds/green:ph24:led1/trigger

service netdata start

exit 0

以上我们已经完成了一个基本可用的科学网关的配置。接下来的几篇文章,我会试图实现以下几个目标:

  • PPPoE接入互联网
  • VPN接入国外网络以及流量区分
  • 网络和运行状态监视(via HTTP)
  • LAN中的IPv6访问
  • 启动中关闭LAN交换机
  • 启动时更改WAN接入方式,以及运行状态监视(via LCD)
  • 备用电源供应,RTC时钟和交换机配置保存