ubuntu 转发端口到另一台机器

ubuntu 转发端口到另一台机器

我正在迁移服务器,并且我想在 DNS 切换时将现有机器上的端口 80 转发到新机器上的端口 80。

我正在运行 Ubuntu 10.04 服务器并尝试按照以下指南进行操作http://www.simplehelp.net/2009/04/15/how-to-redirect-traffic-to-another-machine-in-linux/

我已经跑了

# echo 1 >/proc/sys/net/ipv4/ip_forward

但是当我运行下一个命令时出现错误:

#iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 122.164.34.240
iptables: No chain/target/match by that name.

似乎我那里没有 nat 表。这是 iptables -L 的输出:

iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

没有 nat 表。

我需要做什么才能将其转发到另一台机器?

注意:我了解 rinetd,我甚至可以让 Web 服务器代理请求到新服务器。我尝试这样做是为了让日志仍然有意义(而不是有大量日志表明源 IP 是旧服务器)

编辑:感谢 Eduardo,问题在于教程错误地说出了“-D PREROUTING”,这是删除规则的命令,应该读作“-A PREROUTING”。

但是它仍然不起作用。我正在做的是:机器 1:192.168.56.150 机器 2:192.168.56.151 我想将机器 1 重定向到机器 2。在机器 1 上我运行了:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.56.151

在机器 2 上我运行了:

echo 1 > /proc/sys/net/ipv4/ip_forward #not sure if this is necessary, it didn't work at first so I ran this here too
iptables -t nat -A POSTROUTING -p tcp -d 192.168.56.151 --dport 80 -j MASQUERADE

在我的工作站上,我尝试 wgethttp://192.168.56.150期望它能从机器 2 给出响​​应(并且机器 2 的日志中会有我的工作站的 IP) - 但是我只是得到连接超时。我检查了机器 2,它响应正确。

答案1

尝试-D PREROUTING用替换-A PREROUTING。您正在尝试删除不存在的规则。我看教程中多次重复出现同样的错误 - 只需-A在任何地方使用即可。

另外,您还可以使用它iptables -nvL -t nat来查看 NAT 表。

答案2

两条 iptables 规则都需要在旧机器 1 上运行。新机器 2 上不需要任何特殊规则。

要排除故障,请查看输出中的计数器iptables -t nat -L -n -v并使用tcpdump它来验证地址是否被正确转换。

使用 MASQUERADE 可能会导致意外问题。本来不应该出现这种情况,但根据我的经验,我发现使用 SNAT 更可靠。

我通常使用如下的一个小 Bash 脚本来实现这一点:

#!/bin/bash

OLDIP=192.168.5.5
NEWIP=192.168.56.151
PORT=80

echo 1 > /proc/sys/net/ipv4/ip_forward

# flush old nat rules
iptables -F -t nat

# destination is redirected to new server
iptables -t nat -A PREROUTING -p tcp --dport 80 -d $OLDIP -j DNAT --to $NEWIP

# source on the redirected packets should be us (the old server), and not original client
iptables -t nat -A POSTROUTING -p tcp --sport 80 -d $NEWIP -j SNAT --to $OLDIP

但是这些规则可能有点贪婪;如果可能的话,最好使用 -i 和 -o 指定接口。

相关内容