最近openbsd3.7开始支持内核级的pppoe,刚好五一有空,便想测试一下!
按照man pppoe的说明,建立了hostname.pppoe0文件,内容如下:
pppoedev dc1
!/sbin/ifconfig dc1 up
!/usr/sbin/spppcontrol \$if myauthproto=pap
[email protected] myauthkey=abcde
!/sbin/ifconfig \$if inet 0.0.0.0 0.0.0.1 netmask 0xffffffff
up
重启机器后运行ifconfig发现:
pppoe0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1492
dev: dc1 state: session
sid: 0x874 PADI retries: 5 PADR retries: 0 time: 11:59:59
inet 218.13.162.37 --> 0.0.0.1 netmask 0xffffffff
inet6 fe80::280:c8ff:feca:6f39%pppoe0 -> prefixlen 64 scopeid 0x9
也就是说本地ip已经获取,可是无法更新远端ip,纳闷!!!gooogle了很久,只发现在一些maillist上有人提过,无法更新远端ip,难到又是个bug!
后来发现电信adsl的远端ip是一个不变的ip,那好,就来个霸王硬上弓吧!赫赫!
改写配置文件:
pppoedev dc1
!/sbin/ifconfig dc1 up
!/usr/sbin/spppcontrol \$if myauthproto=pap
[email protected] myauthkey=abcde
!/sbin/ifconfig \$if inet 0.0.0.0 218.13.160.1 netmask 0xffffffff
up
重启机器,靠!行了!然后配置ip转发,dns,nat等等!
然后写了一个小脚本,让电脑监视adsl的状态,并且更新路由表和pf防火墙:
#!/bin/sh
IP=$(/sbin/ifconfig pppoe0 | grep netmask )
RIP=$(echo $IP | awk '{print$4}' )
LIP=$(echo $IP | awk '{print$2}' )
F_LIP_NUM=$(echo $LIP | cut -d. -f1 )
echo "$IP"
if [ "$IP" ]; then
echo "$F_LIP_NUM"
if [ "$F_LIP_NUM" = 0 ]; then
echo "ADSL link is down."
exit 1
else
echo "ADSL is up, IP address is $LIP"
oldIP=$(cat /etc/adslip | awk '{print$2}' )
if [ "$LIP" = "$oldIP" ]; then
exit 1
else
echo "$IP" > /etc/adslip
/sbin/route add default "$RIP" > /dev/null
/sbin/route change "$RIP" "$LIP" > /dev/null
/sbin/pfctl -e -f /etc/pf.conf > /dev/null
/bin/kill -HUP `cat /var/run/named.pid`
exit 0
fi
fi
else
echo "ADSL link is down."
exit 1
fi
将以上文件加入crontab上,让电脑每1分钟运行一次吧!
赫赫,就是这么简单!