Как стать автором
Обновить

Комментарии 84

Шикарно!
Я лет 5 назад на freebsd решал похожие задачи с помощью множественных таблиц маршрутизации и утилиты setfib.
Спасибо за статью!
fib'ы — это несколько не то. fib-ы — это эквивалент нескольких таблиц роутинга.

внутри неймспейсов возможно:
1)множество таблиц роутинга(т.е. можно считать что fib'ы внутри fib'ов).
2)свои правила iptables & ipset(на новых ядрах его сделали namespace aware)
3)свои интерфейсы и даже кое-какие настройки conntrack, вроде net.netfilter.nf_conntrack_max и net.netfilter.nf_conntrack_buckets
4)терминировать pppoe
5)держать phy от wifi-карточки и создавать свои wlan-интерфейсы

Вообще, можно много всякого делать, например как в моём примере
Ну, я вообще и написал, что это множественные таблицы маршрутизации.
С помощью утилиты setfib, модуля setfib для ipfw можно:
1)множество таблиц роутинга
2)свои правила ipfw & ipfw table & ipfw nat
3)свои интерфейсы
4)терминировать pppoe, openvpn, ipip, gre,…
5)по wlan не в курсе но, отдельные интервейсы загонятьв fib — элементарно.
Так что ;)
вы не правы.

1)множество таблиц роутинга

это да.

2)свои правила ipfw & ipfw table & ipfw nat

это не так. на старте:
root@laptus:~ # setfib 0 ipfw show
65535 3127 321815 allow ip from any to any
добавим правило:
root@laptus:~ # setfib 0 ipfw add 100 allow ip from any to any
00100 allow ip from any to any

теперь мы его видим не только в fib 0:
root@laptus:~ # setfib 0 ipfw show
00100 18 1536 allow ip from any to any
65535 3302 335611 allow ip from any to any
но и в fib 1:
root@laptus:~ # setfib 1 ipfw show
00100 62 5384 allow ip from any to any
65535 3302 335611 allow ip from any to any

3)свои интерфейсы
это тоже не так.

PS: имхо, вы путаете с VIMAGE, который даже в CURRENT
WARNING: VIMAGE (virtualized network stack) is a highly experimental feature.
По ipfw:
Да, попутал, свои правила ipfw делать было нельзя.
По поводу NAT — один NAT у меня был ipfw nat, остальные — растыканные natd по разным fib.
По поводу интерфесов — виртуальные можно любые распихивать по разным fib'ам, к примеру
setfib 10 ifconfig tun0…
По поводу вообще любых интерфейсов можно было сделать так:
ipfw add setfib 5 ip from any to any via em10
Главное не забывать что играть тоже придется через тунель, потому что игры купленные в одном регионе ( СНГ ) нельзя играть с европейских IP.
Можно. По крайней мере у меня ни разу отказа в запуске не было. Если будет — не велика потеря, туннель так же работать позволит.
Если это мультиплеер, то задержка может стать решающим препятствием.
На Кипре средний пинг — от 50 до 100мс. Лишние 10мс от Питера ничего не решают.

В Питере был лучший интернет в мире. До момента введения цензуры.

Дешёвый, без лимитов, с практически идеальным аптаймом, с субмилисекундными пингами по городу и 12мс до Нидерландов, с поддержкой IPv6, белым IP без фильтров и дискриминации трафика, с снятием лимитов по скорости в моменты низкой загрузки сети (читай — 100Мб всегда, кроме вечера; вечером столько, сколько по тарифу положено).
Что за провайдер?
Я бы наоборот покупал за дорогую цену, чтобы в очередной деловой поездке не обнаружить, что у меня биошок или каловсдутие не работает :(
Очень немногие игры не заведутся, если куплены в России, а играете где-то еще. Из того, что есть у меня это Skyrim и Borderlands 2.
Полуофф: а есть технология, аналогичная «network namespaces» для Windows?
Уже некоторое время пытаюсь найти способ разделять траффик в windows именно по приложениям и ничего не удаётся найти. Если само приложение не имеет интерфейса выбора сетевой карты или прокси, то видимо никак. Или не правильно формирую запросы или не существует способа выделить траффик приложения или как-то пометить его пакеты, только маршруты по IP.
ProxyCap была утилита, когда-то была полезна.
Судя по описанию то, что нужно.

Версия для Windows — 30 USD.
Можете еще на proxyfier взгялнуть.
SocksCap. Работала на подсовывании своей DLL, выдающей себя за WinSock, а дальше уже дёргающая реальный винсок в свой позе.
Я пробовал tsocks под линукс (скрипт, подменяющий с помощью LD_PRELOAD so'шки). Для обычных программ прокатывает, для Стима — нет, т.к. стим сам очень сильно злоупотребляет LD_PRELOAD и переуказанием библиотек.
И хоть кто-то из них со стимом работает?
Неизвестно, но это список софта который можно попробовать ;)
ИМХО, это на отдельную статью потянет…
Спасибо за ссылку. Моего гугль-фу как-то не хватило, чтобы найти, хотя искал.

Правда, ни одна из перечисленных софтин не умеет делать правила per-user basis. Написал паре авторов, может, добавят — теоретически должно быть несложно.
Для браузера (они все могут SOCKS proxy) удобно использовать Bitvise SSH Client (Tunnelier) совместно с FoxyProxy.
Чтобы использовать socks-proxy достаточно просто ssh:

ssh -CD 1080 user@server.
Я тут в свете борьбы с Великим российским Файрволлом задался этим вопросом, хотя моя задача чуть проще — пускать через американский VPN всё, кроме торрентов. На stackexchange подсказали — serverfault.com/a/594509/219402 — средствами файрволла Windows для указанного приложения (в моём случае — uTorrent) блокируется доступ к VPN IP и оно вынуждено подключаться напрямую.
Хорошая статья!
А не проще сделать еще один аккаунт Steam, и покупать через VPN, после чего отправлять игру подарком на основной аккаунт, а там уже активировать и играть, ничего не боясь? :)
не все игры можно дарить.
Если раньше гифты не имели региональных ограничений, то теперь у издателей появилась возможность накладывать эти самые региональные ограничения и на гифты. Видимо очень активно торговать гифтами стали (особенно после появления возможности не только принимать средства на paypal и выводить их). А до этого была введена возможность издателям установки запрета на покупку гифтов.
Я и так ничего не боюсь. Благодаря SSH и профессии, уж SSH с рутовым доступом я для себя всегда и везде найду.
Сейчас даже паки в CIS многие издатели не продают т.е. и на этом не сэкономить.
pre-up iptables -D POSTROUTING -t nat -s 100.64.42.0/24 -j MASQUERADE
post-down iptables -D POSTROUTING -t nat -s 100.64.42.0/24 -j MASQUERADE

А зачем в обоих случаях удалять правило? Или я чего-то не понял или тут опечатка. А если и опечатка, то неужели ручками куски настроек писали?

Вопрос номер два: debian 6, например, из коробки не знает, что такое ip netns. Неплохо было бы указать, что за пакет используется для network namespaces.
Ман говорит, что утилита поставляется вместе с iproute2.
Опечатка, поправил.
debian6 — oldstable. Вы хотите запускать steam на oldstable? Удачи с libc, так сказать.
Я делал похожее для приложения через iptables owner match extension, рулил все для группы, например «tunnel» через socks/vpn/etc.
Правда, приложение приходилось запускать как-то так:
sudo -g tunnel app
уж лучше cgroups тогда использовать.
За рассказ про ssh -w спасибо, я как-то обычно просто всех кто движется загоняю в носки до моей виртуалки в Нидерландах и так получаю безцензурный инет в России.
Вместо xhost + лучше конечно использовать указание чему вы +, а то + всему это как-то брутальненько.

Для изоляции стима от всего прочего рекомендую глянуть в LXC 1.0 запуск графических приложений, www.stgraber.org/2014/02/09/lxc-1-0-gui-in-containers/ хорошо все описано, я так скайп отсадил. При таком отсаживании соответственно можно просто из lxc-таза поднимать ssh -w.
Городить полные контейнеры, имхо, перебор. У меня steam работает из-под отдельного пользователя (я просто не отладил процесс до уровня публикации пока что), устанавливался методом распаковки dpkg, то есть ни разу рута не получил. Таким образом он в ~steam весь болтается, то есть ничего за пределами своего каталога не увидит. Как только отлажу процесс, опубликую.

А если ssh внутри контейнера сделать, то как steam поймёт что надо tun юзать, а не тот интерфейс, через который ssh работает?
Не совсем понял смысла этого действия.

«Цена на игры в Стиме зависит от региона. Регион — от IP'шника. Есть желание иметь цены в рублях, а не в евро.»

Буквально вчера покупал дополнение для игры за рубли, находясь при этом в Англии, с английским айпишником. Если поставить регион как «Россия» в настройках, то оплата тоже происходит в рублях, независимо от того, где вы. Мультиплеер конкретно в «Цивилизации 5» (сама игра купленна как описано мною выше) работает корректно что в России, что в Англии, хотя за все игры не ручаюсь (хотя, rust, купленный таким же способом, проблем не вызывает).

Что я упускаю?
Иногда он показывает рубли, иногда евро. Я закономерности не понял, но на второй или третьей попытки стрясти с меня -цать евро я полез крутить ssh.
У меня так было один раз всего, я перезашел в профиль, и появились рубли.
Впрочем, допускаю, что у каждого по своему цена проявляется.
Если аккаунт считается российским, то достаточно подставить в URL параметр cc, равный ru, чтобы перестали пытаться стрясти евро, которые с российского акка всё равно не должны стрястись (будет ругаться на неверную валюту).

Тот же портал:
store.steampowered.com/app/620/?cc=DE
store.steampowered.com/app/620/?cc=RU

Пока не сменить страну проживания через суппорт (они попросят документ и, например, счета за свет) — валюта неизменно будет рублями, где бы вы ни были.
Эм, ясно. Это для веб-морды. А для /usr/bin/steam? В смысле, для его встроенной штуки.
В клиенте — разве что в оверлее: в браузере по шифт+табу в играх.

Кстати, использование VPN для игры/покупки, вроде как, нарушает ToS стима и, кажется, за это даже банят. Будьте осторожны ;)
You agree that you will not use IP proxying or other methods to disguise the place of your residence, whether to circumvent geographical restrictions on game content, to purchase at pricing not applicable to your geography, or for any other purpose. If you do this, we may terminate your access to your Account.


У меня штампик в паспорте есть с пропиской, с доказательством residence. А на Кипре я так, заездом.
Спасибо за статью.

Можно тупой вопрос :)?

когда SSH-клиенты организуют Socks-SSH прокси (Putty, например, так умеет), на стороне сервера организуется tun-интерфейс, так?

(никогда об этом не задумывался)
Нет, socks-proxy не использует туннели и маршрутизацию. Когда клиенту говорят «создай socks-proxy», он просто создаёт соответствующий порт со своей стороны и создаёт канал (channel) до сервера. Когда приложение обращается на порт, его трафик передаётся серверу. Тот открывает соединение согласно заголовков и отдаёт ответ обратно.

Табличка простая:

Тип   уровень     Что передаётся
tap        2         Передаются ethernet-кадры, включая бродкасты и ARP (свитч/бридж)
tun        3         Передаются IP-пакеты (маршрутизатор)
socks      4         Передаются запросы транспортного уровня TCP (прокси-сервер)

(злой хабр не разрешает table в комментах -_-')

Как-то так.
Так это можно и i2p роутер изолировать?
Да.
Да. Более того, я со стимом играюсь как раз в рамках концепции полной изоляции i2p. В принципе, socks-proxy для практических нужд хватает, но хочется более серьёзной изоляции. Всё осложняется адской jav'ой самого i2p, с которой не хочется разбираться.
Это означает ещё одну программу? Зачем, когда ssh решает все проблемы?
openssh — это dirty vpn.

sshuttle — позволяет где угодно, быстро и легко поднять vpn через ssh. ./sshuttle -r username@sshserver 0/0 -vv
Не понимаю, что такое «dirty».

Шифрует? Шифрует. Трафик передаёт? Передаёт. В каком-то смысле даже обеспечивает стеганографию, потому что с пол-пинка даже не разобраться, «просто ssh» это, или туннель.
За технологию я бы поставил плюс, а за попытку наебать тех, на кого пека-геймерам молиться надо — минус.
То есть покупать айфончики в США, чтобы не платить в русском ретейле это ок, а покупать (внимание, покупать) в РФ для того, чтобы не платить втридорога в ЕС — это не ок?

Чем отличается поездка в Италию за одеждой от VPN'а?
Спасибо! Отличная статья. Все думаю завести специальную машинку для того, чтобы поднять на ней всякие i2p, cjdns, tor и прочие демоны. Постоянная работа будет держать демоны в боевой готовности и давать пользу сетям, а на ноуте будет меньше тяжелых процессов. Наверное так же можно делать тунеть на такую машинку с жестким перенаправлением в эти сети и пользоваться благамираспределенности.
Пожалуйста, не используйте auto и allow-hotplug одновременно. Либо одно, либо другое, не вместе.
Почему?

auto говорит «поднимать всегда при старте», allow-hotplug говорит «поднимать, когда интерфейс стал up».
Ну потому что эти вещи взаимоисключающие как правило. hotplug-интерфейсы не обрабатываются вообще до поднятия loopback-интерфейса, который поднимается в процессе обработки auto. Более того, в текущей реализации в этот самый момент могут возникнуть гонки, если интерфейс объявлен как allow-hotplug.
Заставляете старого человека маны перечитывать.

Lines beginning with the word «auto» are used to identify the physical
interfaces to be brought up when ifup is run with the -a option. (This
option is used by the system boot scripts.) Physical interface names
should follow the word «auto» on the same line. There can be multiple
«auto» stanzas. ifup brings the named interfaces up in the order
listed.

Lines beginning with «allow-» are used to identify interfaces that
should be brought up automatically by various subsytems. This may be
done using a command such as «ifup --allow=hotplug eth0 eth1», which
will only bring up eth0 or eth1 if it is listed in an «allow-hotplug»
line. Note that «allow-auto» and «auto» are synonyms.


В упор не вижу, откуда тут конфликт будет. Если есть источники, с интересом посмотрю.
А Вы исходники почитайте — поймёте.

Я же написал, интерфейсы с hotplug поднимаются не раньше поднятия lo. Loopback поднимается при старте системы в момент обработки auto. Если интерфейс уже есть к этому моменту (в случае eth* это так), то сразу же при появлении интерфейса lo его начинает поднимать udev, и тут же он поднимается самим ifupdown. Кто первый поднимет — того и тапки. А если этого интерфейса нету, конечно же udev его поднимать не станет, но его всё равно поднимет ifupdown из-за auto. Т.е. в обоих случаях auto + allow-hotplug на старте системы дают результат эквивалентный auto, но иногда сбоящий.

Теперь к опусканию интерфейса. До недавней версии ifupdown ошибки при опускании интерфейса были фатальными. Т.е. если мы пытаемся отобрать адрес у несуществующего интерфейса, и ip addr вывалился с ошибкой, то остальные команды даже не пытались бы обрабатываться, потому единственное валидное применение allow-hotplug вместе с auto — корректная деконфигурация интерфейса при его внезапном исчезновении — не было бы реализовано. В тестинге сейчас находится версия, которая игнорирует ошибки при деконфигурации, потому эта проблема сейчас актуальна для меньшего числа пользователей, но в стейбле сказанное выше still applies.

Проблема с гонками заключается ещё в том, что на данный момент нет простого её решения, т.е. скрипт, реализующий allow-hotplug на стороне udev находится в пакете udev, потому я не могу его просто взять и исправить, надо задействовать помощь других людей.

Но пока проблема не исправлена, я не рекомендую эти возможности сочетать.
Касательно Steam'а:
1) Валюта кошелька определяется либо при заведении аккаунта (по IP) либо при первом платеже, в зависимости от валюты платежа и не меняется никогда, через какой бы IP адрес клиент не заходил в дальнейшем.
1.1) Если валюта кошелька, например, доллары, то, даже если зайти через российский IP, валюта кошелька так и останется в долларах.
1.2) Цена на игры станут в рублях, но купить игру Стим не позволит. Или позволит, но непосредственно при оплате пересчитает в доллары
2) Покупка игры через другой регион (обход определения региона через прокси или vpn) прямо запрещена соглашением, так что я очень не рекомендую так покупать игры. Гораздо правильнее попросить друга в нужном регионе купить игру в инвентарь и переслать (гифт (gift) — подарочную версию) игру Вам.
2.1) Некоторые игры «залочены» на регион и купить из в подарок нельзя.
Не соглашусь с пунктом 1.
Первая сотня игр куплены в РФ, потом переехал в Швейцарию. Все цены сейчас в евро, никогда с support-ом не общался.
Возможно, что саппорт сам поменял Вам валюту из-за того, что Вы _длительное_ время выходили в Стим с европейского IP и при покупке ставили галочку «Подтверждаю, что моей страной является <some_country>».
При единоразовых сменах IP валюта не меняется.
Посторонних галочек я не ставил. Более того я ща запустил стим (без VPN), мне показали в заглавных евро, а в wishlist — рубли. Более того, пару раз система кривилась настолько, что показывала, что за игрушку списывает €249, хотя внутрях там было 249 рублей.

Глючит и корёжит их.
По-моему удобней поднимать VPN(ы) на домашнем роутере, а на клиентах только маркировать пакеты которые надо загнать в определенный интерфейс. Для этого хорошо подходит поле DSCP которое все равно никакой роли в домашней сети не играет.
НЛО прилетело и опубликовало эту надпись здесь
Как подсказывают ораторы выше, счёт у меня все равно в рублях, и в евро списан не будет, так что это, скорее, фикс, а не хак.
Моральный аспект: На самом деле, это таки хак. Важно не в какой валюте счет, а какова стоимость продукта. Стим выставляет разные цены для разных регионов не случайно. Более того, при оплате, например, пейпелом в стиме требуется галочка «Я подтверждаю, что проживаю в <название_страны>». Так что действия, описанные в статье, нарушают ToS Стима.

Технический вопрос: По поводу ssh vs openvpn. Во-первых openvpn можно перевесить на любой порт (в т.ч. 443). Во-вторых, насколько мне известно, TCP-пакеты (HTTP) очень неохотно ходят внутри других TCP-пакетов (SSH) из-за оверхеда таймаутов в то время, как openvpn запаковывает в UDP. Но конечно в контексте данной проблемы это неактуально, так как скорость не критична
Я не оплачиваю пейпалом что-либо в стиме. Аккаунт я заводил в РФ, на рублёвую карточку российского банка. Почему что-то должно меняться? Тем паче, см комментарий выше, это всего лишь глюки интерфейса, а внутри там всё равно рубли.

А вот обязательства оповещать стим о _смене_ места проживания я в TOC'е не нашёл.
Кстати про UDP.
Если делать vpn на ssh, то мы тут будем инкапсулировать udp в ssh которая по tcp :) Если будет что то потоковое, где потеря двух — трех пакетов допустимо, то в ssh они будут гарантировано доставлены, те будут запрошены. Пакет, который в норме мог бы быть безболезненно потерян, посылается снова. Это может привести к замедлению работы VPN. Просто об этом надо помнить.
Это — да, есть такое. Но в нормальном режиме перепосыл будет относительно быстрым, плюс потеря пакетов на не очень загруженном канале — редкое событие.
Яркий пример у меня. Канал 100 в интернет. Есть сервера в разных странах с гарантированной скоростью 20. Если мы поднимаем vpn через ssh /0, и пытаемся замереть скорость (пусть будет тот же speedtest) то мы получим 5 — в хорошем случаи.
Если мы поднимаем нормальный vpn (l2tp, ipsec,tinc) то мы выжимаем около 19. Да, можно заняться тюнингом и прочей ерисью, но надо понимать — что ssh vpn — это временное решение, которое не должно быть постоянным.

проще поднять через tinc vpn, всего править два файла :) Не такой замороченный как openvpn. Вообще не понимаю, почему он не популярен?
Спасибо за статью. Некоторое время назад стояла похожая задача. Выделенное приложение на Linux сервере должно было выходить в сеть через VPN, чтобы при этом всё остальное работало через локалку. Поискал в сети, спросил на форумах, в том числе на лоре — ответы сводились к тому что так сделать нельзя. В итоге запустил этот софт на отдельной железке :)

Сообщите пожалуйста, где искать в будущем такого рода информацию?
Только лор, там самые граммотные люди.
Заметим, в каждом namespace'е свой lo!

А ifconfig должен показывать интерфейс lo в каждом неймспейсе? У меня не показывает:
root@htpc:~# ip netns exec vpn ifconfig
tun42     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.169.1.6  P-t-P:10.169.1.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:246810 errors:0 dropped:0 overruns:0 frame:0
          TX packets:60845 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:332284095 (316.8 MiB)  TX bytes:6638116 (6.3 MiB)
Проехали, его руками поднять надо: ip netns exec vpn ip link set up dev lo
root@rgs0:~# ip netns exec vx0 ifconfig
root@rgs0:~# ip netns exec vx0 ifconfig -a
lo Link encap: Локальная петля (Loopback)
LOOPBACK MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B


потому что без ключа -a ifconfig покатывает только то что в UP.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.