Использование DNS в iproute2

В моей настройке я могу перенаправить шлюз по умолчанию на основе адреса источника. Допустим, пользователь подключен через Tun0 (10.2.0.0/16) перенаправляет на другой vpn. Это отлично работает!

ip rule add from 10.2.0.10 lookup vpn1

Во втором правиле я перенаправляю шлюз по умолчанию на другой шлюз, если пользователь получает доступ к определенному IP-адресу:

ip rule add from 10.2.0.10 to 94.142.154.71 lookup vpn2

Если я захожу на страницу 94.142.154.71 (myip.is), пользователь правильно маршрутизируется, и я вижу ip второго vpn. На любых других страницах отображается IP-адрес vpn1.

Но как мне сказать iproute2, что все запросы, например, на google.com, должны перенаправляться через vpn2?

3 ответа

Решение

Существует высокая вероятность того, что A-запись разрешается на несколько IP-адресов:

% dig +short google.com
209.85.148.101
209.85.148.102
209.85.148.113
209.85.148.138
209.85.148.139
209.85.148.100

Таким образом, вы должны просмотреть их и добавить правило для каждого из них, как это

dig +short google.com | while read IP; do
  ip rule add from 10.2.0.10 to "$IP" lookup vpn2
done

Также вы должны подумать о освежающем cronjob.

Краткий ответ: вы не можете использовать DNS в iproute2. В ядре нет средств для поиска имен во время обработки маршрута. Это действительно не имело бы смысла для них быть способом сделать это также. Сделайте паузу на секунду и учтите, что это правило оценивается для каждого отдельного пакета, который пересылается или создается системой. Если это правило приводит к поиску DNS, оно генерирует пакеты, которые не могут быть направлены до завершения поиска DNS.

Вы можете испытать желание использовать MARK средство iptables, так как это позволит вам создавать правила, используя DNS, но даже это не будет работать. Iptables оценивает имя при добавлении правила и создает правила на основе IP-адресов, к которым разрешается DNS. Правила никогда не обновляются после добавления правила.

Одним из решений, которое не является хорошим, является оценка имен с использованием другого, который будет выполнять поиск DNS и добавлять правила на основе результатов. Проблема с этим, особенно для чего-то такого же размера, как Google, заключается в том, что результаты, которые вы видите в DNS, могут часто меняться.

Если сайт / сеть достаточно велики, чтобы у них фактически было собственное выделение адресного пространства непосредственно из RIR, и они не просто используют адресное пространство, предоставляемое CDN/ISP, тогда вы можете искать их сеть в whois и создавать правила на основе своих подсетей. На этой странице должны быть указаны адреса, на которые приходится большая часть услуг Google.

Возможно, вам стоит серьезно подумать о настройке прокси-сервера, который работает на более высоком уровне. Возможно, то, что вы пытаетесь сделать, может быть достигнуто с помощью Squid или другого веб-прокси.

google.com и другие крупные веб-фермы имеют несколько IP-адресов по принципу Round Robin DNS, а также кластеризацию.

Вам нужно будет создать правило для каждого IP-адреса RRDNS, который они используют для этого конкретного сайта.

Или вы можете обновить свой локальный файл DNS/HOSTS, чтобы иметь только один адрес google.com и применить правило к этому IP.

Другие вопросы по тегам