我的目标是使用 pppd 而不是 socat。我有两个 eth0 相互连接(物理)的 Ubuntu 盒子。我可以 ping 通这两个 IP 地址。我在每个 Ubuntu 盒子上执行以下操作。
- 创建一个伪串行设备并将其链接到我的网络接口(interface)“eth0”。
socat PTY,link=/dev/ttyp10 INTERFACE:eth0 - 在这个伪串行设备上使用 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 接口(interface)创建时间很短,但我无法 ping 两个 IP 地址(10.10.10.10 或 20.20.20.20)。我知道我的解决方案并不完整,因为我需要指定必须如何从我的 eth0 接口(interface)路由我的 pppd 数据包,但不确定该怎么做(我在 eth0 接口(interface)上使用了 tcpdump 并找到了一些数据)。
我通过将 socat 绑定(bind)到 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 接口(interface)就启动了,我可以 ping 两个 IP 地址(10.10.10.10 和 20.20.20.20)。
当我有一个可用的 eth0 接口(interface)时,为什么我需要使用伪串行设备是另一个问题,我们不讨论这个问题。
最佳答案
您可能想要改编取自 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.
在这个例子中,接口(interface)是一条同步线路(被操作系统视为HDLC接口(interface))。 pppd
使用(默认)HLDC-like framing因此将原始数据从 pppd
传输到 HDLC 设备是有意义的。
在您的情况下,您使用的是以太网设备,做同样的事情没有多大意义。
在您的第二个示例中,您设法通过 TCP 传输 PPP session ,这是一个非常简单且可行的选项。您的另一种解决方案是使用 PPPoE专为通过以太网传输 PPP 而设计。
关于linux - 使用 INTERFACE 选项通过 SOCAT 的 PPPd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35998803/