如何将Linux主机中的端口范围路由到来宾VM?


1

我试图将Linux主机中的某个端口范围重定向到其客户虚拟机之一。我希望这个重定向适用于所有主机的接口,包括localhost。我能做到:

iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -I PREROUTING -p tcp --dport 8000:8500 -j DNAT --to 192.168.122.158

其中8000:8500是我感兴趣转发的范围,192.168.122.158是客人的IP。只要我尝试从另一台计算机(即不是VM主机)进行连接,这就可以正常工作。但我也希望能够转发源自VM主机的流量。

希望很清楚,如果我修改了术语,那就很抱歉。

Answers:


1

显然不可能为环回流量执行DNAT - 例如,请参阅此问题此debian用户讨论。使用REDIRECT是因为流量保留在环回接口上,但将流量转发到另一台机器不起作用。

您可以使用用户空间程序转发TCP连接 - 例如,xinetd使用以下配置将端口8000转发到您的VM:

service forward_8000
{
        type                    = UNLISTED
        port                    = 8000
        socket_type             = stream
        wait                    = no
        user                    = root
        redirect                = 192.168.122.158 8000
}

但是,不可能以这种方式重定向一系列端口 - 每个端口都需要单独的服务定义。


谢谢。我发现rinetd比xinetd更容易设置这个端口数量。我给你奖励,因为你提供了尽可能接近权威的答案。照顾自己。
samwise

0

本地数据包不会进入PREROUTING链。我相信你需要使用OUTPUTNAT表中的链来做到这一点:

iptables -t nat -I OUTPUT -p tcp --dport 8000:8500 -j DNAT --to 192.168.122.158

您可能还需要向过滤器链添加一条规则,以允许这些出站及其相关数据包:

iptables -I OUTPUT -m state -d 192.168.122.158 --state NEW,RELATED,ESTABLISHED -j ACCEPT

这似乎不起作用。我得到相同的结果,即telnet localhost 8000无法连接(我在端口8000上的VM上运行的东西)

您可能还需要添加规则以允许数据包输出。(您的FORWARD规则的对应部分。)我建议您使用tcpdump检查数据包,以便了解实际发生的情况。
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.