Вопрос или проблема
У меня есть два 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.
-
IP Rules: IP rules контролируют, какие таблицы маршрутизации применяются в зависимости от атрибутов пакетов. Такие правила могут зависеть от меток (маркировок) или других критериев, чтобы направить пакеты через определенные таблицы маршрутизации, что позволяет более точно контролировать маршруты.
-
Маркировка пакетов (Marking): Происходит с помощью iptables, где пакет труда может быть помечен для дальнейших действий. Посредством mangle таблицы возможно управлять маркированием и сохранением метки в соединении (CONNMARK).
-
Только UDP: UDP — без соедиенический протокол. Это означает, что нет естественного контроля над потоком данных (в отличие от TCP), поэтому отправка и получение происходит более неконтролируемым способом.
Пример (E)
На основании вашего описания и скриптов, у вас правильно конфигурирован туннель и выполняются начальные команды iptables. Однако, проблема возникает в реализации маршрутов и взаимодействии с маркированным трафиком. Ваши результаты выполенной диагностики показывают, что несмотря на маркировку пакетов, выходной трафик продолжает следовать через tunnel1 вместо eth0.
Применение (A)
-
Проверка таблиц маршрутизации: Убедитесь, что таблицы маршрутизации корректно настроены и могут быть доступны. Перепроверьте метрики таблиц, чтобы определить, используются ли пониженные метрики для получения доступного пути на tunnel1.
-
Сточно используйте ip rule: Обратите внимание на порядок стандартных таблиц, установленных в системе:
- Отладьте команды с помощью
ip rule show
иip route show table <table>
для отображения содержания каждой таблицы. - Убедитесь, что таблицы маршрутизации содержат ожидаемый маршрут.
- Отладьте команды с помощью
-
Разделите настройки для TCP и UDP: Поскольку UDP не имеет установленных соединений, возможно, потребуется определить отдельные правила, которые управляют исключительно UDP-трафиком, что, судя по всему, вы пробовали. Убедитесь, что подходящие порты установлены и правильно маркируются.
-
Дополнительные проверки: Используйте
(tcpdump -n -v)
для подробного вывода, чтобы проверить, как пакеты обрабатываются вашим сервером. Проверяйте исходящие интерфейсы и марки по inbound и outbound направлениям для UDP. -
Сетевые буферы: UDP-трафик может быть отклонен из-за невыходных буферов. Вы можете настроить операционную систему на оптимизацию UDP с помощью изменения sysctl параметров (
net.core.rmem_max
иnet.core.wmem_max
).
Подводя итог, ваши проблемы с маршрутизацией UDP могут быть в результате комплексного недопонимания как Linux управляет неустановленными соединениями. Дальнейшая оптимизация соединения и маршрутов, возможно даже с включением QoS (Quality of Service), может помочь уточнить и отладить существующие конфигурации.