使用 INTERFACE 选项通过 SOCAT 的 PPPd

PPPd over SOCAT using INTERFACE option

我的 objective 是使用 pppd 而不是 socat。我有两个 Ubuntu 盒子,它们的 eth0 相互连接(物理)。我可以 ping 通这两个 IP 地址。我在每个 Ubuntu 框上执行以下操作。

  1. 创建一个伪串行设备并link它到我的网络接口"eth0"。
    socat PTY,link=/dev/ttyp10 INTERFACE:eth0
  2. 在此伪串行设备上使用 pppd。
    设备A:
    pppd noauth /dev/ttyp10 10.10.10.10:20.20.20.20
    设备 B:
    pppd noauth /dev/ttyp10 20.20.20.20:10.10.10.10

我发现我的 ppp0 接口创建时间很短,但我无法 ping 通这两个 IP 地址(10.10.10.10 或 20.20.20.20)。我知道我的解决方案并不完整,因为我需要指定必须如何从我的 eth0 接口路由我的 pppd 数据包,但不确定该怎么做(我在 eth0 接口上使用 tcpdump 并找到了一些数据)。

我通过将 socat 绑定到 TCP server/client 尝试了相同的实验并且成功了。

设备A:
1. socat pty,link=/dev/ttyp10,raw,echo=0 TCP4-LISTEN:7001,reuseaddr &
2. pppd noauth /dev/ttyp10 10.10.10.10:20.20.20.20

设备 B:
1. socat pty,link=/dev/ttyp10,raw,echo=0,waitslave TCP4:20.1.1.2:7001 &
2. pppd noauth /dev/ttyp10 20.20.20.20:10.10.10.10

注意:20.1.1.2 是设备 A 的 "eth0" IP 地址。这样我的 ppp0 接口就启动了,我可以 ping 两个 IP 地址(10.10. 10.10 和 20.20.20.20).

当我有一个可用的 eth0 接口时,为什么我需要使用伪串行设备是另一个问题,我们不讨论这个。

您可能想要改编取自 socat 手册页的示例:

socat PTY,link=/var/run/ppp,rawer INTERFACE:hdlc0

circumvents the problem that pppd requires a serial device and thus might not be able to work on a synchronous line that is represented by a network device. socat creates a PTY to make pppd happy, binds to the network interface hdlc0, and can transfer data between both devices. Use pppd on device /var/run/ppp then.

本例中,接口为同步线路(OS视为HDLC接口)。 pppd 使用(默认)HLDC-like framing,因此将原始数据从 pppd 传输到 HDLC 设备是有意义的。

在您的情况下,您使用的是以太网设备,做同样的事情没有多大意义。

在你的第二个例子中,你设法通过 TCP 传输你的 PPP 会话,这是一个非常简单和可行的选择。针对您的情况,另一种解决方案是使用 PPPoE,它专为通过以太网传输 PPP 而设计。