3. PPPD

你需要 pppd (点对点协议守护进程) 以及对其工作原理有一定的了解。如有必要,请查阅相关的 RFC 或 Linux PPP 指南。由于你不会使用登录过程,因此你不需要使用 (m)getty,也不需要与控制链接的 pppd 关联(虚拟)用户。你也不需要拨号,因此也不需要任何 chat 脚本。实际上,你刚刚构建的调制解调器电路和配置非常类似于完全接线的零调制解调器线缆。这意味着你必须像配置零调制解调器线缆一样配置你的 pppd。

为了建立可靠的链接,你的设置应满足以下标准:

3.1. 配置

假设调制解调器连接到 COM2,本地 IP 地址为 `Loc_Ip',远程 IP 地址为 `Rem_Ip'。我们希望使用 576 作为我们的 MTU。那么/etc/ppp/options.ttyS1现在应该像这样:

crtscts
mru 576
mtu 576
passive
Loc_Ip:Rem_Ip
-chap
modem
#noauth
-pap
persist
#maxfail 0
#holdoff 10
`asyncmap 0'、`lock'、`modem' 和 `-detach' 之类的设置可能已经存在于/etc/ppp/options中。如果不是,请将它们添加到你的/etc/ppp/options.ttyS1中。因此,如果本地系统是 192.168.1.1,远程系统是 10.1.1.1,那么/etc/ppp/options.ttyS1在本地系统上应该是:
crtscts
mru 576
mtu 576
passive
192.168.1.1:10.1.1.1
-chap
modem
#noauth
-pap
persist
#maxfail 0
#holdoff 10
远程系统上的 options.ttyS1 应该是:
crtscts
mru 576
mtu 576
passive
10.1.1.1:192.168.1.1
-chap
modem
#noauth
-pap
persist
#maxfail 0
#holdoff 10
passive 选项限制了(重新)连接尝试的次数。persist 选项将在断开连接或首次无法连接时保持 pppd 存活。如果你在同时进行文件传输(FTP 或网页浏览)时经常使用 telnet,你可能希望使用较小的 MTU 和 MRU,例如 296。这将使远程系统响应更快。如果你不太关心在 FTP 期间使用 telnet,你可以将 MTU 和 MRU 设置为 1500。但请记住,UDP 不能被分片。Speakfreely 例如使用 512 字节的 UDP 数据包。因此,speakfreely 的最小 MTU 为 552 字节。对于某些较新的发行版,可能需要 noauth 选项。对于较新的 PPPD,可能需要 `maxfail 0'。连接丢失后,PPPD 将等待一段时间再重新连接。此时间可以使用 holdoff 选项设置。默认的 holdoff 曾经是 30 秒,但现在为零。通常建议使用 10 的 holdoff 值。

3.2. 脚本

3.2.1. 启动 pppd 并保持其运行

你可以从启动 (rc) 脚本启动 pppd。但是,如果你这样做,并且 pppd 终止,你将失去链接。更稳定的解决方案是从/etc/inittab;

s1:23:respawn:/usr/sbin/pppd /dev/ttyS1 115200
启动 pppd。这样,pppd 将在终止时重新启动。确保你使用了 `-detach' 选项(在较新的系统上是 nodetach),否则 inittab 将启动 pppd 的多个实例,同时抱怨“respawning too fast”(重生太快)。

注意:一些较旧的系统不接受 `115200' 的速度。在这种情况下,你将必须将速度设置为 38400,并使用 setserial 设置 `spd_vhi' 标志。一些系统希望你使用 `cua' 而不是 `ttyS' 设备。

3.2.2. 设置路由

默认路由可以使用 defaultroute 选项或使用/etc/ppp/ip-up脚本设置:

#!/bin/bash
case $2 in
     /dev/ttyS1)
          /sbin/route add -net 0.0.0.0 gw Rem_Ip netmask 0.0.0.0
          ;;
esac
Ip-up 也可以用于使用 netdate 同步你的时钟。

当然,在 ip-up 中设置的路由不一定是默认路由。你的 ip-up 设置到远程网络的路由,而远程系统上的 ip-up 脚本设置到你的网络的路由。如果你的网络是 192.168.1.0,你的 ppp 接口是 192.168.1.1,则远程机器上的 ip-up 脚本看起来像这样:

#!/bin/bash
case $2 in
   /dev/ttyS1)
      /sbin/route add -net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0
      ;;
esac
`case $2' 和 `/dev/ttyS1)' 位用于在你使用多个 ppp 链接的情况下。Ip-up 将在每次链接建立时运行,但只有 `/dev/ttySx)' 和 `;;' 之间的部分将被执行,为正确的 ttyS 设置正确的路由。你可以在 Linux 网络指南 的路由部分找到更多关于路由的信息。

一些系统使用动态 tty,在这种情况下,你不能基于 tty 进行路由。在这种情况下,将 IP 地址转换为 ppp 接口,然后基于 ppp 接口进行路由(和防火墙设置)可能会很方便。为此,我编辑了/etc/ppp/ip-up;

# These variables are for the use of the scripts run by run-parts
PPP_IFACE="$1"
PPP_TTY="$2"
PPP_SPEED="$3"
PPP_LOCAL="$4"
PPP_REMOTE="$5"
PPP_IPPARAM="$6"
export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM

# translate ip to ppp
echo $PPP_IFACE > "/var/run/ppp/if-$PPP_LOCAL"
sleep 1
# Rerun firewall.
/usr/local/sbin/rc.block

# Take care of the (default) route(s)
case $PPP_LOCAL in
	"My_Ip_Address")
		/sbin/route add -net 0.0.0.0 gw $PPP_REMOTE netmask 0.0.0.0
		;;

esac

# Fix things missed at boot
if ! ( netstat -an | grep 'My_Ip_Address:53' > /dev/null 2>&1 )
then
	# Just booted
	# Sync clock
	/usr/local/sbin/ntpdate.sh &
	# Set the null routes
	/usr/local/sbin/null-route.sh &
	# Bind 9 needs this;
	sleep 1
	/etc/init.d/bind9 restart
fi

# An audiable notification
/bin/echo -ne "\007" >> /dev/tty1
将 'My_Ip_Address' 替换为你的 IP 地址。/usr/local/sbin/ntpdate.sh同步时钟。它停止 NTPD,使用 ntpdate 进行同步,然后再次启动 NTPD。/usr/local/sbin/null-route.sh是一个设置空路由的脚本:
#!/bin/bash
route add -net 10.0.0.0    netmask 255.0.0.0   reject
route add -net 172.16.0.0  netmask 255.240.0.0 reject
route add -net 192.168.0.0 netmask 255.255.0.0 reject
如果你正在使用 RFC 1918 地址,则只要你使用较小的网络掩码,上述空路由就不会干扰。网络 192.168.1.0/24 不会受到空路由 192.168.0.0/16 的影响;
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
255.255.255.255 0.0.0.0         255.255.255.255 UH    0      0        0 eth1
195.190.249.4   0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.0.0     -               255.255.0.0     !     0      -        0 -
172.16.0.0      -               255.240.0.0     !     0      -        0 -
10.0.0.0        -               255.0.0.0       !     0      -        0 -
0.0.0.0         195.190.249.4   0.0.0.0         UG    0      0        0 ppp0

3.3. 测试

像调制解调器测试一样测试整个过程。如果它工作正常,骑上自行车并将远程调制解调器带到链接的远程端。如果它不工作,你应该检查的一件事是 COM 端口速度;显然,一个常见的错误是使用 Minicom 配置调制解调器的速度,然后配置 pppd 使用另一个速度。这是不可行的!你必须始终使用相同的速度!