Я хочу решить на уровне приложения, какой шлюз использовать для подключения к Интернету.
Это невозможно сделать с помощью простых правил подсети, потому что именно приложение должно иметь возможность решать, какой шлюз использовать.
Например. Я хочу использовать curl для загрузки чего-либо и хочу каким-то образом указать, какой шлюз использовать.
Это Linux-бокс с одной сетевой картой и IP-адресом 10.0.0.1. Есть два или более шлюза (разные интернет-провайдеры): например, 10.0.0.100 и 10.0.0.101.
Можно ли настроить правила маршрутизации с помощью iptables и iproute2 для управления этим? Как сообщить приложению, какой маршрут использовать?
Я пробовал это:
Я добавил в / etc / iproute2 / rt_tables: 100 out2
ip rule add prio 200 из поиска 10.0.0.2 out2
ip route добавить 10.0.0.0/24 dev eth0 src 10.0.0.2 table out2
ip route добавить по умолчанию через 10.0.0.100 dev eth0 src 10.0.0.2 table out2
По-прежнему "telnet -b 10.0.0.2 www.google.com 80" возвращает "сеть недоступна"
Я могу придумать один способ сделать это, а именно:
ifconfig
.bind
один из адресов 10.0.0.1 или 10.0.0.2. Таким образом, вы можете выбрать один из шлюзов в зависимости от выбранного IP-адреса источника. Чтобы проверить это, вы можете использовать telnet
с участием -b source_ip
вариант.Вот команды, которые я использовал ранее для включения маршрутизации на основе источника:
$ sudo ip rule add from 10.0.0.2 tab 1 priority 500
$ sudo ip route add default via 10.0.0.101 dev eth0 tab 1
$ sudo ip route flush cache
Если у вас установлен шлюз по умолчанию 10.0.0.100, это должно сработать для вас. Пакеты, отправленные с 10.0.0.1, должны быть отправлены на шлюз по умолчанию, а пакеты, отправленные с 10.0.0.2, должны быть отправлены на второй шлюз 10.0.0.101, как указано выше.
Другой вариант. Многие утилиты CLI используют переменные среды для этого типа конфигурации, http_proxy может иметь отношение к вашей ситуации, http://www.cyberciti.biz/faq/linux-unix-set-proxy-environment-variable/