关于根据不同访问者 IP 定向不同的后端

我使用 ipvsadm 建了两个基于 TUN 方式的 LVS

219.22.33.11:8080 -> 219.23.66.22:8080
219.22.33.11:8081 -> 219.23.66.22:8081

然后我想利用 iptables 来根据不同的用户 IP 来定向访问:

/sbin/iptables -t nat -i eth0 -A PREROUTING -p tcp -s 221.216.10.32/32 -d 219.22.33.11 --dport 80 -j REDIRECT --to 219.22.33.11 --to-ports 8080
/sbin/iptables -t nat -i eth0 -A PREROUTING -p tcp -s 219.23.39.21/32 -d 219.22.33.11 --dport 80 -j REDIRECT --to 219.22.33.11 --to-ports 8081

简单来说,我建了两个监听在不同端口的 LVS,然后利用 iptables 判断用户的 IP 地址,并将 80 口的请求定向至相应的 LVS 端口。

访问 8080 或 8081 的 LVS 是可以的,但是访问 80 端口,希望 iptables 可以定向,但是好像并不生效。

Forums:

我用 -j REDIRECT 的时候,显示以下错误:

macmini:~ root# telnet 219.22.33.11 80
Trying 219.22.33.11...
telnet: connect to address 219.22.33.11: Connection refused
telnet: Unable to connect to remote host

后台我改成用:

/sbin/iptables -t nat -i eth0 -A PREROUTING -p tcp -s 221.216.10.32/32 -d 219.22.33.11 --dport 80 -j DNAT --to-destination 219.22.33.11:8011

错误信息变成:
macmini:~ root# telnet 219.22.33.11 80
Trying 219.22.33.11...
telnet: connect to address 219.22.33.11: Operation timed out
telnet: Unable to connect to remote host

这样看上去,使用 --to-destination 而不是使用 -j REDIRECT。目标是成功转换了,只是数据返回的路径不对。但现在不清楚会是哪一步出了问题。

real server去回包给客户端,是用8080或者8081去回的吧,你可能需要再到real server那里继续转换

我担心本方式行不通,iptables 把目标80端口转发到了8081,最终服务器219.23.66.22返回时TCP包上面写的源端口是8081,而真实客户端请求的端口是80,结果是客户端把收到的包抛弃了.