从 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
我在 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