Почему на моем Linux VPS не соблюдается правило IP?

Вопрос или проблема

У меня есть два VPS, один из них — это игровой сервер, а другой — прокси. Я соединил их между собой через туннель FOU IPIP. На игровом сервере я установил туннель в качестве шлюза по умолчанию, трафик теперь проходит через него. Я также хочу сохранить прямое подключение к игровому серверу для использования различных сетевых маршрутов. Однако правило ip, которое я установил, совершенно не соблюдается.

Настройка на прокси-сервере:

firewall-cmd --add-interface=tunnel1 --zone=trusted --permanent
firewall-cmd --add-masquerade --zone=public  --permanent
firewall-cmd --zone=public --add-port=42011/udp --permanent
firewall-cmd --zone=public --add-port=16261-16262/udp --permanent
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p udp -i eth0 --dport 16261:16262 -j DNAT --to-destination 192.168.1.2
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp -i eth0 --dport 16261:16262 -j DNAT --to-destination 192.168.1.2
sysctl -w net.ipv4.ip_forward=1
modprobe fou
ip fou add port 42011 ipproto 4
modprobe ipip
ip link add name tunnel1 type ipip remote <remote VPS public IP> local <local VPS public IP> ttl 225 encap fou encap-sport 42011 encap-dport 42011
ip addr add 192.168.1.1/30 dev tunnel1
ip link set tunnel1 up

Настройка на игровом сервере:

firewall-cmd --add-interface=tunnel1 --zone=trusted --permanent
firewall-cmd --zone=public --add-port=42011/udp --permanent
firewall-cmd --zone=public --add-port=16261-16262/udp --permanent
firewall-cmd --permanent --direct --add-rule ipv4 mangle PREROUTING 0 -i eth0 -m conntrack --ctstate NEW -j MARK --set-mark 10
firewall-cmd --permanent --direct --add-rule ipv4 mangle PREROUTING 1 -m mark --mark 10 -j CONNMARK --save-mark
firewall-cmd --permanent --direct --add-rule ipv4 mangle OUTPUT 0 -j CONNMARK --restore-mark
ip route add default via <local VPS public gateway> dev eth0 proto static metric 100 table eth0
ip rule add to <remote VPS public IP>/32 table eth0
ip rule add fwmark 10 table eth0
modprobe fou
ip fou add port 42011 ipproto 4
modprobe ipip
ip link add name tunnel1 type ipip remote <remote VPS public IP> local <local VPS public IP> ttl 225 encap fou encap-sport 42011 encap-dport 42011
ip addr add 192.168.1.2/30 dev tunnel1
ip link set tunnel1 up
ip route delete default via <local VPS public gateway>
ip route add default via 192.168.1.2 dev tunnel1 metric 100

Я проверил с помощью conntrack -L | grep <local VPS public IP> и tcpdump -u -i any udp and host <my public IP>. Я вижу, что мой клиент UDP принимается сервером, он также помечен как 10. Однако он выходит из tunnel1, а не из eth0, как указано в правиле ip для отметки 10. Почему?!

Это мое текущее правило IP на игровом сервере:

0:      from all lookup local
32761:  from all fwmark 0xa lookup eth0
32762:  from 192.168.1.2 lookup tunnel1
32764:  from all to <proxy public ip> lookup eth0
32766:  from all lookup main
32767:  from all lookup default

Кстати, у TCP такой проблемы нет, только у UDP.


Обновление: я провел дополнительные тесты, выполнив

firewall-cmd --permanent --direct --add-rule ipv4 mangle PREROUTING 0 -i eth0 -m conntrack --ctstate NEW -p tcp ! --dport 42011 -j MARK --set-mark 10

Затем я попытался пинговать напрямую, это не работает, и работает только когда я добавляю:

firewall-cmd --permanent --direct --add-rule ipv4 mangle PREROUTING 0 -i eth0 -m conntrack --ctstate NEW -p icmp -j MARK --set-mark 10

Я сделал то же самое для UDP, но это никогда не работает для UDP. Я также пробовал iperf3 udp, который имеет постоянные sport и dport, исключая проблему с совпадением, но это также не работает. Что происходит с UDP? Есть ли у UDP какое-то особое правило?

.

Ответ или решение

Ваша проблема с некорректной обработкой IP rule на Linux VPS требует всестороннего анализа и понимания работы сетевых маршрутов, правил и утилит. Предполагается, что вы хотите создать специфический путь для определенного трафика через разные интерфейсы в рамках вашей игры и прокси-сервера.

Теория (T)

Для начала, следует понять, как работает механизм маршрутизации и IP rule в Linux. При настройке систем маршрутизации и маршрутизационных правил, пакеты данных обрабатываются последовательностью правил, заданных в системе. Вы используете IP rules для определения маршрутизации трафика на основе таких характеристик, как source IP, destination IP и метки (marks), назначенные с использованием утилит iptables и conntrack.

  1. IP Rules: IP rules контролируют, какие таблицы маршрутизации применяются в зависимости от атрибутов пакетов. Такие правила могут зависеть от меток (маркировок) или других критериев, чтобы направить пакеты через определенные таблицы маршрутизации, что позволяет более точно контролировать маршруты.

  2. Маркировка пакетов (Marking): Происходит с помощью iptables, где пакет труда может быть помечен для дальнейших действий. Посредством mangle таблицы возможно управлять маркированием и сохранением метки в соединении (CONNMARK).

  3. Только UDP: UDP — без соедиенический протокол. Это означает, что нет естественного контроля над потоком данных (в отличие от TCP), поэтому отправка и получение происходит более неконтролируемым способом.

Пример (E)

На основании вашего описания и скриптов, у вас правильно конфигурирован туннель и выполняются начальные команды iptables. Однако, проблема возникает в реализации маршрутов и взаимодействии с маркированным трафиком. Ваши результаты выполенной диагностики показывают, что несмотря на маркировку пакетов, выходной трафик продолжает следовать через tunnel1 вместо eth0.

Применение (A)

  1. Проверка таблиц маршрутизации: Убедитесь, что таблицы маршрутизации корректно настроены и могут быть доступны. Перепроверьте метрики таблиц, чтобы определить, используются ли пониженные метрики для получения доступного пути на tunnel1.

  2. Сточно используйте ip rule: Обратите внимание на порядок стандартных таблиц, установленных в системе:

    • Отладьте команды с помощью ip rule show и ip route show table <table> для отображения содержания каждой таблицы.
    • Убедитесь, что таблицы маршрутизации содержат ожидаемый маршрут.
  3. Разделите настройки для TCP и UDP: Поскольку UDP не имеет установленных соединений, возможно, потребуется определить отдельные правила, которые управляют исключительно UDP-трафиком, что, судя по всему, вы пробовали. Убедитесь, что подходящие порты установлены и правильно маркируются.

  4. Дополнительные проверки: Используйте (tcpdump -n -v) для подробного вывода, чтобы проверить, как пакеты обрабатываются вашим сервером. Проверяйте исходящие интерфейсы и марки по inbound и outbound направлениям для UDP.

  5. Сетевые буферы: UDP-трафик может быть отклонен из-за невыходных буферов. Вы можете настроить операционную систему на оптимизацию UDP с помощью изменения sysctl параметров (net.core.rmem_max и net.core.wmem_max).

Подводя итог, ваши проблемы с маршрутизацией UDP могут быть в результате комплексного недопонимания как Linux управляет неустановленными соединениями. Дальнейшая оптимизация соединения и маршрутов, возможно даже с включением QoS (Quality of Service), может помочь уточнить и отладить существующие конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...