Я устанавливаю новый маршрутизатор в нашу сеть, чтобы помочь управлять нашими частными сетевыми подключениями и лучше контролировать маршрутизацию вовне. Я решил упростить этот вопрос, удалив ссылки на вторую частную сеть на нашем маршрутизаторе (но имейте в виду, что у этого вопроса есть причины, поэтому ответ: не чтобы оставить старый маршрутизатор шлюзом по умолчанию).
У меня в iptables на нашем роутере есть следующая маршрутизация:
# Allow established connections, and those !not! coming from the public interface
# eth0 = public interface
# eth1 = private interface #1 (129.2.2.0/25)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow outgoing connections from the private interface
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# Masquerade (NAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Don't forward any other traffic from the public to the private
iptables -A FORWARD -i eth0 -o eth1 -j REJECT
Эта конфигурация означает, что пользователи будут перенаправлены через модем / маршрутизатор с общедоступным адресом - это хорошо и хорошо для большинства целей, и в основном не имеет значения, что все компьютеры скрыты за одним общедоступным IP-адресом.
Однако некоторым пользователям необходимо иметь доступ к прокси по адресу 192.111.222.111:8080 - и прокси должен идентифицировать этот трафик как поступающий через шлюз по адресу 129.2.2.126 (старый маршрутизатор) - иначе он не ответит.
Я попытался добавить статический маршрут на нашем маршрутизаторе с помощью:
route add -host 192.111.222.111 gw 129.2.2.126 dev eth1
Я могу успешно пропинговать 192.111.222.111 с маршрутизатора. Когда я отслеживаю маршрут, он показывает шлюз 129.2.2.126, но я просто получаю *** на каждом из следующих переходов (я думаю, что это имеет смысл, поскольку это всего лишь веб-прокси и требует аутентификации).
Когда я пытаюсь пропинговать этот адрес с хоста в сети 129.2.2.0/25, это не удается.
Должен ли я сделать это в цепочке iptables? Как мне настроить эту маршрутизацию?
Диаграмма сети
Здесь конфигурация интерфейсов для роутера:
auto eth0
iface eth0 inet static
address 150.1.2.2
netmask 255.255.255.248
gateway 150.2.2.1
auto eth1
iface eth1 inet static
address 129.2.2.125
netmask 255.255.255.128
А вот и таблица маршрутизации (без добавления моего статического маршрута):
Destination Gateway Genmask Flags Metric Ref Use Iface
default eth1202.sa.adsl 0.0.0.0 UG 100 0 0 eth0
localnet * 255.255.255.0 U 0 0 0 eth1
129.2.2.0 * 255.255.255.128 U 0 0 0 eth1
Чтобы повторить - я хочу, чтобы трафик из 129.2.2.7 (например) теперь маршрутизировался через наш маршрутизатор (129.2.2.125). Но затем этому маршрутизатору необходимо перенаправить 8080 запросов с адресом 192.111.222.111, который находится где-то на другой стороне старого маршрутизатора (129.2.2.126, который мы не управляем).
То, что вы пытаетесь сделать, вполне возможно и действительно довольно часто используется. У вас уже есть большая часть настроек. Возможно, вам не хватает правила «ПРИНЯТЬ» на "новый роутер" разрешение потоков трафика из eth1 к eth1. Просто добавьте его, используя
iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -j ACCEPT
Он должен быть достаточно безопасным, чтобы не обходить какие-либо правила и меры безопасности, и в то же время быть достаточно универсальным, чтобы разрешить работу любых клиентов и протоколов вашей сети. После того, как вы закончите настройку и устранение неполадок, вы можете ограничить правило протоколами и местами назначения, которые вы собираетесь использовать:
iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p icmp -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p tcp --sport 8080 ! --syn -j ACCEPT
Обратите внимание, что в типичном случае вы вряд ли увидите поток трафика через "новый роутер" для 192.111.222.111. Linux с радостью выдаст Сообщения перенаправления ICMP информирование хостов вашей подсети об использовании "старый роутер" для трафика на 192.111.222.111 при появлении первого пакета. И большинство хостов последуют (при условии, что они получили сообщение - т.е. оно нигде не фильтровалось) и отправят все последующие пакеты на 192.111.222.111 напрямую через "старый роутер".
Если вы выполняете маршрутизацию на конкретный хост, я не думаю, что использование сетевой маски является правильным. Указание 0.0.0.0 будет означать шлюз по умолчанию для всего трафика, поскольку эта маска будет соответствовать ВСЕМ IPv4 IP.
Фактически, полный 255.255.255.255 необходим для правила сопоставления одного хоста.
И, возможно, это очевидно, но вы должны указать шлюз, который находится в сети с прямым подключением, охватываемой вашей существующей таблицей маршрутизации.
При работе с iptables и маршрутизацией я бы предложил настроить правило LOG для отправки отброшенных пакетов в журнал. Это скажет вам, отбрасываете ли вы пакеты, которые могут показаться проблемой маршрутизации.
Это устанавливает цепочку LOGDROP.
-A LOGDROP -j LOG --log-prefix "LOGDROP "
-A LOGDROP -j DROP
А затем в конце различных цепочек, которые вы хотите зарегистрировать, вы переходите к цепочке LOGDROP в конце:
-A INPUT -j LOGDROP
Вместо того, чтобы просто отбрасывать пакеты. Различные цепочки LOGDROP с разными метками позволят вам получить большую детализацию в понимании того, что вы видите.