Как обойти проблему невозможности SNAT для двухпровайдерного интернета?

Linux сервер Сети NAT routing

Значит есть роутер-сервер, на котором подключено и настроено два интернет-канала. Всё это работает вполне хорошо на самом сервере:

# traceroute ya.ru
traceroute to ya.ru (93.158.134.3), 30 hops max, 40 byte packets
1 194.145.199.129 (194.145.199.129) 1.108 ms 1.337 ms 1.882 ms
2 client.amron.com.ua (192.168.5.1) 4.585 ms 4.570 ms 4.552 ms
3 tc.amron.com.ua (194.145.198.1) 27.076 ms 27.067 ms 27.046 ms
4 194.44.6.117 (194.44.6.117) 36.470 ms 36.466 ms 36.575 ms
5 yandex-10G-gw.ix.net.ua (195.35.65.88) 36.560 ms 36.377 ms 36.368 ms
6 titanium-vlan908.yandex.net (213.180.208.94) 57.891 ms 54.039 ms 62.986 ms
7 www.yandex.ru (93.158.134.3) 63.987 ms 63.938 ms 63.890 ms
traceroute ya.ru
traceroute to ya.ru (77.88.21.3), 30 hops max, 40 byte packets
1 192.168.13.1 (192.168.13.1) 0.236 ms 0.242 ms 0.223 ms
2 217.77.212.225 (217.77.212.225) 0.761 ms 0.828 ms 0.808 ms
3 217.77.214.1 (217.77.214.1) 1.348 ms 1.180 ms 1.302 ms
4 217.77.208.249 (217.77.208.249) 1.106 ms 0.857 ms 1.186 ms
5 kyiv1-xe-11-1-0-284.ett.ua (80.93.115.97) 10.004 ms 9.857 ms 10.074 ms
6 yandex-10G-gw.ix.net.ua (195.35.65.88) 10.055 ms 10.267 ms 10.279 ms
7 titanium-vlan908.yandex.net (213.180.208.94) 32.202 ms 32.022 ms 32.117 ms
8 gallium-vlan901.yandex.net (77.88.56.126) 32.455 ms 32.318 ms 32.429 ms
9 l3-s1100-s900.yandex.net (213.180.213.39) 32.689 ms 32.784 ms 32.647 ms
10 toyota-vlan4.yandex.net (213.180.210.181) 32.658 ms 32.787 ms 32.615 ms
11 www.yandex.ru (77.88.21.3) 32.443 ms 32.395 ms 32.524 ms

Столкнулся с такой проблемой: пока был один канал активен для исходящих, я использовал SNAT на шлюз по умолчанию, чтобы выводить в интернет компьютеры, подключенные к серверу:
iptables -A POSTROUTING -t nat -s 192.168.0.2 -j SNAT --to-source 217.77.220.48
теперь же, эта конструкция работает только в в тех случаях, когда для исходящего используется конкретно 217.77.220.48, т.е. только один провайдер, так как иначе механизм NAT ломается из-за того, что идёт попытка отсылки пакета не с того интерфейса, соединение не устанавливается.

Чёт голова не варит... Как выйти из этой ситуации победителем? :)

Примечание:
> А что мешает задать такое же правило для второго исходящего интерфейса?

То, что сработает только первое правило, так как из двух правил с одинаковым условием (источник пакетов) и разными действиями (SNAT на разный адрес) будет выполнено только то, которое встретится раньше - во втором правиле пакет уже будет изменён.

> задавать общее правило для входящего интерфейса без привязки к выходящему

Это невозможно в пределах технологии NAT, так как она в том и состоит, что адрес источника подменяется адресом сервера. Указанным в команде. Даже маскарадинг тут бессилен, насколько я понимаю.

Примечание:
> Если у вас имеется динамическое подключение

Нет, у меня статические айпи адреса. Маскарадинг не даст эффекта, это не волшебная палочка. Если заюзать маскарад, то при каждом NAT-преобразовании будет делаться лишняя проверка, "не изменился ли айпи на интерфейсе" (одном и том же), замедляя работу сети, из-за чего, собственно, маскарад не рекомендуют применять когда в нём нет необходимости.
Вообще, NAT делается в цепочке POSTROUTING, т.е. уже _после_ принятия сетевой подсистемой решения о шлюзе, через который будет отправлен пакет.
Проблемы бы не было, если бы в --to-source можно было подставить этот самый уже выбранный интерфейс (его айпи), но я не уверен, что это вообще возможно...

Примечание:
Блин, надо было почитать ман, и всё встало на свои места :) Я совершенно забыл про одну опцию... NAT на мультипровайдерном интернете очень даже работает!
Закрою вопрос и отдам баллы тому, кто первым нагуглит что я сделал :)

Примечание:
> Или, другой вариант, матчить интерфейс через -o

Именно! Разумеется, это просто и логично: через какой интерфейс должно отсылать пакет, на айпи того интерфейса и пакет следует НАТить.
Ответы:
1. А что мешает задать такое же правило для второго исходящего интерфейса?
2. Если все клиенты на одном интерфейсе, то задавать общее правило для входящего интерфейса без привязки к выходящему(тут не уверен на все 100).
Маскарадинг (MASQUERADE) в основе своей представляет то же самое, что и SNAT только не имеет ключа --to-source. Причиной тому то, что маскарадинг может работать, например, с dialup подключением или DHCP, т.е. в тех случаях, когда IP адрес присваивается устройству динамически. Если у вас имеется динамическое подключение, то нужно использовать маскарадинг, если же у вас статическое IP подключение, то бесспорно лучшим выходом будет использование действия SNAT.
LARTC?:)
Что-то там про --every или --probability


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.