Как заставить любое приложение использовать мой интерфейс eth0: 0?

5086
Abhijeet Rastogi

Как и в curL, у нас есть опция адреса привязки, которую мы можем загрузить с помощью определенного интерфейса.

Например, для загрузки из eth0: 0 мы используем $ curl --interface eth0: 0 http://www.google.com

Таким образом, моя цель - скачивать файлы, но поскольку curL не поддерживает сегментированную загрузку, я не хочу его использовать. У нас есть ограничение скорости на каждом IP. Чтобы преодолеть это ограничение, я могу запустить много подобных интерфейсов и загрузить некоторую часть файла с каждого интерфейса.

Как сделать так, чтобы любой другой менеджер загрузок, например AXEL, привязывался к определенному адресу? Я спрашиваю о некоторой идее, такой как изменение переменных в оболочке BASH, чтобы вся оболочка связывалась с определенным интерфейсом, скажем, eth0: 1 ...

1

3 ответа на вопрос

3
quack quixote

Похоже, что вы действительно хотите, это приложение, которое может загрузить файл по частям из разных интерфейсов и объединить их в конце. Например, если вы знали, что размер вашего файла составляет 100 МБ, и вы хотели получить фрагменты размером примерно 10 МБ, вам нужно сделать следующее:

1. start a download of bytes 0..10000000 on eth0, saving to filename.part1 2. start a download of bytes 10000001..20000000 on eth0:0, saving to `filename.part2 3. start a download of bytes 20000001..30000000 on eth0:1, saving to filename.part3 ... N-1. wait for all downloads to complete N. join all filename.part* together to get filename.complete 

Я знаю, wgetможет возобновить частично загруженный файл. Я почти уверен, что это работает, читая до конца существующего файла и затем запрашивая файл, начиная со следующего байта, с сервера.

Похоже, curlподдерживает частичные загрузки, как это с помощью --range <byterange>опции. Таким образом, вы можете написать приведенные выше шаги следующим образом:

1. curl --interface eth0 --range 0,10000000 http://some.server.com/bigfile -o bigfile.part1 2. curl --interface eth0:0 --range 10000001,20000000 http://some.server.com/bigfile -o bigfile.part2 ...  N. cat bigfile.part* > bigfile 

Предостережения: это не всегда работает; если на сервере HTTP / 1.1 не включена функция частичной загрузки, вы получите полный файл при каждом вызове. Смотрите man curlподробности о --rangeопции.

Редактировать: фиксированные байтовые диапазоны в примерах

1
Joe Internet

Вот сообщение в блоге о разделении загрузки с помощью curl. Я пробовал в Windows, но не смог заставить его работать, но у вас может быть успех с Linux.

-1
kmarsh

Сделайте eth0: 0 маршрутом по умолчанию вместо eth0. Команда:

netstat -rn 

покажет вам ваш текущий интерфейс по умолчанию. Если это не eth0: 0, удалите его с помощью

route delete 0.0.0.0 

затем добавить что-то вроде

route add default eth0:0 
Я хочу использовать все интерфейсы одновременно. Как и в одном терминале, я использую eth0: 0, а в другом я использую eth0: 1 .. Теперь вы получаете то, что я на самом деле собираюсь сделать. Abhijeet Rastogi 14 лет назад 1
У вас разные терминалы, но только одно ядро. Ядро использует один набор правил для маршрутизации, независимо от того, из какого приложения поступает трафик. Если вы устанавливаете статические маршруты в разные подсети или отдельные узлы, ядро ​​может направлять трафик через разные порты, чтобы туда попасть. Или вы можете настроить Xen, который даст вам совершенно новый IP, диапазон портов и таблицу маршрутизации. kmarsh 14 лет назад 1