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

Использование 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, что все запросы на e. грамм. google.com надо перенаправить через vpn2?

Есть хороший шанс, что A-Record разрешает несколько 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.