【问题标题】:PPPd over SOCAT using INTERFACE optionPPPd over SOCAT 使用 INTERFACE 选项
【发布时间】:2016-03-14 21:53:16
【问题描述】:

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

  1. 创建一个伪串行设备并将其链接到我的网络接口“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)。我知道我的解决方案不完整,因为我需要指定我的 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 接口时为什么我需要使用伪串行设备是一个不同的问题,我们不讨论这个问题。

【问题讨论】:

  • 你想要实现的协议栈是什么?
  • @ysdx 我想通过 PPP 发送 IP,但由于 PPP 需要一个串行端口,所以我使用 SOCAT 来弥补这个差距。希望我已经回答了你的问题。

标签: linux shell networking socat pppd


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 同意,我想处理原始 pppd 数据包。我仍然使用 SOCAT 从伪终端输入数据并将其路由到 TCP 套接字。我编写了一个应用程序来连接到这个 TCP 套接字(由 SOCAT 创建)并处理原始 pppd 数据包。
  • 我发现pppd 在尝试使用由socat 创建的符号链接时有时会给出“拒绝访问”。解决方案是在pppd 的参数列表中使用"$(realpath /tmp/uart)"(或者可能readlink 也可以)代替"/tmp/uart",因此它获得了虚拟设备的直接路径,而不是指向它的符号链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 2015-10-17
  • 2020-07-18
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多