将本地端口从 Raspbian 路由到另一台机器(端口隧道)

Route local port from Raspbian to another machine (port tunneling)

我想将带有 Raspbian 的 Raspberry 端口 5555 上的传入 tcp 流量路由到同一本地网络中的另一台机器和端口,并使其在重启后保持不变。

上下文

objective 是如果我在本地主机上访问 5555 上的服务,它将加载远程机器上的不同端口。最终目标是将端口 53 (DNS) 转发到另一台机器(非 53 端口),但与此同时,我正在使用 http: https://localhost:5555 进行测试,它应该加载 https://192.168.250.250:9999 where 192.168.250.250是我本地网络中的一台远程机器(所有本地网络均可访问,ping 192.168.250.250 有效)。

我试过的

像这样的网络资源很多。大多数依赖路由器上的 IP 转发,这在我的情况下不起作用,因为我试图重定向本地主机中主机内的端口以直接访问机器。其他的,对于端口隧道,都使用下面的方法:

iptables

sudo iptables -t nat -A PREROUTING -p tcp --sport 5555 -j DNAT --to-destination 192.168.250.250 --dport 9999

这没有用。我尝试了一些变体,包括:

sudo iptables -t nat -A PREROUTING -p tcp --sport 5555 -j DNAT --to-destination 192.168.250.250:9999

这没有用,尽管规则已注册:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp spt:5555 dpt:9999 to:192.168.250.250

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

我还安装了 iptables-persistent 以使其持久化,但它一开始并没有重定向。

我还尝试了该命令的变体,因为我认为我可能将“源”端口误解为目的地:

sudo iptables -t nat -A PREROUTING -p tcp -j DNAT --to-destination 192.168.250.250:9999 --dport 5555

进行任何这些更改后,我总是 运行:

sudo dpkg-reconfigure iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent restart

确保规则永久适用。我还尝试 this tutorial 在重新启动时加载配置。尽管如此,再一次,这只是不转发,它的永久方面在现阶段尚不清楚且次要。

socat

socat tcp-listen:5555,reuseaddr,fork tcp:192.168.250.250:9999

这很好用。然而,它并不持久。只要我 cntrl+c 终端,它就会停止重定向。

nc

sudo nc -l -p 5555 -c 'nc 192.168.250.250 9999'sudo nc -l -p 5555 192.168.250.250 9999

都没用。第一个抛出错误(-c 不存在)。后者什么都不做。

up tables 解决方案应该有效。但是,您必须检查您的 ipv4 转发并启用它(大多数 linux 发行版都没有 enabled/allowed),这可能是您的问题。

检查这个

$ cat /proc/sys/net/ipv4/ip_forward
0

0表示不允许ip_forwarding,内核不会执行。

要么

$ echo 1> /proc/sys/net/ipv4/ip_forward

或使用 sysctl

$ sysctl -w net.ipv4.ip_forward = 1