如何将 Linux 主机中的端口范围路由到客户虚拟机?

如何将 Linux 主机中的端口范围路由到客户虚拟机?

我正在尝试将 Linux 主机中的某个端口范围重定向到其某个来宾虚拟机。我希望此重定向应用于主机的所有接口,包括本地主机。我可以这样做:

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 主机内部的流量。

希望说得清楚,如果我弄错了术语,请原谅。

答案1

显然,对环回流量执行 DNAT 是不可能的 — — 例如,参见这个问题, 或者这个 debian-user 讨论。使用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
}

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

答案2

本地数据包不会进入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

相关内容