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

Маршрутизация через шлюз в другую подсеть

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

Итак, я объясню проблему здесь. На картинке ниже вы видите топологию моей сети. Цель состоит в том, чтобы клиентское устройство с IP-адресом 10.0.0.50 могло получить доступ к целевому устройству с IP-адресом 192.168.0.1.

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

Пока что я пробовал установить маршрут на шлюзе 10.0.0.1 с route add -net 192.168.0.0/25 gw 10.0.0.99. Шлюз правильно (должен быть) настроен для пересылки пакетов, потому что я использую его как шлюз для всей сети для доступа в Интернет. Так iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE устанавливается, а также переадресация IP echo 1 > /proc/sys/net/ipv4/ip_forward. route показывает следующий вывод на шлюз:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         123.123.123.1   0.0.0.0         UG    202    0        0 eth0
10.0.0.0        *               255.255.255.128 U     0      0        0 br0
123.123.123.2   *               255.255.255.252 U     0      0        0 eth0
192.168.0.0     10.0.0.99       255.255.255.128 UG    0      0        0 br0

Конфигурация на сервере 10.0.0.99 включает правила iptable для маскировки и переадресации ip. route показывает следующий вывод на сервер:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         tower           0.0.0.0         UG    204    0        0 br0
default         192.168.0.1     0.0.0.0         UG    303    0        0 wlan0
10.0.0.0        *               255.255.255.128 U     0      0        0 br0
192.168.0.0     *               255.255.255.128 U     0      0        0 wlan0

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

Я также пытался установить iptables -A POSTROUTING -t nat -o br0 -j MASQUERADE на шлюзе, чтобы проверить, является ли это проблемой, но это правило не помогло, поэтому я удалил его снова.

Что мне здесь не хватает? Пожалуйста, помогите мне. Большое спасибо!

  1. Если вы используете Linux, прекратите использовать ifconfig и маршрут. Используйте ip (man ip и прочтите руководства по iproute).
  2. Настройте маршрут на интернет-шлюзе: ip route add 192.168.0.0/25 via 10.0.0.99
  3. Отключите редиректы: sysctl -w sys.net.ipv4.conf.br0.send_redirects.
  4. Проверьте маршрутизацию командой ip route get 192.168.0.1 from 10.0.0.50 iif br0. Результат должен выглядеть как
192.168.0.1 from 10.0.0.50 via 10.0.0.99 dev br0 
    cache iif br0
  1. При желании добавьте SNAT/MASQUERADE правило, чтобы ответы проходили через интернет-шлюз, а не напрямую от сервера к клиенту:
iptables -t nat -A POSTROUTING \
         -o br0 \
         --src 10.0.0.0/24 --dst 192.168.0.0/25 \
    -j SNAT --to 10.0.0.1
  1. Включите пересылку на сервере: sysctl -w sys.net.ipv4.ip_forward=1
  2. В большинстве случаев описанных выше шагов достаточно. При желании, если у цели есть другой шлюз по умолчанию (не через сервер), вы можете добавить маршрут к цели (ip route add 10.0.0.0/24 via 192.168.0.X, где 192.168.0.X это адрес сервера в 192.168.0.0/25 подсеть) или настройте NAT на самом сервере (iptables -t nat -A POSTROUTING -o wlan0 --src 10.0.0.0/24 --dst 192.168.0.1 -j MASQUERADE).
  3. Проверить подключение:
    • на шлюзе пингуют сервер и цель.
    • на сервере ping шлюз и цель.
    • используйте tcpdump для устранения проблем в будущем.