Я пытаюсь настроить компьютерный маршрутизатор 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.
С уважением