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

Как установить статический маршрут для внешнего IP-адреса

Я устанавливаю новый маршрутизатор в нашу сеть, чтобы помочь управлять нашими частными сетевыми подключениями и лучше контролировать маршрутизацию вовне. Я решил упростить этот вопрос, удалив ссылки на вторую частную сеть на нашем маршрутизаторе (но имейте в виду, что у этого вопроса есть причины, поэтому ответ: не чтобы оставить старый маршрутизатор шлюзом по умолчанию).

У меня в 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 с разными метками позволят вам получить большую детализацию в понимании того, что вы видите.