一台做路由用的机器,在使用mpd拨号时,发现会自动把net.inet.ip.forwarding的值改为0,导致下游的机器不能上网,查找了很长时间才发现原因,小记如下:
1)在mpd拨号成功后,会自动产生一个新的网卡,类型是ng,第一个就是ng0,第二个就是ng1;
(注:ng是netgraph的缩写,这是FreeBSD下的网络处理框架,mpd就使用了它)
2)在产生的ng网卡之后,系统检测到硬件的变化,就会调用devd,具体的配置在/etc/devd.conf:
notify 0 {
match "system" "IFNET";
match "subsystem" "!usbus[0-9]+";
match "type" "ATTACH";
action "/etc/pccard_ether $subsystem start";
};
notify 0 {
match "system" "IFNET";
match "type" "LINK_UP";
media-type "ethernet";
action "/etc/rc.d/dhclient quietstart $subsystem";
};
上面的配置,只要是检测到if类的变化,比如添加了新的vlan,都会执行一次/etc/pccard_ether命令,该命令会在/var/log/messages里面产生一句:
devd: Executing '/etc/pccard_ether vlan22 start'
如果检测到该网卡接入了网线,则还会执行一下dhcpclient。
3)在pccard_ether里面,执行了netif:
pccard_ether_start()
{
……
/etc/rc.d/netif quietstart $ifn
……
4)在netif里面,执行了routing:
if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
for _if in $cmdifn; do
/etc/rc.d/routing start any $_if
done
fi
5)在routing里面,要检测/etc/rc.conf中的gateway_enable参数:
if checkyesno gateway_enable; then
ropts_init inet
echo -n ' gateway=YES'
${SYSCTL} net.inet.ip.forwarding=1 > /dev/null
else
${SYSCTL} net.inet.ip.forwarding=0 > /dev/null
fi
至此,真相大白了,routing会检测/etc/rc.conf的gatewary设置,如果为yes,则启用net.inet.ip.forwarding,否则,则把它置为零,原来就犯了这个错误,直接在rc.local用其他脚本启用了net.inet.ip.forwarding。
结论:
1)直接用sysctl写的内核变量不保险,能在rc.conf中配置的,最好在rc.conf中配置。就相当于老婆和情人的关系,某些时候还是不一样的。
2)如果用mpd当作接入服务器,比如vpn和pppoe等,因为需要频繁的产生、注销ng网卡界面,所以最好不要让devd来这么忙碌的处理这些事情,过于频繁的处理,偶尔会出现锁死系统导致mpd不能正常重启。所在最好在rc.conf中把它禁用:
devd_enable=”NO”
该贴由hui.chen转至本版2015-1-5 10:17:04