Pull to refresh

Comments 24

Я что-то не понимаю в этом решении или все же есть потенциальная проблема:


  • есть сайт A который в России заблокирован.
  • есть сайт B который в России не заблокирован но сам решил не любит Россию
  • есть сайт C который не блокирован нигде но вот только есть необходимость его дергать не через браузер (и официально это не рекомендовано но по факту спецскачивалка которая не умеет имитировать браузер — вполне работает)
  • есть сайт D который просто работает всегда.
  • есть сайт E, авторы которого считают что клиентов не из России не надо и поставили геоблок
    Все 5 — висят на Cloudflare и резолвятся(ну вот так не повезло) в одни и те же IP.

Если не использовать VPN то A не работает, B работает но показывает что идите нафиг, C,D,E работают — случай 1
Если использовать VPN то A и, B работает но показывает что идите нафиг, C "работает" но вот только VPN то на IP датацентра — привет капча и нормально пользоватся нельзя, D работает, E не работает — случай 2


С этим решением будет у всех 5 сайтов поведение как случай 2?

Тем что B при заходе из России не работает, а если не из России — работает, а E — наоборот. И тем что в тех примерах что я знаю — B блокировка стоит на уровне сайта а не Cloudflare а у E — на уровне самого Cloudflare.


При этом хотелось бы всеми пользоваться.

С сайтом С не понял. Если IP известного ДЦ, то капчу выдаёт? Нужно только с домашнего IP ходить?
C A, B. Тоже не понимаю, "не любить Россию" = Геоблок? Одно и то же для логики обхода.

Упрощаем:
A, B - заблокированы. Надо гнать трафик через VPN.
D - не заблокирован. Всё-равно как гнать в этом случае
E - доступ только из РФ. Из таких сайтов знаю только ozon, но они поменяли политику несколько месяцев назад, как понимаю "Managed challenge" включили, мне всего один раз капча попалась. Есть ещё примеры?

Если у всех будет одинаковые адреса балансировщиков CF, которые занесены в sets, то да, все будут идти через туннель.

Проблема в этом случае только с E (опять же, примеры нужны) и C.

Чтоб адреса балансировщиков пересекались во всех случаях, ну это маловероятное событие.

Пример ситуации с C — ficbook.net и скачивание фанфиков через fanficfare(плагин к Calibre). С некоторыми VPN вылетает капча. При этом НЕ вылетает из дома или личного VPN на хентзнере


с E — некоторые финансовые сервисы с чисто российскими клиентами, сорри известные мне примеры публично не хочу называть. И да — там проблема скорее в том что техподдержка — придурки и даже видеть не хотят в чем проблема (но там правда аудитория тоже… та еще, вот только это аудитория других людей дергает с вопросами а что не работает).

Вы можете это всё накатить на виртуалку в том же VirtualBox. Ещё одну виртуалку рядом подключить как клиента через этот виртуальный роутер. И потестить всё, что вас интересует.

Если через Hetzner нет капчи, то проблема с С не особо проблема, даже если зайдёт в туннель.

Почему бы просто не использовать Route Rule в sing-box или Xray, ведь можно добавить все необходимые правила в свой geosite.dat. Так же можно порезать рекламу записав "hosts": { "geosite:category-ads-all": "127.0.0.1" }.

  1. Это универсальное решение, sing-box просто один из возможных вариантов для туннеля.

  2. Конфигурить роутер через правила на роутере хорошая практика. Например, через Route rule можно заставить один хост в сети ходить полностью через туннель? Мой пример через стандартный /etc/config/firewall есть в соседней статье.

    А как Route rule у этих утилит работает на роутере? Все пакеты через себя прогоняет и у всех смотрит заголовок? Если есть какая-нибудь дока по этой теме - буду благодарен.
    Скиньте полный конфиг для sing-box, пожалуйста. Интересно посмотреть, как это работает

Да, через route rule можно заставить один хост в сети ходить полностью через "туннель":

{
	"source": ["192.168.0.100"],
	"outboundTag": "proxy",
	"type": "field"
}

Рабочего конфига для sing-box у меня нет, поскольку на роутере я использую PassWall2, но есть конфиг для Xray с теми же правилами:

{
    "dns":
      {
        "disableFallbackIfMatch": true,
        "hosts": {
          "dns.google": "8.8.8.8"
        },
        "queryStrategy": "UseIPv4",
        "servers": [
          "1.1.1.1"
        ]
      },
    "log":
      {
        "error": "/var/log/xray/error.log",
        "loglevel": "warning"
      },
    "inbounds": [
      {
        "port": 12345,
        "protocol": "dokodemo-door",
        "settings": {
          "network": "tcp,udp",
          "followRedirect": true
        },
        "sniffing": {
          "destOverride": [
            "http",
            "tls",
            "quic"
          ],
          "enabled": true
        },
        "streamSettings": {
          "sockopt": {
            "tproxy": "tproxy"
          }
        },
        "tag": "all-in"
      },
    ],
    "outbounds": [
	{
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
         "vnext":
         [{
            "address": "1.2.3.4",
            "port": 443,
            "users":
            [{
               "id": "drEwvgYhS15C",
               "encryption": "none",
               "security": "auto",
               "level": 8
             }]
         }]
      },
      "streamSettings": {
        "network": "grpc",
        "grpcSettings": {
            "multiMode": false,
            "serviceName": ""
        },
        "realitySettings": {
          "allowInsecure": false,
          "fingerprint": "chrome",
          "publicKey": "OBR2JYROQB8odK5glVW_KLnsWl3UZ-voyGq_9ihQgTI",
          "serverName": "www.yahoo.com",
          "shortId": "d49d578f280fd83a",
          "show": false,
          "spiderX": ""
        },
        "security": "reality",
        "sockopt": {
          "mark": 2
        }
      }
     },
     {
        "protocol": "freedom",
		"tag": "direct",
		"streamSettings": {
          "sockopt": {
            "mark": 2
          }
        }
      },
      {
        "protocol": "blackhole",
        "settings": {
          "response": {
            "type": "http"
          }
        },
        "tag": "blocked"
      },
      {
        "protocol": "dns",
        "tag": "dns-out"
      }
    ],
    "routing":
      {
        "domainStrategy": "IPIfNonMatch",
        "domainMatcher": "hybrid",
        "rules": [
        {
          "outboundTag": "dns-out",
          "protocol": ["dns"],
          "type": "field"
        },
		{
          "outboundTag": "direct",
          "protocol": ["bittorrent"],
		  "type": "field"
        },
		{
		  "inboundTag": ["all-in"],
		  "network": "udp",
          "port": 123,
          "outboundTag": "direct",
          "type": "field"
        },
		{
          "domain": ["geosite:geolocation-ru", "geosite:youtube", "geosite:bittorrent"],
          "outboundTag": "direct",
		  "type": "field"
        },
		{
          "domain": ["geosite:category-ru-news"],
          "outboundTag": "proxy",
		  "type": "field"
        },
		{
          "ip": ["8.8.8.8", "1.1.1.1", "geoip:telegram"],
          "outboundTag": "proxy",
		  "type": "field"
        },
		{
          "domain": ["geosite:tld-ru"],
          "outboundTag": "direct",
		  "type": "field"
        },
		{
          "ip": [ "geoip:private", "geoip:ru"],
          "outboundTag": "direct",
		  "type": "field"
        },
		{
          "type": "field",
          "network": "udp",
          "ip": ["geoip:google"],
          "outboundTag": "direct"
        }
      ]
    }
}

Подробностей работы не могу сказать, но логика "domainStrategy": "IPIfNonMatch" такая, что "Если доменное имя не соответствует ни одному правилу, тогда доменное имя преобразуется в IP и повторяется сопоставление".

Спасибо за конфиг. PassWall2 же много весит, сколько у вашего роутера памяти?

Использую raspberry pi 4 на котором крутится openwrt с Passwall2, подключенный через vlan к микротик, поэтому проблем с памятью нет.

UFO just landed and posted this here

Интересно, насколько быстро это работает в сравнении с nftables sets. И как это всё с другими правилами в фаерволе взаимодействует.

UFO just landed and posted this here

Кто-то может посоветовать что-то подобное для RouterOS (v6.49.10) ? Специально ради статьи попробовал поставить OpenWrt на Mikrotik hap ac2 - пару часов провозился, не получилось, плюнул.

А зачем там Openwrt?
там свои решения более менее работают, почти
antifilter.download и прием по BGP
а лучше — antifilter.network
У меня текущее решение как раз antifliter.network, стоят галочки только про twitter и meta (netflix мне не важен),
на "списке для помощи в нехождении" Роскомнадзора галочка НЕ стоит (там слишком много совершенно не нужного — меня вот ну совсем не волнует что из внутренней сети не доступны сайты по наркотикам, и при этом если включить — ситуация с сайтами A-E из моего коммента выше всплывает в максимально худшем виде, потому что похоже заворачиваются почти все IP балансировщиков)


гугл (по большей части все и так работает но например firebase testing и play.google.com — нет) то берем https://www.gstatic.com/ipranges/goog.json и несколькими заменами в редакторе делаем набор маршртутов для mikrotik. Youtube в 4K вполне себе работает.


все остальное на чем реально проблемы — резолвим адрес и дописываем новое правило.
таким образом почти все что может работать без VPN — так и работает.


Проблема с DNS решена тем что и так стоит AdGuard Home у которого в аплинках серверы с DNS-over-TLS/DNS-over-HTTPS,DNS-over-QUIC и это НЕ 8.8.8.8/1.1.1.1 а кое что более редкое.


В RouterOS 6 у меня туннель был на Mikrotik CHR в MVPS.net через L2TP
В RouterOS 7 у меня сейчас туннель через Wireguard на VPS'ку зарубежом (у меня эта VPSка там для других целей, и по сути даром тот туннель). Если Wireguard прибьют — верну L2TP, если и его прибьют, придется внимательно статьи https://habr.com/ru/users/miracleptr/publications/articles/ перечитать и думать как сделать максимально удобнее решение.

Для L2TP IPsec и статического внешнего IP. VPN_ADDRESS заменить на внешний адрес VPN-сервера, IPSEC_SHARED_SECRET, L2TP_USER и L2TP_PASSWORD на соответствующие креденшелы, WAN_IP на внешний IP, WAN_ETHER на имя внешнего интерфейса, а VPN_GATEWAY_IP на внутренний адрес VPN-сервера.

/interface l2tp-client
add connect-to=VPN_ADDRESS disabled=no ipsec-secret=IPSEC_SHARED_SECRET name=l2tp-rkn password=L2TP_PASSWORD use-ipsec=yes user=L2TP_USER

/ip firewall filter
add action=fasttrack-connection chain=forward comment="antirkn: fasttrack bypass, replaces default rule" connection-state=established,related dst-address-list=!rkn hw-offload=yes in-interface-list=LAN out-interface-list=WAN
add action=fasttrack-connection chain=forward comment="antirkn: fasttrack bypass, replaces default rule" connection-state=established,related dst-address-list=!rkn hw-offload=yes in-interface-list=WAN out-interface-list=LAN
/ip firewall nat
add action=src-nat chain=srcnat comment="antirkn: replaces default masquerade for static WAN_IP" dst-address-list=!rkn ipsec-policy=out,none out-interface=WAN_ETHER to-addresses=WAN_IP
add action=masquerade chain=srcnat comment="antirkn: masquerade for VPN" dst-address-list=rkn ipsec-policy=out,none out-interface=l2tp-rkn
/ip firewall mangle
add action=route chain=prerouting comment="antirkn: route via VPN" connection-state=!invalid dst-address-list=rkn in-interface-list=LAN passthrough=no route-dst=VPN_GATEWAY_IP

Адреса добавлять в список "rkn":

/ip firewall address-list
add list=rkn comment="antirkn: manual" address=habr.com

В целом правильно и понятно, но я уже почти 10 лет считаю, что правильная настройка - наоборот, критичный к "локальности" трафик (домены, протоколы, ip-адреса) пускать без VPN, а по умолчанию отправлять в VPN. Список доменов, которые требуют "локальности" (по всем причинам) у меня так и не вышел за 50 штук. Механика плюс-минус такая же (dnsmasq + ipset). DNS, конечно, только через VPN+DoH (а поднимать VPN там, где в DNS вмешиваются уже странно).

Тоже вариант, особенно если не смущают пункты из "Зачем обходить блокировки точечно".
Но даже при этом нужно иметь хороший VPN. В идеале failover между двумя и отключение обхода, если туннель упал.

Ко мне несколько раз приходили с вопросом "как отключить обход, если VPN упал?". Люди используют бесплатные, некачественные или тупо забывают их оплатить. И у них переставали работать часть незаблокированных сервисов из-за суммирования IP-адресов и использования подсетей. И при таком раскладе, если направлять весь трафик через VPN, будет вырубаться вообще всё.

Ну а в случае точечного обхода по доменам, отрубится только то, что и так не работало.

DNS пускать через VPN не очень идея по той же причине. DNS cервера Google и Cloudflare куда надёжнее, чем VPS за 3 бакса. А они ещё и бесплатные, можно подрубить кучу разных для отказоустойчивости.

Даже если у вас хороший VPN, острей встанет этот вопрос, когда его блокнут по протоколу)

Тоже вариант, особенно если не смущают пункты из "Зачем обходить блокировки точечно".

Смущают. Но это не проблема. Например, сколько мне сайтов/адресов надо на максимальной скорости? А я постепенно понял, что мне нужны только тяжёлые штуки типа зеркала обновления пакетов пакетов (mirror yandex) и другие подобные, откуда разом гигабайты скачиваются. Или вот например, куда надо минимальный пинг? До серверов игр и до RDP работы. Аналогично с сайтами, которые "только из РФ" - их не так много и сразу можно подумать, нужен ли мне этот сайт, но добавить руками в список - пара минут.

Но, да, конечно, это моя система, её я обслуживаю, и я знаю как она работает. Эта штука не очень "отчуждаемая".

А какой у вас канал от провайдера и на сколько по скорости VPN вытягивает?

Я вот так не делаю потому что при 850 Mbit/s тарифе - VPN хорошо если 200 Mbit/s выдаст (сейчас это Wireguard через VPS с кучей ресурсов(он для другого нужен) в Финляндии, альтернативный вариант - L2TP в Нидерландах). Ну и торренты - их через VPN гнать глупо и чревато письмами счастья хостеру.

Порядки плюс-минус те же самые. Меня больше напрягает не пропускная способность, а пинг: с 0,5-1 мс по Мск до ~20 мс - это в 40 раз. В RDP, например, заметно, поэтому надо добавлять исключения. Пропускной способности хватает для обычных нужд более чем (а где не хватает - добавлено в исключения). Торренты у меня отдельно идут тоже.

Спасибо что упомянули, примерно так у меня и сделано, но...
В какой-то момент я понял что меня не устраивают паблик списки. Они избыточны и я стал часто попадать на сайты которые обходятся, а их обходить не нужно. В связи с этим использую свои списки, которые просто вписал в конфиг:
/etc/config/dhcp

config dnsmasq

..

option confdir '/usr/etc/dnsmasq'
...

И вот пример одного из списков:
/usr/etc/dnsmasq/spotify
nftset=/pscdn.co/4#inet#fw4#unblock_list

nftset=/scdn.co/4#inet#fw4#unblock_list

nftset=/spoti.fi/4#inet#fw4#unblock_list

nftset=/spotify.com/4#inet#fw4#unblock_list

nftset=/spotifycdn.com/4#inet#fw4#unblock_list

nftset=/spotifycdn.net/4#inet#fw4#unblock_list

nftset=/spotifycharts.com/4#inet#fw4#unblock_list

nftset=/spotifycodes.com/4#inet#fw4#unblock_list

nftset=/spotifyjobs.com/4#inet#fw4#unblock_list

nftset=/spotifynewsroom.jp/4#inet#fw4#unblock_list

nftset=/spotilocal.com/4#inet#fw4#unblock_list

nftset=/tospotify.com/4#inet#fw4#unblock_list

Так же для обхода блокировок мне неплохо помогает ipv6. Например для дома беру у одного известного брокера 6to4. Для дачи у другого, менее известного, по wireguard. В итоге получается что я крайне редко сталкиваюсь с какими либо блокировками и в случае чего создаю файлик в /usr/etc/dnsmasq.
Есть и побочный эффект, есть сайты, например кинопоиск, который при использовании такого ipv6 определяет как использование vpn и не показывает кино. Что ж, яндекс обходить по ipv6 мне не нужно. Отключаем ipv6 для следующих доменов:

/usr/etc/dnsmasq/yandex 

address=/yandex.com/::

address=/yandex.net/::

address=/yandex.ru/::

address=/yastatic.net/::

address=/kinopoisk.ru/::

P.S.
Текущими темпами, скоро все это придется заворачивать еще и в ShadowSocks, но об этом как нибудь потом.

Если VPN упал все плохо:
Падение ipv6 почти никак не влияет, ну упало и упало, юзер может и не заметить
Падение VPS - ну так без vps оно и так не работает)

dnscrypt-proxy очень не стабильно у меня работал. Несколько лет с ним мучился, на разных железках и разных owrt. Как на stubby перешел, горя не знаю.

А на 22.03 приходилось еще и dnsmasq-full брать из snapshot, т.к. он с nft не умел.

Sign up to leave a comment.

Articles