Я выполняю миграцию серверов и хочу перенаправить порт 80 на моем существующем компьютере на порт 80 на новом компьютере, пока DNS переключается.
Я запускаю сервер 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.
Кажется, у меня нет там нат-таблицы. Вот результат 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
Нет нац таблицы.
Что мне нужно сделать, чтобы переслать его на другую машину?
Примечание: я знаю о rinetd, и я даже могу получать запросы прокси веб-сервера к новому серверу. Я пытаюсь сделать это, чтобы журналы по-прежнему имели смысл (вместо того, чтобы иметь тонну журналов, в которых говорится, что исходный IP-адрес был старым сервером)
Изменить: Благодаря Эдуардо проблема заключалась в том, что в руководстве по ошибке написано «-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
На своей рабочей станции я пытаюсь wget http://192.168.56.150 ожидая, что он даст ответ от машины-2 (и эта машина-2 будет иметь IP-адрес моей рабочей станции в своих журналах), однако я просто получаю время ожидания соединения. Я проверил машину-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, если это возможно.
Попробуйте заменить -D PREROUTING
с участием -A PREROUTING
. Вы пытаетесь удалить несуществующее правило. Я вижу, в учебнике эта же ошибка повторяется несколько раз - просто используйте -A
где угодно.
Также вы можете использовать iptables -nvL -t nat
чтобы увидеть таблицы NAT.