每个可执行 UDP 端口重定向是否可行?

每个可执行 UDP 端口重定向是否可行?

我有一个黑盒程序,它监听特定的 UDP 端口。我希望它监听我选择的 UDP 端口。

有没有办法诱使可执行文件监听不同的端口。我猜想存在一个可以注入 LD_PRELOAD 的库,它可以拦截系统调用并实现这一点。

当然,虚拟机是强有力的选择。

答案1

您可以使用 iptables 将一个端口转发到另一个端口。这只适用于外部连接,因为当流量是本地流量时(即从 127.0.0.1 到 127.0.0.1 等等),不会参考以下解决方案使用的 nat 表。

这还要求您在内核中启用转发,这可能是您不想面对的安全问题。

首先打开转发功能(如果尚未启用),方法是使用sysctl net.ipv4.ip_forward=1echo 1 > /proc/sys/net/ipv4/ip_forward。在这种情况下,您可能还应该将所有 iptables 策略设置为 DROP 而不是默认的 ACCEPT(不过这取决于您使用的 GNU/Linux 发行版),并只允许您想要通过的流量通过,而不是让所有内容自由流动。

然后,您可以向 nat PREROUTING 表添加一条规则,将发往端口 X 的流量重定向到端口 Y。例如,要将传入流量重定向到 TCP 端口 2222 到您的 SSH 服务器端口 TCP 22,请使用以下命令:iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22

有关端口重定向的更多信息和更详细的内容可以从各种搜索引擎获得,例如这里

答案2

更好的解决方案是使用 netcat。它也可以与本地主机连接,并且无需更改 sysctl。

整个技巧就是创建一个named pipe

 mkfifo mypipe

像这样使用它:

nc -k -l 2222 0<mypipe | nc localhost mySSHport 1>mypipe

创建此示例是为了让您使用 ssh 测试此命令。它将 ssh 连接从端口 2222 重定向到端口 mySSHport,无论端口是什么(22?)。

现在如果你尝试通过 ssh 进入 2222 端口,

 ssh me@localhost -p 2222

您将登录。

该标志-k指示 netcat 在第一次连接完成后继续监听。你可以将其插入无限 while 循环来提高其弹性:

while true; do
# echo "Listening..."
nc -k -l 2222 0<mypipe | nc localhost mySSHport 1>mypipe
done

当然,回到 OP,对于 UDP 端口,必须添加 -u 标志。

编辑:

我刚刚意识到,在运行 GNU 版本的 nc(netcat)的系统(如 Arch Linux)上,命令应该是

 nc -l -p 2222 0<mypipe | nc localhost mySSHport 1>mypipe

给您带来的不便,敬请谅解。

相关内容