3

我的目标是在 socat 上使用 pppd。我有两个带有 eth0 的 Ubuntu 盒子(物理上)相互连接。我可以 ping 两个 IP 地址。我在每个 Ubuntu 机器上执行以下操作。

  1. 创建一个伪串行设备并将其链接到我的网络接口“eth0”。
    socat PTY,link=/dev/ttyp10 接口: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)。我知道我的解决方案不完整,因为我需要指定我的 pppd 数据包必须如何从我的 eth0 接口路由但不知道该怎么做(我在 eth0 接口上使用了 tcpdump 并找到了一些数据)。

我通过将 socat 绑定到 TCP 服务器/客户端尝试了相同的实验,它成功了。

设备 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 接口时,为什么我需要使用伪串行设备是一个不同的问题,我们不讨论这个问题。

4

1 回答 1

3

您可能想要修改从socat手册页中获取的这个示例:

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

规避了 pppd 需要串行设备,因此可能无法在以网络设备为代表的同步线路上工作的问题。socat 创建一个 PTY 让 pppd 开心,绑定到网络接口 hdlc0,并且可以在两个设备之间传输数据。然后在设备 /var/run/ppp 上使用 pppd。

在此示例中,接口是同步线路(操作系统将其视为 HDLC 接口)。pppd使用(默认情况下)类似HLDC 的框架pppd,因此将原始数据从管道传输到 HDLC 设备是有意义的。

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

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

于 2016-03-15T08:58:00.750 回答