使用 INTERFACE 选项通过 SOCAT 的 PPPd
PPPd over SOCAT using INTERFACE option
我的 objective 是使用 pppd 而不是 socat。我有两个 Ubuntu 盒子,它们的 eth0 相互连接(物理)。我可以 ping 通这两个 IP 地址。我在每个 Ubuntu 框上执行以下操作。
- 创建一个伪串行设备并link它到我的网络接口"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 接口创建时间很短,但我无法 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 而设计。
我的 objective 是使用 pppd 而不是 socat。我有两个 Ubuntu 盒子,它们的 eth0 相互连接(物理)。我可以 ping 通这两个 IP 地址。我在每个 Ubuntu 框上执行以下操作。
- 创建一个伪串行设备并link它到我的网络接口"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 接口创建时间很短,但我无法 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 而设计。