通过虚拟接口进行 iptables 转发

通过虚拟接口进行 iptables 转发

我正在尝试将我的计算机配置为两个网络之间的网关,但由于某些原因我无法使其工作

以下是网络的表示:

 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 地址。我希望任何攻击 eth0:* 接口的连接 (主要是 TCP) 都转发到等效的 192.168.1.1** 服务器。

我尝试使用重新定位可执行文件,但是由于服务器使用随机端口号进行监听(无法更改这一点),因此每次进行测试时我都必须重新启动进程。

因此我使用了如下的 iptables 规则(仅针​​对一台服务器进行测试):

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 中的每个条目来进行其他测试,因此我从头重新启动,而没有执行之前的操作...

@lain: 我启用了 IP 转发

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

答案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,您将看到内核将它们映射到其通过接口拥有多个地址的本机功能),而且在这里似乎有些矫枉过正,因为没有本地服务使用它们。

如果您希望此主机回答 eth0 中那些 IP 的 ARP 请求,请使用 ARP 代理功能或添加本地路由,告诉内核所有这些 IP 都是它自己的:

ip route add local 192.168.2.200/?? dev eth0

相关内容