我正在尝试将 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
链。我相信您需要使用OUTPUT
NAT 表中的链来做到这一点:
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