Миграция

Потребовалось вот один сервер, находящийся на colocation’е у Линки.Ру, виртуализовать в немецком датацентре Hetzner. Причины просты: Линки — ужасный сервис, 5 килорублей в месяц, за лишний десяток гигов счёт выставляют; Hetzner — 16 евро в месяц, 4 TB стомегабитного трафика и прочие плюшки. Но речь не об этом. На сервере крутится веб-приложение, которое очень уж не должно падать на продолжительный период.

Схема переезда AB:

  1. настроить сервер B;
  2. потушить веб-серверы на A и B;
  3. по-быстрому перетащить базу и приложения на B;
  4. запустить B;
  5. обновить DNS;
  6. забыть A.

Но DNS обновляются долго, поэтому нужно что-то думать. Идея пришла не сразу, но всё же кому-то может пригодиться. Есть же iptables! Поэтому мы можем взять весь HTTP-трафик, приходящий на A, и отправить его на B:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to new_ip_address:80

Всё хорошо, но только для 80 порта, а на сервере ещё крутится приложение с SSL (HTTPs), и подобный трюк на 443 порту толку никакого не даст. В итоге получилось всё настроить примерно так:


iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -m conntrack --ctstate NEW -j DNAT --to new_ip_address:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j DNAT --to new_ip_address:443
iptables -t nat -A PREROUTING -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE

P.S. Заработало не сразу, так как forwarding был запрещён на интерфейсе; echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding решил проблему.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *