socat:通过TTY隧道IP

7
使用socat工具,能否通过类似ttyS0的串行(调制解调器)设备建立双向IP隧道?我尝试使用TUN选项,但仍无法获得结果。欢迎任何建议 :)
更新:
PC1:
socat /dev/ttyUSB0,raw,echo=0,b57600,clocal TUN:192.168.1.1/24,up

PC2:

socat /dev/ttyUSB0,raw,echo=0,b57600,clocal TUN:192.168.1.2/24,up

在此之后,我看到两端都有正确地址的tun0接口,但我无法从一个端口ping另一个端口。相反,当我使用ping -c 1 192.168.1.1发送数据时,远程socat进程退出并销毁其tun0设备。有什么建议吗?

更新2:

当我们只使用socat在串行通信上创建TCP/IP隧道时存在封装问题。socat的开发人员Gerhard Rieger告诉我:

恐怕你是对的。通过数据报套接字工作的tun, 并且 - 凭借运气 - 也适用于管道。 但是,在串行线上,数据包边界可能会消失, 当将数据发送到tun接口时,这是致命的。

很抱歉现在无法提供基于socat的解决方案。 但是,我将尝试在稍后的2版中集成一些封装。


1
你知道PPP(和pppd)是设计来做这个的... - ysdx
@ysdx 是的,但 pppd 解决了不同的问题。 - Ilya Matveychikov
2个回答

8

哈哈,我工作了,但需要一些魔法 :)

因此,请配置第一个节点:

PC1:
1) slattach -L -s 57600 -p slip /dev/ttyUSB0 &
2) ifconfig sl0 up
3) socat TUN:192.168.1.1/24,up INTERFACE:sl0 &

...并且在第二个对等方上类似于这样的东西:

PC2:
1) slattach -L -s 57600 -p slip /dev/ttyUSB0 &
2) ifconfig sl0 up
3) socat TUN:192.168.1.2/24,up INTERFACE:sl0 &

现在,您可以成功地从一个PC ping另一个PC:

PC1:
1) ping -c 5 192.168.1.2

PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_req=1 ttl=64 time=348 ms
64 bytes from 192.168.1.2: icmp_req=2 ttl=64 time=551 ms
64 bytes from 192.168.1.2: icmp_req=3 ttl=64 time=557 ms
64 bytes from 192.168.1.2: icmp_req=4 ttl=64 time=549 ms
64 bytes from 192.168.1.2: icmp_req=5 ttl=64 time=348 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 348.116/471.143/557.128/100.177 ms

这有点棘手,因为它使用了slattach,但实际上任何其他解决方案都必须像SLIP一样使用某些方法来组织串行线上的帧。例如,PPP使用类似于HDLC的帧。


当你使用slattach时,为什么不直接在SLIP接口上配置地址呢?我可以理解试图在TTY中进行隧道传输作为一种快速而肮脏的临时措施的意义,但这并不适用于此解决方案。 - pilona

3

根据我的尝试,你不需要使用 socat 来建立隧道。 你可以只需执行以下操作:

PC1:
 1, sudo slattach -s 19200 -p slip -dL /dev/ttyUSB0
 2, sudo ifconfig sl0 10.0.0.1/24 up
 3, sudo route add default gw 10.0.0.254 sl0

PC2:
 1, sudo slattach -s 19200 -p slip -dL /dev/ttyUSB0
 2, sudo ifconfig sl0 10.0.0.2/24 up
 3, sudo route add default gw 10.0.0.254 sl0

设置完成后,我可以从PC1 ping通PC2,反之亦然。

还有一个前提条件:您的Linux内核必须加载了SLIP模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接