从 PPP 连接返回后没有默认路由

No default route after returning from PPP connection

我在 Arch Linux 盒子上,有一个工作的 ETH0(固定 IP)和通过 3G U 盘 (ttyUSB0) 的 PPP 连接。重新启动后,ETH0 工作正常。建立 PPP 连接也能正常工作。但是在使用 'poff' 取消 PPP 连接后,我又没有获得默认路由。我知道如何手动设置默认路由,但由于 linux 盒子将在各种网络中注册,我必须找到一个在使用 PPP 连接后自动取回默认路由的过程。

ETH0 在 /etc/conf 中配置。d/net-conf-eth0:

address   = 10.0.1.30
netmask   = 24
broadcast = 10.0.1.255
gateway   = 10.0.1.1

PPP 是使用

设置的
pacman -S ppp

...和以下配置文件:

/etc/ppp/ip-pre-up

#!/bin/sh
/usr/bin/route del default

/etc/ppp/options-mobile

ttyUSB0
921600
lock
crtscts
modem
passive
novj
defaultroute
noipdefault
usepeerdns
noauth
hide-password
persist
holdoff 10
maxfail 0
debug

路由 table PPP 连接之前:

# route
Kernel IP routing table
Destination     Gateway        Genmask         Flags Metric Ref    Use Iface
default         router.intern  0.0.0.0         UG    0      0        0 eth0
default         router.intern  0.0.0.0         UG    1024   0        0 eth0
10.0.1.0       *               255.255.255.0   U     0      0        0 eth0
router.intern  *               255.255.255.255 UH    1024   0        0 eth0

路由 table 成功的 PPP 连接之后:

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.1.0        *               255.255.255.0   U     0      0        0 eth0
router.intern   *               255.255.255.255 UH    1024   0        0 eth0

我错过了什么?

回答我自己的问题:/etc/ppp/ip-down 是线索。 (我试图在/etc/ppp/ip-down.d/中放置一个脚本,但有时它不会被执行。ip-down太早从pppd获取SIGTERM。)所以我修改了/etc/ppp/ip-down:

!/bin/sh
#
# This script is run by pppd after the connection has ended.
#

ETH_Gateway=$(/usr/bin/cat /etc/conf.d/net-conf-eth0 | /usr/bin/grep 'gateway' | /usr/bin/grep -oE '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+')
/usr/bin/route del default
/usr/bin/ip route add default via $ETH_Gateway

# Execute all scripts in /etc/ppp/ip-down.d/
for ipdown in /etc/ppp/ip-down.d/*.sh; do
  if [ -x $ipdown ]; then
    # Parameters: interface-name tty-device speed local-IP-address remote-IP-address ipparam
    $ipdown "$@"
  fi
done