Недавно я начал немного играть с iptables и маршрутизацией и столкнулся со следующей проблемой:
У меня есть четыре сервера A, B, C, D с включенным ip_forwarding, и моя цель - просто маршрутизировать эхо-запросы icmp через цепочку, сохраняя исходный IP-адрес. к сожалению, пересылка не работает должным образом.
(A = 192.168.0.1 = eth0) <---> (B = 192.168.0.2 = eth0, 192.168.1.2 = eth1) <---> (B = 192.168.1.3 = eth0, 192.168.2.3 = eth1) < ---> (D = 192.168.2.4 = eth0)
далее у меня есть следующие маршруты:
Поэтому я хотел, чтобы этот пример с игрушкой был направлен на маршрутизацию запросов по цепочке в соответствии со статическими маршрутами. Конечно, я знаю, что пинг не удастся, потому что у D&C нет маршрутов к A. Но я просто собирался обнаружить трафик с помощью tcpdump.
В общем, я думал, что пакеты будут просто пересылаться путем поиска маршрутов в таблице маршрутизации, а затем отправляться в соответствующий пункт назначения или шлюз. Однако без использования NAT это, похоже, не работает. запросы icmp принимаются C на eth0, однако C не пересылает их D.
Конечно, я мог бы использовать какой-нибудь маскарад / уловку на B и (я не тестировал это), но я совершенно уверен, что D получит запрос от B («вместо» A).
Возможно ли вообще выполнять "многоскачковую" маршрутизацию без использования NAT? Или отсутствуют только некоторые правила iptables FORWARD, которые позволили бы мне это сделать?
Есть ли возможность отлаживать / искать, что iptables делает с пакетами? в настоящее время я нашел только цель LOG, но, честно говоря, создание всех правил дважды действительно раздражает ..
Linux реализует Пересылка / фильтрация обратного пути RFC1704, и большинство дистрибутивов включают его по умолчанию. То есть разрешить прием / пересылку пакетов только в том случае, если обратный путь (как определено в таблице маршрутов) будет использовать тот же исходящий интерфейс, что и интерфейс, в котором пришел пакет (или в свободном режиме, если есть какой-либо интерфейс, который будет иметь маршрут для этого пакета). Это сделано для защиты от спуфинга.
Чтобы выполнить тесты с асимметричными маршрутами или с другими нестандартными настройками, просто отключите rp_filter на обоих задействованных интерфейсах (+ "все") на каждом узле (здесь C и D достаточно, у других достаточно маршрутов):
for i in /proc/sys/net/ipv4/conf/{eth[01],all}/rp_filter; do echo 0 > "$i"; done
Это позволяет серверу D получать пинг icmp (но, конечно, он не может ответить).