iptables通过虚拟接口转发

我试图将我的计算机configuration为两个networking之间的网关,但由于某些原因我无法正常工作

这是一个networking的表示:

192.168.1.101 192.168.1.102 192.168.1.103 ... | | | \------------+------+-------+--------... | 192.168.1.200 (eth1) PC (192.168.2.101 192.168.2.102 192.168.2.103 ...) eth0:1 eth0:2 eth0:3 | | | \------------+------+-------+--------... | 192.168.2.200 (eth0) | ... 

我的电脑在接口192.168.2.200(eth0)上有N个虚拟接口(eth0:*)和自己的IP地址。 我希望任何连接(主要是TCP)攻击eth0:*接口的连接都被转发到等效的192.168.1.1 **服务器。

我尝试使用redir可执行文件,但由于服务器使用随机端口号进行侦听(不能改变这一点),我不得不重新启动进程,每次我做了一些testing。

所以我用这样的iptables规则(只有一台服务器进行testing):

 iptables -t nat -A PREROUTING -d 192.168.2.101 -j DNAT --to-destination 192.168.1.101 iptables -t nat -A POSTROUTING -d 192.168.1.101 -j SNAT --to-source 192.168.2.101 iptables -A FORWARD -i 192.168.2.101 -d 192.168.1.101 -j ACCEPT 

但是任何到192.168.2.101:80的连接都将返回“连接被拒绝”,而任何到192.168.1.101:80的连接都被接受。

然后,我用iptables规则“玩”了,而没有重新设置规则,我成功连接到了192.168.2.101:80这实际上是正确的服务器; 但是当我尝试另一个连接(与TCP / 6666上的临时Web服务器),连接已被拒绝,如上所述。

你有一个完整的例子,使其工作吗?

注意:我删除了iptables中的每个条目来做其他testing,所以我从头开始重新开始,而没有做过我之前做的事情。

@lain:我启用了IP转发

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

iptables有一个适合你的匹配:它被称为NETMAP

 iptables -t nat -A PREROUTING -i eth0 --src 192.168.2.200/?? -j NETMAP --to 192.168.1.0/?? iptables -t nat -A PREROUTING -i eth1 --src 192.168.1.200/?? -j NETMAP --to 192.168.2.0/?? 

至于你的接口别名,沟渠他们。 不仅是接口别名不赞成(如果你使用ip addr ,你会看到内核将它们映射到它的本地function,通过接口有几个地址),但在这里似乎矫枉过正,因为没有本地服务使用它们。

如果这台主机在eth0中应答这些ip的ARP请求,请使用ARP代理function或添加一条本地路由,告诉内核所有这些IP都是自己的:

 ip route add local 192.168.2.200/?? dev eth0