是否可以将Linux中的TCP隧道公开为特殊字符设备?


10

最近,我在QNX文档中发现,它允许使用串行设备(dev/serX)在单独的物理计算机上的进程之间建立基于消息的IPC ,这使我感到奇怪:

在Linux中是否可以为TCP / UDP隧道创建系统范围的特殊设备?像nc标准输入/输出/ dev /下的东西公开曝光。

最后,我希望能够在一台机器上向此类文件写入内容,然后在另一端接收该文件,例如:

#machine1:
echo "Hello" > /dev/somedev

#machine2:
cat < /dev/somedev

我看了看人,nc但是除了stdio之外,我没有找到任何指定io源/目标的选项。



1
值得一提的是:tun / tap设备可以在/ dev中创建,但是您必须自己对它们进行IP封装。对于某些用途极为有用。
pjc50 '16

Answers:


19

socat 可以做到这一点,还有很多类似“流”的事情

使用此基本思想的东西应该为您完成:

Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave

Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321

(改编自“ 示例页面”

如果要加密,可以ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork在machine1上使用一个变体,例如ssl:server-host:1443,cert=client.pem,cafile=server.crt在machine2上使用

(有关socat ssl的更多信息)


7

消息传递需要在更高的层次上实现;TCP没有消息的概念-TCP连接传输八位字节流。

你可以实现的东西排序像你要求什么nc命名管道,请参阅man mkfifo; 或socat按照Alex Stragies的指示进行检查。

没有中间层服务,基本问题是:(1)除非另一端有人在监听数据,否则无法将数据写入网络;(2)TCP连接是双向的。

因为除非有人正在侦听,否则您无法将数据写入网络,因此必须始终启动侦听器,然后才能发送数据。(在消息传递系统中,处理消息的过程将提供某种缓冲。)

您的示例可以轻松地重写:

  • 首先在machine2(目标)上启动一个侦听器:

     nc -l 1234 | ...some processing with the received data...
    

    在您的示例中,这将是

     nc -l 1234 | cat
    

    这将阻止并等待某人将某些数据发送到端口1234。

  • 然后,您可以从machine1(源)发送一些数据:

    ...make up some data... | nc machine2 1234
    

    在您的示例中,这将是

     echo "Hello" | nc machine2 1234
    

如果要以某种方式处理接收到的数据并做出响应,则可以使用Shell的协同处理工具。例如,这是一个非常简单(也很固执)的Web服务器:

#! /bin/bash

while :; do
  coproc ncfd { nc -l 1234; }
  while :; do
    read line <&${ncfd[0]} || break
    line="$(
      echo "$line" |
      LC_ALL=C tr -cd ' -~'
    )"
    echo >&2 "Received: \"$line\""
    if [ "$line" = "" ]; then
      echo >&${ncfd[1]} "HTTP/1.0 200 OK"
      echo >&${ncfd[1]} "Content-Type: text/html"
      echo >&${ncfd[1]} "Connection: close"
      echo >&${ncfd[1]} ""
      echo >&${ncfd[1]} "<title>It works!</title>"
      echo >&${ncfd[1]} "<center><b>It works!</b></center>"
      echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
      break
    fi
  done
  kill %%
  sleep 0.1
done

了解如何使用数组中的文件描述符在脚本主体和协同进程之间实现双向通信$ncfd


您说得对,我已经在答案中承认了这一点。没有某种中介软件就无法拥有字符设备。
AlexP

看起来您那里有一个UUOC。
迈克尔·汉普顿

1
@MichaelHampton:那是OP提供的示例。我想这cat代表“标准输入的一些过程阅读”。
AlexP

5

如果您只想使用nc之类的基本程序连接两台计算机,则可以从/重定向/dev/tcp/<host>/<port>

这些不是实际的设备,而是由bash创建的小说,因此类似的东西cat /dev/tcp/foo/19将不起作用,但cat < /dev/tcp/foo/19会起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.