Linux

ubuntu 轉發埠到另一台機器

  • May 24, 2011

我正在遷移伺服器,我想在 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,我什至可以讓網路伺服器代理請求到新伺服器。我正在嘗試這樣做,以便日誌仍然有意義(而不是有大量日誌說源 IP 是舊伺服器)

編輯:感謝Eduardo,問題是教程錯誤地說“-D PREROUTING”是刪除規則的命令,它應該是“-A PREROUTING”。

但是它仍然不起作用。這就是我正在做的事情: machine-1: 192.168.56.150 machine-2: 192.168.56.151 我想將 machine-1 重定向到 machine-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

在我的工作站上,我嘗試 wget http://192.168.56.150期望它給出來自 machine-2 的響應(並且該 machine-2 將在其日誌中包含我的工作站的 IP) - 但是我只是連接超時。我檢查了 machine-2 並且它響應正確。

嘗試替換-D PREROUTING-A PREROUTING. 您正在嘗試刪除不存在的規則。我看到,本教程重複了多次相同的錯誤 --A隨處使用。

此外,您可以使用iptables -nvL -t nat查看 NAT 表。

兩個 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 指定介面。

引用自:https://serverfault.com/questions/272842