如何在 BSD / OS X 上将所有 UDP 流量从一个端口重定向到另一个端口?

如何在 BSD / OS X 上将所有 UDP 流量从一个端口重定向到另一个端口?

Mac OS X 10.9.5正在运行boot2docker,想暂时将非特权 UDP 端口 69 转发到boot2docker虚拟机的端口 69。 Virtualbox 仅支持转发特权端口。

我尝试过socat像这样运行:

socat UDP-LISTEN:69,fork,reuseaddr UDP:192.168.59.101:69

它工作得很好,直到我尝试建立tftp连接,然后它崩溃了:

socat[32232] E bind(5, {LEN=16 AF=2 0.0.0.0:69}, 16): Address already in use

检查netstat -an并没有显示 UDP 有多少开放:

udp6       0      0  *.58669                *.*
udp4       0      0  *.58669                *.*

唯一相关的事情我在网上找到的并没有太大帮助。

在 Mac OS X 上,将 UDP 流量从一个端口“镜像”到另一个端口的好方法是什么?

答案1

我尝试了以下步骤,应该工作,但确实不是在 Mac 上工作(将端口 20 UDP 文本消息转发到端口 29),但您可能想尝试一下:

  1. cd /tmp
  2. mkfifo backpipe
  3. sudo nc -ulk 20 0<backpipe |sudo nc -ulk 29 | tee backpipe
  4. 在另一个终端上 - 测试它echo -n “this is a test” | sudo nc -4u -w1 localhost 20

可能是用法被破坏或者 fifo 特殊文件无法工作。

然而,我找到了一种“更简单”的方法。

  1. 下载一个非常小的 c 程序源文件,名为:udp_redirect(点击此处下载)
  2. 编译它gcc -w udp_redirect.c -o udp_redirect
  3. 在后台运行它sudo ./udp_redirect 127.0.0.1 20 127.0.0.1 29 &
  4. 在29端口设置监听来测试sudo nc -ul 29
  5. 在第二个终端上,使用以下命令进行测试echo “this is a test” | sudo nc -4u -w1 localhost 20

此测试将 UDP 文本消息发送到端口 20,并观察第一个终端中端口 29 上的侦听器打印消息。您还可以在端口 20 上设置侦听器,然后查看没有可用消息,它们全部转发(不重复)到端口 29。

我说它“更容易”,因为udp_redirect二进制文件的使用更容易,不需要特殊的 fifo 文件,不需要管道,不需要nc实用程序,最重要的是,它可以工作!

答案2

这是一适用于 MacOS 和 Linux 的替代 UDP 重定向器;除了通常的源/目标之外,它还支持指定源/目标接口,以及丢弃 martians(来自未知来源的 UDP 数据包)。

您可以将其运行为:

./udp-redirect \
    --listen-port 69 \
    --connect-address 192.168.59.101 --connect-port 69

免责声明:我是作者,我现在在这篇文章中使用它来重定向 Wireguard 流量。

相关内容