我正在尝试从一台本地机器(坐在家里)与一台科学仪器(SCIENTIFIC,IP=192.168.1.109)进行通信,该仪器与一台树莓派(服务器)一起位于远程网络中。SCIENTIFIC 在 udp 端口 12109 上接收订单,并通过端口 12000 上的 udp 广播进行应答。
首先,我可以按照说明向 INSTRUMENT 发送订单这里使用 TCP-UDP 中继。我首先设置了从本地机器到服务器的 SSH 隧道。
toto@LOCAL:~$ ssh -L 8001:localhost:8001 Raspberry_ext
其中 Raspberry_ext 允许通过多台 Linux 机器反弹以通过服务器。然后,在服务器上,我启动:
pi@raspberrypi:~ $ socat tcp4-listen:8001,reuseaddr,fork udp:192.168.1.109:12109
然后在本地:
toto@LOCAL:~$ socat -T15 udp4-recvfrom:12109,reuseaddr,fork tcp:localhost:8001
通过这种方式,我确实可以从 LOCAL 向 INSTRUMENT 发送命令:
toto@LOCAL:~$ nc -u localhost 12109
*IDN?
确实,在服务器上,我可以毫无困难地看到答案:
pi@raspberrypi:~ $ nc -u -l 12000
LHLM-137F
但是,我无法捕获来自 INSTRUMENT 的 UDP 广播并通过 SERVER 将其隧道传输回 LOCAL。我尝试创建另一个 ssh 隧道:
toto@LOCAL:~$ ssh -L 8000:localhost:8000 Raspberry7_ext
但是,我不知道如何处理 UDP 广播。我尝试了以下方法:
pi@raspberrypi:~ $ socat -T15 udp4-recvfrom:12000,reuseaddr,fork tcp:localhost:8000
但是在本地,我不知道如何捕获来自端口 8000 的流量。我的天真尝试失败了:
toto@LOCAL:~$ socat tcp-listen:8000,fork udp:localhost:12000
2020/03/13 00:39:26 socat[10654] E bind(5, {AF=2 0.0.0.0:8000}, 16): Address already in use
谢谢
答案1
最后,我创建了一个反向 SSH 隧道,并设法通过它从端口 12000 发回 UDP 数据包。
最好的,