Двойное сетевое соединение

9

У меня Ubuntu 10.10 есть сотовый модем USB и подключение к домашней сети.

Оба работают независимо.

Я хочу знать, как подключить оба устройства одновременно, и уметь указать, какое приложение использует какое устройство для подключения к Интернету.

Кто-нибудь знает как это сделать?

Джастин александр
источник

Ответы:

11

Есть несколько возможностей, в зависимости от того, как вы хотите решить, какие пакеты куда и куда отправлять. Большинство из них потребуют некоторого понимания того, как работает сеть TCP / IP в Linux. Основными инструментами, которые вам необходимо знать для выполнения сложных задач , являются iptables(Ubuntu: iptables Установите iptables ) и iproute2 ( ipкоманда) (Ubuntu: iproute Установить iproute , iproute-doc Установите iproute-doc ).

Если вы можете полностью различить целевой IP-адрес, все просто: направьте IP-адреса в соответствии с вашими пожеланиями. Например, следующие команды вызовут все пакеты для 1.2.3. x и 1.2.4.2 для прохождения ppp0и другие пакеты для прохождения eth0.

route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0

Для более сложных требований, вы должны начать использовать iptablesи ip route. Например, следующие команды устанавливают специальные таблицы маршрутизации так, чтобы все пакеты, отмеченные 1, проходили через, eth0а все пакеты, отмеченные 2, проходили через ppp0(за исключением пакетов, предназначенных для localhostподключения к интерфейсу обратной связи).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0

Теперь вы можете использовать iptablesдля «манипулирования» исходящими пакетами, добавив отметку, которая будет определять, какой маршрут они выберут. Например, здесь показано, как передать весь исходящий SMTP-трафик (порт 25) через eth0, а весь трафик, исходящий от приложения, запущенного от имени пользователя, - proxyчерез ppp0.

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2

Смотрите также 2 сетевых интерфейса, подключенных к интернету. Выберите тот, который будет использоваться в соответствии с именем домена, и привяжите программное обеспечение к различным сетевым интерфейсам .


Вам нужно будет организовать выполнение этих команд, когда оба интерфейса подключены. Я рекомендую вам написать скрипт, /etc/network/if-up.d/0justin-routesкоторый будет запускать нужные вам команды. Этот сценарий будет выполняться всякий раз, когда включается сетевой интерфейс; так как его имя начинается с a, 0оно запускается рано в этом процессе, до настройки конкретного приложения, которая может ожидать, что маршруты будут на месте. Существует симметричность /etc/network/if-down.d/в случае, если вы также хотите что-то делать, когда один из интерфейсов выходит из строя. (Все связанные маршруты будут автоматически удалены, что может привести к тому, что некоторые пакеты окажутся заблокированными, если вы захотите, чтобы они переключились на другой интерфейс.)

Сценарии ifup описаны в interfaces(5) man page. Главное, что нужно знать, это то, что имя подключаемого или отключенного интерфейса находится в переменной environement IFACE. Вы можете узнать, работает ли другой интерфейс if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then ….

Жиль "ТАК - перестань быть злым"
источник
@Justin: Это не тот материал, с которым у меня есть большой опыт, поэтому, пожалуйста, оставьте отзыв о том, что сработало, что не сработало, что вы не понимаете и т. Д.
Жиль, ТАК, перестань быть злым,
1
Мне нужно сделать два дополнения: во-первых, это отправляет трафик на ppp0 с адресом источника из eth0. Вы можете изменить это с помощью:, iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ipгде ppp_ipIP-адрес этого адаптера. Во-вторых, вам нужно будет отключить строгие rp_filterпри /proc/sys/net/ipv4/config/ppp0/rp_filter. Он работает, когда установлен в расслабляющий режим, который равен 2.
Karalga