Назад | Перейти на главную страницу

проблема с NAT в сценарии с несколькими восходящими линиями

Я пытаюсь настроить компьютерный маршрутизатор Linux, который должен иметь дело с маршрутизацией и использованием NAT для обеспечения подключения к внутренней сети (это также DHCP-сервер и брандмауэр). С внешней стороны компьютер имеет 2 интерфейса, к которым подключено 2 кабельных модема (общедоступный IP-адрес в обоих случаях предоставляется через DHCP).

Сценарий выглядит так: http://img810.imageshack.us/img810/411/filer.jpg

Учитывая динамическую роль внешних интерфейсов, мне придется добавить несколько скриптов в /etc/network/if-up.d и /etc/network/if-down.d, чтобы установить правильные значения, но сейчас я просто хочу убедиться, что это работает.

Итак, для базовой конфигурации я использую это: http://pastebin.com/raw.php?i=tvSj0d5S

В тестах, которые я провел, один из компьютеров может подключаться к Интернету, а другой - нет. Обнюхивая с помощью wirehark, я видел, как неработающий ПК отправляет свои пакеты, маршрутизатор перенаправляет их после применения NAT, и ответы действительно приходят на маршрутизатор снова, но NAT не «отменяется», и ПК никогда их не получает. Напротив, другой компьютер работает отлично. Конечно, у меня есть 2 шлюза по умолчанию (по одному на каждого провайдера), которые отображаются в списке маршрутов (route -n).

Предполагая, что оба внешних интерфейса имеют хорошо известные адреса и шлюзы (я всегда получаю одни и те же адреса, поэтому для теста он должен работать одинаково), что здесь не так? Должен ли я использовать цель SNAT вместо MASQUERADE? я должен использовать функцию "route from" iproute2 вместо fwmark?

Заранее спасибо и с уважением

Если то, что вы разместили в своем сценарии, - это все, что вы сделали, значит, вам не хватает некоторых шагов.

Чтобы взглянуть на ваш сценарий, меня прежде всего беспокоят следующие строки. Файл /etc/iproute2/rt_tables обычно не воссоздается при каждой перезагрузке. Вероятно, вы неоднократно добавляете одно и то же в этот файл. Это вызовет проблемы в будущем. Особенно если поменять использованные числа.

echo "201 $TABLE1" >> /etc/iproute2/rt_tables
echo "202 $TABLE2" >> /etc/iproute2/rt_tables

Следующая проблема заключается в том, что маршруты, которые вы добавили в свои новые таблицы с помощью этих команд.

ip route add default via $GW1 dev $DEV1 table $TABLE1
ip route add default via $GW2 dev $DEV2 table $TABLE2

Когда вы создаете новую таблицу, она полностью пуста. Это означает, что он даже не включает маршруты для вашей локальной сети.

Итак, если вы запустите такую ​​команду ip route show table main scope link вы должны увидеть такие строки.

192.168.1.0/24  dev eth1 proto kernel  src 192.168.1.100
192.168.2.0/24  dev eth2 proto kernel  src 192.168.2.100
192.168.3.0/24  dev eth3 proto kernel  src 192.168.3.1

Это локальные маршруты, они необходимы для работы маршрутизации, и вы должны воссоздать их для каждой таблицы.

Общая команда будет выглядеть так. Вам нужно запустить эту команду для каждого интерфейса в каждой таблице.

/sbin/ip route add table ${TABLE} scope link proto kernel dev ${IFACE} ${ROUTE}

Если вы используете DHCP для обоих шлюзов, проверяли ли вы, что серверы DHCP от вашего провайдера не отправляют вам информацию о шлюзе, которая будет приниматься вашим стеком, и изменит вашу таблицу маршрутизации? По умолчанию это то, что делает по крайней мере dhclient.

Попробуйте использовать SNAT вместо того MASQUERADE, и используя --to возможность изменить исходный адрес на один из адресов шлюза.

Подобно:

iptables -t nat -o $DEV1 -A POSTROUTING -p tcp -j SNAT --to <ethX ip>
iptables -t nat -o $DEV2 -A POSTROUTING -p tcp -j SNAT --to <ethY ip>

Может тебе нужно добавить -s тоже, но я не могу быть уверен без тестирования.

РЕДАКТИРОВАТЬ: --to относится к адресу интерфейса, а не к адресу GW.

Прежде всего, какой пул у dhcp-сервера? (В конфигурации у вас есть 192.168.3. [2,3] жестко набранный. Вы проверяли случай, когда один из компьютеров получает IP-адрес от них?)

Также включены ли журналы для iptables? Они могли бы вам помочь.

Я знаю, что это не сильно помогает, но только несколько советов по устранению неполадок:>

Не получив результатов с DHCP, я решил кое-что протестировать: я установил статическую конфигурацию для внешних интерфейсов, используя те же адреса, которые я всегда получаю. Я тестировал как на самом роутере, так и, конечно, работал, но опять же никаких результатов для ПК. Фактически это не сработало, удалив GW по умолчанию в основной таблице, даже если у вторичных таблиц были свои собственные GW. И это снова работало только для интерфейса по умолчанию, пока я снова установил GW по умолчанию.

Итак, я предполагаю, что каким-то образом система fwmark не работает вместе с NAT при наличии нескольких интерфейсов (таблиц).

Я попробую еще раз, добавив 2 глобальные области для баланса трафика, так же, как это показано в руководстве LARTC.

С уважением