Home

вторник, 27 октября 2009 г.

Internet sharing: закручиваем вентиль

Раздавать интернет при помощи Mac OS X не просто, а очень просто.
Но что делать, если хочется отдавать в общее пользование не весь возможный канал, а некоторую часть?

pipe1.jpg

Ответ прост: нужно прикрыть вентиль на трубе. Как? Тоже очень просто



Для начала включим Internet Sharing и в качестве пробного клиента воспользуемся iPhone или iPod touch с установленной программой Speed Test для замера скорости канала.
Замерим скорость на необрезанном канале. Допустим, получилась вот такая картина:

pipe1.png

Давайте прикроем крантик и ограничим скорость в раздаваемом канале до 1 мегабита в секунду. Открываем терминал. Для избежания ввода каждый раз команды sudo, на время тестов повысим свои полномочия.
sudo bash
Для начала создадим трубу номер 10 пропускной способностью 1 мегабит в секунду
/sbin/ipfw pipe 10 config bw 1Mbit/s
В качестве единиц измерения можно использовать мега- и кило-, биты и байты: 0.5Mbit/s, 23.4KByte/s
Теперь добавим правило, которое будет все пакеты, проходящие по AirPort, направлять в эту трубу. Интерфейс AirPort на языке системы обычно называется en1. Номер создаваемого правила должен быть меньше, чем у автоматических правил, которые создаются системой при включении шаринга интернета. В леопарде и снежном леопарде создаются правила с номером 10, мы создадим его с номером 5.
/sbin/ipfw add 5 pipe 10 ip from any to any via en1
Проверим результаты

pipe2.png

Удалим пока следы экспериментов
/sbin/ipfw delete 5
/sbin/ipfw pipe delete 10

Ну вот, практически то, что и хотелось. Осталось оформить это в более удобоваримом виде. Во-первых, включение и выключение краника возможно использовать в виде отдельных AppleScript-ов:
do shell script "/sbin/ipfw pipe 10 config bw 1Mbit/s" with administrator privileges
do shell script "/sbin/ipfw add 5 pipe 10 ip from any to any via en1" with administrator privileges
do shell script "/sbin/ipfw delete 5" with administrator privileges
do shell script "/sbin/ipfw pipe delete 10" with administrator privileges

А можно создать и один shell скрипт, который будет, в зависимости от вызова, урезать канал или убирать ограничение. Создадим в текущем каталоге файл, назовем его script.sh
#!/bin/sh

BN=`basename $0`
IPFW=/sbin/ipfw

if [ $BN == 'piperon' ] ; then
    $IPFW pipe 10 config bw 1Mbit/s
    $IPFW add 5 pipe 10 ip from any to any via en1
elif [ $BN == 'piperoff' ] ; then
    $IPFW delete 5
    $IPFW pipe delete 10
else
    echo 'usage: piperon | piperoff'
fi
Сделаем этот файл исполняемым. Создадим каталог /usr/local/sbin/ и скопируем этот скрипт туда под именем piperon Затем создадим линк на скрипт, но уже с именем piperoff
chmod a+x script.sh
mkdir -p /usr/local/sbin
cp script.sh /usr/local/sbin/piperon
ln -s /usr/local/sbin/piperon /usr/local/sbin/piperoff

Теперь от имени обычного пользователя можно вызывать скрипт при помощи
sudo /usr/local/sbin/piperon
или sudo /usr/local/sbin/piperoff

Скрипт определит, с каким именем его вызвали и в зависимости от этого включит или выключит ограничение
Ой.

11 коммент.:

bad комментирует...

а чем плох
sudo -i
вместо sudo bash ?

tsybulin комментирует...

да без разницы, собственно, что так, что эдак

gigamozg комментирует...

Спасибо огромное!

hayrider комментирует...

А не подскажете, как мне решить следующую проблему: есть airport express с функцией airtunes, он же используется как роутер. Проблема в том, что если помимо аудиопотока какая-то прога начинает занимать канал (например, начинает синхронизироваться apple tv), то на музыку ширины не хватает, и она начинает прерываться. Может можно как-то заставить принудительно давать на нужный порт минимально необходимую скорость?

tsybulin комментирует...

to hayrider:
можно, только нужно для начала более полно сформулировать исходные условия: тип wifi (g или n), и какую полосу нужно обеспечить для музыки, ну те 25 мегаюит, из них 10 нужно под музыку и остальное - под остальное

Big Guy комментирует...

добавил в ссылку. в следующей части ждем ответа на вопрос hayrider.
а у меня вопросы следующие: до каких пор работает эти правила?
как создавать новые правила, не нарушая правил, созданных другими приложениями?

tsybulin комментирует...

to Big Guy:
Хороший вопрос.
1. действует до перезагрузки. те само включение-выключение шаринга переживет, после перезагрузки или запускать руками, или как-то автоматизировать.
2. ipfw list
покажет список уже существующих правил. главное - не создать правила с уже существующими номерами

hayrider комментирует...

Вай-фай g, для музыки возьмем с запасом 500 кбит/с, порт, на который вещает airtunes TCP 3689 (если верить эппловскому сайту, как это локально посмотреть - не знаю). Соответственно, требуется дать ему эти 500 кбит/с, когда идет аудиопоток, и чтобы никакая софтина больше не могла занять весь канал... Это возможно?:)

tsybulin комментирует...

to hayrider:
угу. ipfw обладает большими возможностями, в т.ч. и по разделению и управлению приоритетами трафика.
в ближайшие дни попытаюсь рассказать, как это делать, как отладить и настроить.

Big Guy комментирует...

еще кучка вопросов
теперь про автоматизацию (применительно к макоси и роутерам с открытыми прошивками): какова последовательность загрузки системы? (куда пичкать свои правила, опять же, чтобы не конфликтовали с существующими настройками? - иногда в мануалах пишут "создайте файл с такими-то параметрамИ" - а файл может быть уже создан, но с несколько иными параметрами)
как реализуется QoS для отдельных протоколов - уж не этими ли правилами? чуть расшифрую: отечественные провайдеры очень любят раздавать интернет через впн. решил настроить приоритет для sip трафика штатными средствами. в итоге зарезал скорость ftp в "локальной" сети (до впн). существует ли выход? и как автоматизировать на роутере?

tectiv3 комментирует...

А вот, например, как расшарить интернет по vpn на тот же airport через который vpn подключается?
Обидно что в винде это делается одной галочкой :(

Отправить комментарий