У меня есть конфигурация маршрутизации, целью которой является маршрутизация всего трафика через туннель (utun3) в клиент openvpn, который затем подключается к серверу openvpn (64.120.44.114) через мой физический интерфейс (en0).

Я хочу направить определенные приложения напрямую через физический интерфейс (en0), а не через туннель (utun3). В настоящее время пара маршрутизации 0/1 и 128.0/1 форсирует весь интернет-трафик через туннель.

Я подумал, что если бы я отправлял трафик на интернет-адрес из приложения, которое связывает его исходящий адрес с физическим интерфейсом (т.е. 10.0.1.15), тогда этот трафик будет направляться через оставшийся маршрут по default для интерфейса этого адреса (en0). К сожалению, операционная система просто не может вместо этого направить эти пакеты:

$ ping 8.8.8.8          # or mtr 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=55 time=40.835 ms

$ ping -b utun3 8.8.8.8 # or mtr -a 10.12.44.16 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=55 time=42.036 ms

$ ping -b en0 8.8.8.8   # or mtr -a 10.0.1.15 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: No route to host

Могу ли я что-нибудь сделать, чтобы пакеты, отправленные с исходящим адресом, который был несовместим с переопределенным маршрутом 0/1 , 128.0/1 вместо этого использовали совместимый маршрут по default ? Если нет, существуют ли какие-либо другие способы настройки таблицы маршрутизации, которые могли бы служить для маршрутизации через en0 для конкретных приложений, но для маршрутизации через utun3 "по умолчанию"? Если такого метода в отношении маршрутизации не существует, можете ли вы порекомендовать какие-либо программные решения для выполнения маршрутизации для конкретного приложения или игнорирования таблицы маршрутизации? В моем случае в идеале программа должна работать на macOS.

У меня есть следующие интерфейсы:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 60:03:08:8b:96:88
    inet6 fe80::1c29:1e13:e8ba:fd3%en0 prefixlen 64 secured scopeid 0x5
    inet 10.0.1.15 netmask 0xffffff00 broadcast 10.0.1.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
    inet 10.12.44.16 --> 10.12.44.16 netmask 0xfffffc00

У меня есть следующее в моей таблице маршрутизации:

default            10.0.1.1           UGSc            0        0     en0
10.0.1.1           0:24:36:a0:86:a5   UHLWIir         4      106     en0
64.120.44.114/32   10.0.1.1           UGSc            1        0     en0

0/1                10.12.44.1         UGSc          101        2   utun3
128.0/1            10.12.44.1         UGSc           12        0   utun3
10.12.44/22        10.12.44.16        UGSc            1        0   utun3
10.12.44.16        10.12.44.16        UH              3      170   utun3

1 ответ1

0

Linux-маршрутизация ОЧЕНЬ универсальна, и есть много способов сделать то, что вы хотите. Но вы увеличите сложность настройки (читай: устранять проблемы будет сложнее, когда / если возникнет проблема)

На мой взгляд, самый простой способ - использовать правило для реализации маршрутизации на основе источника пакетов. (В любом случае иногда называется маршрутизацией на основе политики, Cisco)

Linux поддерживает несколько таблиц маршрутов, и легко добавлять пользовательские таблицы (см. Руководство по iproute2)

Затем он поддерживает правила для направления "поиска маршрута" в разные таблицы на основе приоритетов и критериев. Критерием правила может быть адрес источника. По умолчанию есть 3 таблицы: локальная, основная и по умолчанию. Вы можете:

1 - создать новую таблицу, скажем "прямую"

    echo "100 direct" >> /etc/iproute2/rt_tables

2 - добавить маршрут по умолчанию к этой таблице через en0

    ip route add default dev en0 table direct

3 - добавить новое правило, например, с приоритетом 1000, чтобы использовать таблицу direct для трафика, исходящего из 10.0.1.15

    ip rule add from 10.0.1.15 lookup direct

Теперь проблема в том, что MacOS - это не linux, и я узнал, что ваша проблема в MacOS, в которой я не очень разбираюсь. Тем не менее, это кажется выполнимым. Текущая версия MacOS поставляется с PF, брандмауэром, портированным из OpenBSD, по-видимому, на стадии версии 4.5. Этот брандмауэр способен изменять - на уровне ядра - маршрутизацию на основе правил (помимо всего прочего). Вы указываете это, используя ключевое слово route-to в правилах. Правила обычно указываются в якорях, которые содержат части конфигурации. PF по умолчанию отключен, так что вам нужно будет включить и его. Вы могли бы:

1- Создайте новый файл конфигурации привязки /etc/pf.anchors/pbr.conf с помощью:

     pass out on utun3 route-to (en0 10.0.1.1) from utun3 to any

это перенаправит исходящий трафик через utun3 на en0, если источником был адрес utun3.

2- Добавьте этот якорь в конфигурацию pf, отредактировав /etc/pf.conf и поместив

    anchor "pbr.rules"
    load anchor "pbr.rules" from "/etc/pf.anchors/pbr.rules"

3- Как-то включить PF, для тестирования вы можете использовать pfctl -E, а затем вы можете использовать pfctl -F all -f /etc/pf.conf для перезагрузки конфигурации, если это необходимо.

Смотрите команду Выполнить при запуске / входе в систему (Mac OS X)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .