Jump to content

UweStrich

Forum Members
  • Posts

    23
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by UweStrich

  1. "Баловался" когда-то игдрассилем на роутере, остановился тогда из-за лени накатать скрипт автозапуска и - особенно, - правила для iptables, так что большое спасибо за них 👍

    От себя правда добавлю то, что и в тех тогдашних опытах, и в нынешних по следам темы, вместо radvd из Entware воспользовался функционалом ipv6 непосредственно роутера - пускай и не особо элегантным способом: прописал дополнительным соединением тоннель SixInFour на адрес роутера, указав в нём полученные из конфига адреса ipv6 и префикс:

    TunnelSixInFour.png.b25c36b6a475c8a4a9543dad4632d2c3.png

    после чего в CLI задал mtu на тоннеле, прописал маршрут до подсети Yggdrasil, и сохранил, с последующей перезагрузкой роутера:

    interface TunnelSixInFour0 ip mtu 1280
    ipv6 route 200::/7 TunnelSixInFour0
    system configuration save

    IPv6_Routes.thumb.png.76db0a6949eceff3f5b14112e7b1de96.png

    Ну, и т.к. скорости в Yggdrasil только через роутер (KN-1011 в моём случае; интересно было бы посмотреть на скорости от роутера на ARM-процессоре вроде KN-2710 - процессор мощнее, а значит и шифрование пройдёт быстрее и с увеличением скоростей...) будут заведомо меньше чем от связки "Yggdrasil что на роутере, что на ПК", то дополнительно - ради стабильности соединения, - сменил всё в том же CLI роутера планировщик пакетов на интерфейсе тоннеля с дефолтного fq_codel на cake, с последующим сохранением:

    interface TunnelSixInFour0 tx-queue scheduler cake
    system configuration save

    Под катом - сравнение по замерам "до" и "после" смены планировщика пакетов на интерфейсе (хотя не буду отрицать, что могла также сказаться и нагрузка непосредственно на сервер тестирования скорости), из отмеченного - уменьшение колебания пинга (jitter):

    Скрытый текст

     

    Yggdrasil_Speedtest_without_cake.png.a5a8efea15d7229164db5dd95ff264b5.pngYggdrasil_Speedtest_with_cake.png.9bdf6873d98b442cc72cbe6d32d8ded2.png

     

     

    • Thanks 1
  2. На фоне новостей про "тестирование РКН окончательной блокировки Telegram на тюменцах", а так же продолжающемуся развитию python-версии MTProto, решился на выходных основательно засесть за "допиливание" крутящегося на роутере личного проксика таким образом, чтобы он и в качестве бэкэнда работал за другим проксирующим сервером (в моём случае - nginx), и чтобы при этом работала поддержка fake-tls, маскирующегося при этом под сертификат на фронтенде.

    Важный дисклеймер: описанный ниже способ несовместим с защищёнными доменами от KeenDNS (по крайней мере - на прошивке 2.16), так как nginx из Entware нужно будет слушать на порту 443, также используемой прошивочной службой. Помимо этого, должен оговорить что доменное имя получено от noip (статья по настройке), айпи-адрес при этом - "белый", купленный за сотню в месяц у провайдера.

    Шаг нулевой (поначалу - неочевидный): скомпилировать nginx, как минимум - поддерживающий необходимый для проксирования набор опций ("--with-stream_proxy_module" и "--with-stream_ssl_preread"), а как максимум - ещё и несколько опций, полезных при логировании перенаправлений ("--with-stream_realip_module", например); полный вывод "nginx -V" - под катом, установочный архив под mipsel - nginx-extratest_1.16.1-1c_mipsel-3.4.ipk (под mips - т.е. для Zyxel Keenetic LTE, например, - не компилировал, но позже могу добавить, если окажется востребованным)

    Скрытый текст
    
    ~ # nginx -V
    nginx version: nginx/1.16.1
    built by gcc 7.4.0 (OpenWrt GCC 7.4.0 r944-a63df64b)
    built with OpenSSL 1.1.1b  26 Feb 2019
    TLS SNI support enabled
    configure arguments: --crossbuild=Linux::mipsel --with-cc=mipsel-openwrt-linux-gnu-gcc --with-cc-opt='-I/home/baz/entstbl/Entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/opt/include -I/home/baz/entstbl/Entware/staging_dir/toolchain-mipsel_mips32r2_gcc-7.4.0_glibc-2.27/include -O2 -pipe -mno-branch-likely -mips32r2 -mtune=mips32r2 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float -I/home/baz/entstbl/Entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/opt/include/libxml2 -Wno-error=parentheses -Wno-error=implicit-fallthrough' --with-ld-opt='-L/home/baz/entstbl/Entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/opt/lib -Wl,-rpath,/opt/lib -Wl,-rpath-link=/home/baz/entstbl/Entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/opt/lib -Wl,--dynamic-linker=/opt/lib/ld.so.1 -L/home/baz/entstbl/Entware/staging_dir/toolchain-mipsel_mips32r2_gcc-7.4.0_glibc-2.27/lib -lxml2' --prefix=/opt --conf-path=/opt/etc/nginx/nginx.conf --http-log-path=/opt/var/log/nginx/access.log --error-log-path=/opt/var/log/nginx/error.log --lock-path=/opt/var/lock/nginx.lock --pid-path=/opt/var/run/nginx.pid --modules-path=/opt/lib/nginx --http-client-body-temp-path=/opt/var/lib/nginx/body --http-fastcgi-temp-path=/opt/var/lib/nginx/fastcgi --http-proxy-temp-path=/opt/var/lib/nginx/proxy --http-scgi-temp-path=/opt/var/lib/nginx/scgi --http-uwsgi-temp-path=/opt/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_log_module --without-http_upstream_zone_module --without-stream_upstream_zone_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_log_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_proxy_module --with-stream_realip_module --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-headers-more-filter --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-auth-pam --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-cache-purge --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-dav-ext --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-ndk --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-echo --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-fancyindex --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/nchan --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-lua --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/rtmp --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-uploadprogress --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-upstream-fair --add-dynamic-module=/home/baz/entstbl/Entware/build_dir/target-mipsel_mips32r2_glibc-2.27/nginx-1.16.1/modules/http-subs-filter

     

    Шаг 0.5: настройки в веб-интерфейсе. Отключаем доступ к админке через интернет:

    Скрытый текст

    access.png.a68168bf7c1f458f1ba3189a7c2da4c4.png

    настраиваем перенаправление с 80-го порта внешнего интерфейса на другой адрес (в данном случае - 127.0.0.1:8888)

    Скрытый текст

    reroute.thumb.png.21cd1034df0a5fc5c61e50312561e660.png

    Шаг 1: настроить получение сертификата Let's Encrypt для nginx. Настройка проводилась по инструкции на гитхабе проекта Entware (на английском, но наиболее современная; некоторые команды и ссылки в аналогичной инструкции на русском за годы с момента написания успели устареть).

    Неизбежные отклонения из-за другого пакета (пакет на базе nginx-extras вместо обычного nginx) и из-за требований для маскировки прокси под TLSv1.3:

    во-первых, за неимением какого-либо поднятой на роутере обычной страницы, пришлось методом копирования "привить" от обычного пакета "стандартную заглушку" (html.zip), т.к. в своё время при настройке nginx-extras стандартной заглушки от него я не заметил;

    во-вторых, описанные в инструкции настройки, по большей части, проводились не в nginx.conf, а в "/sites-available/default"; изменения для поддержки TLSv1.3 также пришлось внести и в "ssl.conf". По окончании всех шагов, содержимое файла "default" приняло такой вид (комментарии из оригинального файла удалены для краткости, домены - заменены):

    Скрытый текст
    
    server {
            listen 127.0.0.1:8888;
            server_name имя.дднс.нет;
            #listen [::]:80 ipv6only=on;
            return 301 https://имя.дднс.нет$request_uri;
        }
    
    server {
            #слушаем на сокете для проксирования
            listen unix:/tmp/post.sock ssl proxy_protocol http2;
            #а так же - по адресу, который mtprotoproxy будет использовать для получения сертификата
            listen 127.0.0.1:8443 ssl http2;
            #отбитые ниже настройки позволяют получать 
            #реальный айпи клиентов вместо айпи/сокета nginx
            #(полезно для логов)
            ##############################
            set_real_ip_from 127.0.0.1;
            set_real_ip_from ::1;
            set_real_ip_from unix:;
            real_ip_header proxy_protocol;
            ##############################
            include ssl.conf;
            resolver 127.0.0.1 [::1];
    
            location / {
                root /opt/share/nginx/html;
                index index.html index.htm;
            }
    
            location ^~ /.well-known {
                allow all;
            }
    
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
    }

     

    а файла "ssl.conf" - такой:

    Скрытый текст
    
    ssl_certificate /opt/etc/nginx/certs/имя.дднс.нет/fullchain.pem;
    ssl_certificate_key /opt/etc/nginx/certs/имя.дднс.нет/privkey.pem;
    ssl_trusted_certificate /opt/etc/nginx/certs/имя.дднс.нет/chain.pem;
    ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /opt/etc/nginx/dhparams.pem;
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_ecdh_curve auto;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; always";

     

    сертификат при этом запрашивался следующей командой:

    bash ./dehydrated --domain имя.дднс.нет --ocsp -a rsa -t http-01 --cron

    Шаг 2: Настраиваем config.py у mtprotoproxy для работы с фронтендом:

    Скрытый текст
    
    PORT = 3257
    
    # name -> secret (32 hex chars)
    # дефолтные имена и секреты из неправленного конфига
    USERS = {
        "tg":  "00000000000000000000000000000000",
        "tg2": "0123456789abcdef0123456789abcdef"
    }
    
    # Tag for advertising, obtainable from @MTProxybot
    # AD_TAG = "3c09c680b76ee91a4c25ad51f742267d"
    # Быстрый режим с упрощённым шифрованием - отключен;
    # при желании/необходимости - можно вариант False закомментировать
    # и раскомментировать вариант True
    FAST_MODE = False
    #FAST_MODE = True
    # Включаем поддержку работы с фронтэндом
    PROXY_PROTOCOL = True
    # Makes the proxy harder to detect
    # Can be incompatible with very old clients
    SECURE_ONLY = True
    # Makes the proxy even more hard to detect
    # Compatible only with the recent clients
    # TLS_ONLY = True
    TLS_DOMAIN = "google.com"
    MASK_HOST = "127.0.0.1"
    MASK_PORT = 8443
    # указываем слушающий юникс-сокет во временной памяти роутера
    LISTEN_UNIX_SOCK = "/tmp/telegraph.sock"
    # заставляем прокси слушать только на локалхосте, чтобы не 
    # светить в других интерфейсах
    LISTEN_ADDR_IPV4 = "127.0.0.1"
    LISTEN_ADDR_IPV6 = "::1"

     

    далее - в папке /opt/etc/nginx создаём файл "stream.conf" с примерно таким содержимым:

    Скрытый текст
    
    stream {
    #       proxy_protocol on;
            resolver 127.0.0.1 [::1];
    #       proxy_ssl_server_name on;
    
            upstream mtproto_tls {
                    server unix:/tmp/telegraph.sock;
            }
            upstream web {
                    server unix:/tmp/post.sock;
            }
            upstream mtproto_dd {
                    server unix:/tmp/telegraph.sock;
                    #server 127.0.0.1:3257;
                    #server [::1]:3257;
            }
    
            map $ssl_preread_server_name $name {
                    www.google.com mtproto_tls;
                    "" mtproto_dd;
                    имя.дднс.нет web;
            }
    
            server {
                    listen 443 so_keepalive=on;
                    listen [::]:443 ipv6only=on so_keepalive=on;
                    proxy_pass $name;
                    proxy_protocol on;
                    proxy_ssl_server_name on;
                    tcp_nodelay on;
                    proxy_socket_keepalive on;
                    ssl_preread on;
            }
    }

     

    и прописываем строчку "include stream.conf" в конфиге "nginx.conf" перед/после блока http, а в шапке конфига - прописываем

    load_module "/opt/lib/nginx/ngx_stream_module.so";

     пример рабочего "nginx.conf":

    Скрытый текст
    
    user nobody;
    worker_processes auto;
    worker_cpu_affinity auto;
    worker_priority 5;
    pid /opt/var/run/nginx.pid;
    include /opt/etc/nginx/modules-enabled/*.conf;
    load_module "/opt/lib/nginx/ngx_stream_module.so";
    lock_file "/tmp/nginx.lock";
    
    events {
            use epoll;
            worker_connections 768;
            multi_accept on;
            accept_mutex on;
    }
    
    
    http {
    
            ##
            # Basic Settings
            ##
    
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 65;
            types_hash_max_size 2048;
            # server_tokens off;
    
            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;
    
            include /opt/etc/nginx/mime.types;
            default_type application/octet-stream;
    
            ##
            # SSL Settings
            ##
    
            #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
            #ssl_prefer_server_ciphers on;
    
            ##
            # Logging Settings
            ##
    #       log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
    #                           '"$request" $status $body_bytes_sent '
    #                           '"$http_referer" "$http_user_agent"';
            access_log /opt/var/log/nginx/access.log;
            error_log /opt/var/log/nginx/error.log;
    
            ##
            # Gzip Settings
            ##
    
            gzip on;
            gzip_disable "msie6";
    
            #gzip_vary on;
            gzip_static on;
            gzip_proxied any;
            gzip_comp_level 1;
            gzip_buffers 16 8k;
            gzip_http_version 1.1;
            gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
            include /opt/etc/nginx/conf.d/*.conf;
            include /opt/etc/nginx/sites-enabled/*;
    }
    
    include /opt/etc/nginx/stream.conf;

     

    после чего - перезагружаем mtprotoproxy и nginx ("/opt/etc/init.d/S80nginx reload")

    Эта конфигурация обеспечивает не только работу fake-tls на 443 порту, но также и обеспечивает "обратную совместимость" с более старой версией mtproto (секреты, начинающиеся с "dd"); работает она у меня уже несколько дней, и насколько могу судить - mtprotoproxy за nginx оказался даже более производительным, чем наоборот, как понимаю - в первую очередь из-за использования юникс-сокета во временной памяти: по "оценкам на глаз по пингу в Телеграмме" - где-то в полтора-два раза быстрее.

    Однако хочу сразу заметить, что всё описанное выше не претендует на "идеальность" или "полноту", и если имеются какие-то замечания и исправления от опытных специалистов - готов внести исправления и уточнения.

    P.S.: минутка зависти к владельцам роутеров с поддержкой ядра линукса 4.9 - на них, скорее всего, в ядре включен REUSEPORT, а значит - с Debian вместо Entware можно было бы добиться большей производительности и nginx, и самого mtprotoproxy.py...

    • Upvote 1
  3. В 24.03.2019 в 18:44, Kirya сказал:

    Пересобрал вилочку uvloop-а 0.12,2 под Entware 1903.

    uvloop-0.12.2-cp37-cp37-mipsel-34_Ent1903.whl 1 \u041c\u0431 · 3 downloads

    Обязан сделать одну ремарочку, т.к. сам с пайтоном "на Вы", и слишком долго бился над установкой этого "колеса": при попытке установить его стандартной командой

    python3 -m pip install ./uvloop-0_12.2-cp37-cp37-mipsel-34_Ent1903.whl

    пип ругался подобным образом -

    ERROR: uvloop-0_12.2-cp37-cp37-mipsel-34_Ent1903.whl is not a supported wheel on this platform.

    С энного захода в гугл и по удачной ссылке в выдаче, таки выяснил что pip чувствителен к названию файла .whl, т.к. в нём содержится информация о версии пайтона и о платформе, для которой колесо собрано, и что переименование файла "для удобства хранения" чревато вот такими ошибками при попытке установки колеса.

    Вооружившись этим знанием (а так же способом выяснить, какие "колёса" поддерживает пайтон на роутере):

    Скрытый текст
    
    ~ # python3
    Python 3.7.2 (default, Mar 23 2019, 05:17:43) 
    [GCC 7.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pip._internal
    >>> print(pip._internal.pep425tags.get_supported())
    [('cp37', 'cp37', 'linux_mips'), ('cp37', 'abi3', 'linux_mips'), ('cp37', 'none', 'linux_mips'), ('cp36', 'abi3', 'linux_mips'), ('cp35', 'abi3', 'linux_mips'), ('cp34', 'abi3', 'linux_mips'), ('cp33', 'abi3', 'linux_mips'), ('cp32', 'abi3', 'linux_mips'), ('py3', 'none', 'linux_mips'), ('cp37', 'none', 'any'), ('cp3', 'none', 'any'), ('py37', 'none', 'any'), ('py3', 'none', 'any'), ('py36', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'none', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')]

     

    переименовал файл из "uvloop-0_12.2-cp37-cp37-mipsel-34_Ent1903.whl" в "uvloop-0_12.2-cp37-cp37-linux_mips.whl". После этой манипуляции колесо успешно установилось:

    python3 -m pip install ./uvloop-0_12.2-cp37-cp37-linux_mips.whl 
    
    Processing ./uvloop-0_12.2-cp37-cp37-linux_mips.whl
    Installing collected packages: uvloop
    Successfully installed uvloop-0.12.2

    Надеюсь, этот "дебаг" поможет остальным обновиться до более актуальной версии uvloop 🙂

    • Thanks 1
    • Upvote 1
  4. В 07.10.2018 в 01:44, PoliceMan сказал:

    См скриншоты. mtproto висит на порту 5443. Ссылка для телеги вида tg.<domain>.keenetic.link&port=443

    Нет, к сожалению, не работает: сейчас проверяю на телефоне через сотовое соединение, и без включенной безусловной переадресации на роутере телефон отказывается подключаться к прокси-серверу по такой ссылке.

    UPD: буквально только что на хабре наткнулся на статью по теме. Её пока не читал, но упоминаемый ещё в самом начале sslh имеется в списках пакетов Entware, так что завтра попытаюсь ознакомиться с материалом.

    UPD2: вчера решил подойти к проблеме с другого конца, и разобраться, что именно занимало порт на прослушивание. Оказалось - прошивочная служба для использования облака и ssl-подключения к роутеру. Т.к. я ими не пользуюсь - решил снести их и отключить службу через CLI (спасибо @KorDen за подтверждение в другой ветке, что нужная команда - 'no ip http ssl enable').

    Внимание: непосредственно через CLI отключение через "no ip http ssl enable" может не произойти (у меня, например, происходило зависание терминала, и роутер в панике от неё начинал грузить одно из ядер), поэтому может понадобиться править startup-config прошивки (доступен в списке файлов в "Общих настройках системы" веб-интерфейса), где нужная строка примет вид "ip http ssl no enable".

    После этих манипуляций и смены порта mtprotoproxy на 443 всё завелось, как надо: и прокси работает с минимально возможными пингами, и роутер не жалуется на недоступность обновлений.

    • Thanks 1
  5. 35 минут назад, PoliceMan сказал:

    В веб-интерфейсе есть доступ к внутренним ресурсам по имени. Там можно выбрать на какой ресурс внутри сети давать доступ (в том числе и сам кинетик), по какому домену четвертого уровня и на какой порт внутри сети пробрасывать. Поднимаете mtprotoproxy на любом порту, настраиваете правило и ресурс становится доступным по указанному имени, на 443 порту. Не факт что взлетит, но попробовать стоит.

    Т.е., если правильно понял, поднять поддомен tg на example.keendns.net на 443 порту, и выдавать ссылки формата "tg://proxy?server=tg.example.keendns.net&port=54321&secret=<КЛЮЧ>"? В таком виде пробовал: работало, но вплоть до подключения к "фашистскому" публичному вайфаю, на котором перекрыты все TCP-порты кроме 443-го, т.е. указанный в ссылке порт является также и портом для исходящего соединения от клиента. Наоборот (т.е. вешаем домен на порт Телеграма, а клиенту велим использовать порт 443) также не выйдет: соединения тогда не будет совсем.

    И сразу упреждая следующий вопрос: нет, часть "&port=<ПОРТ>" в ссылке обязательна - Телеграм ссылку без неё не распознаёт как ссылку на прокси-сервер, и задать проксик в настройках вручную, без указания порта, также не позволяет.

  6. 1 час назад, PoliceMan сказал:

    А если попробовать в сторону публикации ресурса на домене четвертого уровня?

    Создать внутренний интерфейс, который будет слушать mtprotoproxy на 443 порту (IP-адрес интерфейса можно задать в настройках версии master проксика), и на этот интерфейс устроить проброс по домену... Есть сомнения (формально ведь - то же перенаправление, только в профиль), но может и стоит попробовать. Впрочем, всё равно кажется что от правил фильтрации в iptables был бы больший прок - жаль, что я смыслю в них ещё меньше, чем в баше.

  7. Небольшое обновление через неделю "тестирования": безусловное перенаправление с порта 443 на порт mtprotoproxy, которое я описал ранее, и правда оказалось "топорным". Конечно, в быту оно редко даёт о себе знать, но при перезагрузке роутера оно начинает конфликтовать с запуском установленного у меня dnscrypt2, плюс не даёт получить список обновления для прошивки NDM. Если кто-то сможет предложить способ фильтровать обращения на порт 443 для mtprotoproxy без проброса по NAT - буду признателен.

    Между делом, попытался научить mtprotoproxy запускаться автоматически, т.к. файл автозапуска из шапки темы у меня при перезагрузке не срабатывал. В баше не силён, поэтому пришёл к костыльному, но рабочему решению - запуску скрипта в терминале screen. Если он ещё не установлен - ставим: 

    opkg install screen

    И вставляем приложенный файл в /opt/etc/init.d/

    Код скрипта с комментариями:

    Скрытый текст
    
    #!/bin/sh
    
    PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    PROXYLOC=/opt/root/mtprotoproxy
    NM=MTProto
    #RULE="ip static rule 0 disable"
    
    #Переменная $RULE является командой CLI для отключения проброса портов по самому первому
    #правилу в списке (отсчёт ведётся с 0, в веб-интерфейсе роутера оно - первое сверху в списке),
    #и выполняется в CLI при помощи пакета ndmq. У себя я его использую для отключения проброса с
    #порта 443 TCP при отключении роутера, т.к. безусловное перенаправление конфликтует с
    #некоторыми другими пакетами (нпр, dnscrypt2) во время включения машины. Отсюда и номер 98 в
    #названии скрипта - чтобы скрипт автозапуска включился позже остальных скриптов,
    #и перенаправление для mtprotoproxy с порта 443 включилось тогда, когда остальным пакетам
    #порт 443 больше не был бы нужен.
    
    #TL;dR - в опубликованной версии скрипта переменная для пакета ndmq и команды для его вызова
    #закомментированы, т.к. для работы непосредственно mtprotoproxy на его личном порту они не
    #нужны. Однако, в случае использования переадресации с 443 порта - см. заметку выше и
    #раскомментировать их, при необходимости внеся в них правки, и проинсталлировать 
    #ndmq, если это не было сделано ранее:
    #opkg install ndmq
    
    start() {
    	screen -s /bin/sh -L -Logfile $PROXYLOC/log.txt -dmS $NM -t $NM python3 $PROXYLOC/mtprotoproxy.py
    	#sleep 120 && ndmq -p "no $RULE"
    	}
    #Запускаем скрипт прокси в отдельном терминале, включем правило переадресации.
    #При желании посмотреть на терминал, в котором работает скрипт, и на собранную за
    #последнее время статистику - ввести в терминале следующую команду:
    #screen -r MTProto
    #для выхода из терминала screen без прерывания его работы - зажать клавиши Ctrl и "A" и,
    #не отпуская, прожать "D"
    
    stop() {
    	#ndmq -p "$RULE" && ndmq -p "system configuration save"
    	screen -S $NM -X kill
    	}
    #Отключаем правило переадресации и сохраняем это отключение в конфигурации NDM, затем -
    #отключаем терминал screen, в котором работает скрипт
    
    case "$1" in
    	start)
    		start
    		;;
    	stop)
    		stop
    		;;
    	restart)
    		stop
    		start
    		;;
    	*)
    		echo "Usage: $0 (start|stop|restart)"
    		exit 1
    		;;
    esac
    

     

     

     

    S98mtprotoproxy

  8. Добавлю парочку дополнительных пунктов, улучшающих quality of life использования прокси.

    Для начала - случай с публичными вайфаями, которые блокируют нестандартные порты и, тем самым, перекрывают доступ к прокси. Поначалу пытался обойти напрямую, подняв MTProto на порту 443, и ожидаемо получил отказ от роутера по причине "место занято". После этого решил воспользоваться другим, простым как топор, решением - и оно таки сработало: провести переадресацию с порта 443 интерфейса выхода в интернет на порт, который занимает MTProto:

    Portforward_Orig.png.31b2da41b502dcb4c2b6faa420040b66.png

    Соответственно, ссылка для клиента меняется с

    tg://proxy?server=<АДРЕС-СЕРВЕРА>&port=54321&secret=<КЛЮЧ>

    на

    tg://proxy?server=<АДРЕС-СЕРВЕРА>&port=443&secret=<КЛЮЧ>

    Результат в "фашиствующем вай-фае":

    Скрытый текст

    List_in_Faschist_Wi-Fi-jpg.thumb.jpg.60bdc6d423284b43be665a01c6ad1396.jpg

    Далее - про помянутый в инструкции AAAA-hostname: для него воспользовался другим топорным решением - хостом от No-IP. Судя по наблюдению, прок от него таки есть - зачастую соединение по буквенной ссылке идёт быстрее, чем по ip-адресу, ну и для роутеров с динамическим ip использование подобного сервиса - единственный вариант.

     

    От себя добавлю пару вопросов: возможно ли как-то дополнительно прописать фильтрацию (через iptables/ip6tables и/или acl для ipv4 и ipv6 в CLI-роутера, например) для 443 порта, чтобы на MTProto шли только обращения для него, а не безусловно все конкретно для этого порта, и имеет ли смысл дополнительно прописывать хост от No-IP в настройках DNS-прокси роутера (в моём случае - dnscrypt2)?

  9. Одна из возможных причин - серьёзный рассинхрон системного времени на роутере с фактическим, т.е. скорее всего понадобится в веб-интерфейсе включить автоматическую синхронизацию, плюс через telnet заставить роутер чаще обновлять время (не раз в неделю, как по умолчанию, а допустим каждые четыре часа), введя следующие команды:

    ntp sync-period 240
    copy running-config startup-config

     

  10. Попробовал настроить блокировку рекламы через Privoxy (топик), настраивал по инструкциям в шапке с использованием конфигов и скриптов из этого поста. Хочу сразу сказать большое спасибо пользователям @Sunix и @Dorik1972 за инструкции по настройке, и @zyxmon - за советы по отладке правил маршрутизации: фильтр поднялся, и в текущем состоянии блокирует большую часть рекламы (в т.ч в некоторых приложениях на iOS после указания прокси в настройках WiFi).

    Теперь - к проблеме, с которой я столкнулся: скрипт от @Dorik1972 для обновления фильтров отказывается выполняться, жалуясь на отсутствующий модуль:

    ~ # ../etc/privoxy/privoxy-bl-upd.pl
    Can't locate strict.pm in @INC (you may need to install the strict module) (@INC contains: /opt/lib/perl5/5.24 .) at ../etc/privoxy/privoxy-bl-upd.pl line 28.
    BEGIN failed--compilation aborted at ../etc/privoxy/privoxy-bl-upd.pl line 28.

    Были подозрения, что где-то напортачил при установке/распаковке архива или не задал нужные права на исполнение, но поиск "strict.pm" по системе результатов не дал, т.е. нужный файл, похоже, и правда отсутствует. Пожалуйста, помогите.

    Пациент - Keenetic Ultra rev.A v2.08(AAGJ.0)C2, система - Entware-3x, список установленных пакетов - под катом. Если потребуется ещё какая-то информация - буду готов предоставить.

    Скрытый текст
    
    ~ # opkg list-installed
    busybox - 1.25.1-2
    ca-certificates - 20161130
    dropbear - 2017.75-1a
    elinks - 0.13-1
    fake-hwclock - 0.11-1
    findutils - 4.6.0-1
    glib2 - 2.50.3-1
    iptables - 1.4.21-2a
    ldconfig - 2.25-8
    libattr - 20160302-1
    libblkid - 2.29.2-1
    libbz2 - 1.0.6-2
    libc - 2.25-8
    libcap - 2.25-1
    libffi - 3.2.1-2
    libgcc - 6.3.0-8
    libiconv-full - 1.11.1-3
    libidn - 1.33-2
    libintl-full - 0.19.8.1-1
    libmount - 2.29.2-1
    libndm - 1.1.0-1a
    libopenssl - 1.0.2k-1
    libpcre - 8.40-2
    libpthread - 2.25-8
    librt - 2.25-8
    libslang2 - 2.3.1a-1
    libssh2 - 1.7.0-1
    libssp - 6.3.0-8
    libstdcpp - 6.3.0-8
    libuuid - 2.29.2-1
    locales - 2.25-8
    mc - 4.8.19-1a
    ndmq - 1.0.2-1a
    ntpd - 4.2.8p10-1
    opt-ndmsv2 - 1.0-8
    perl - 5.24.1-1
    perl-dev - 5.24.1-1
    privoxy - 3.0.26-2
    terminfo - 6.0-1c
    wget - 1.18-2
    zlib - 1.2.11-1
    zoneinfo-asia - 2017b-1
    zoneinfo-europe - 2017b-1

     

    privoxy_conf_v.2.tar.gz

  11. Эх, появись эта тема на пару месяцев раньше - мне, как опытному ламеру и сертифицированному гуманитарию, было бы куда легче настраивать ntpd: в сети слишком много инструкций и советов по решению проблем для очень разных систем и версий программы. С другой стороны, какая-то информация пригодилась и осела в голове и конфигах - может, смогу помочь обтесать инструкцию.

    Для начала оговорюсь, что ставил и настраивал "голый" ntpd (без ntp-utils, ntp-keygen, и ntpdate) для Keenetic Ultra Rev.А (NDMS v2.08(AAGJ.0)C2, Entware-3x), т.е. возможно те проблемы, с которыми сталкивался я, у автора не возникали из-за разницы в оборудовании, версиях прошивок, и установленных пакетов. Теперь - к странностям, которые заметил в конфиге (опять же, крайне вероятно что это я ничего не понял) и решения тех проблем, с которыми я столкнулся:

    • путь в параметре "driftfile" к файлу "ntp.drift" оставлен по умолчанию, хотя в скрипте запуска "S77ntpd" вместо пути "/opt/var/lib/ntp/ntp.drift" указан "/opt/var/spool/ntp/ntp.drift". Из-за этого расхождения демон ожидаемо ругался в логах на отсутствие нужной папки и не мог записать файл на постоянную основу:
      6 Jul 17:11:50 ntpd[13546]: frequency file /opt/var/lib/ntp/ntp.drift.TEMP: No such file or directory

      Файл является критичным, т.к. именно в нём ntpd сохраняет вычисляемую им погрешность часов, и без неё работа демона не имеет смысла. Свою неполадку я решил редактированием пути в конфиге на путь из скрипта запуска. Помимо этого, стоит убедиться что ntpd имеет права производить запись по указанным путям и что файлы в указанных папках не стираются при перезагрузке роутера (в случае с путём из скрипта вышесказанное является верным - возможно, именно поэтому он и отличается от конфигурационного). Советую перепроверить оба пути на наличие файла погрешности, при его отсутствии - исправить конфиг.

    • Во-вторых: возможны неполадки при одновременной работе разных процессов обновления времени. Мне, например, пришлось отключить обновление времени в веб-интерфейсе NDMS.

    • В-третьих: при серьёзном расхождении времени системы с полученным временем от серверов (1000 секунд и более) ntpd "паникует" и отключается, с чем я по незнанию и столкнулся после перезагрузки роутера. Чтобы привести его в чувство, необходимо вручную задать дату со временем по любым достаточно точным часам и произвести перезапуск скрипта:

      date -s ГГГГ-ММ-ДД чч:мм
      /opt/etc/init.d/S77ntpd restart

      Чтобы каждый раз после перезагрузки роутера не заниматься вводом этих команд, дополнительно был установлен пакет "fake-hwclock", сохраняющий показания времени при выключении роутера в отдельный файл и выставляющий их при его включении (хотя, как понимаю, с этим так же может справиться и ntpdate, который себе я не ставил - призываю более компетентных людей на помощь). Допытывание у Гугла также показало, что аргумент "-g" при запуске ntpd заставляет его перестать паниковать и таки произвести сверку часов; я посчитал, что имеет смысл дополнительно его прописать в строке ARGS= скрипта автозапуска.

    • Возвращаясь к конфигу, хочу обратить внимание на пункт "server 127.127.1.0 iburst". Cудя по документации для сравнительно недавней версии 4.2.8p8, этот адрес - указание для ntpd использовать драйвер, позволяющий использовать собственные часы системы (в нашем случае - роутера) как источник точного времени при отсутствии более надёжных, т.е. если я правильно понимаю, параметр iburst для него не нужен. При этом на других сайтах в официальной вики ntp.org (версия из кэша Google, на случай если страница не только у меня недоступна) из-за неточности этого драйвера рекомендуют обязательно настроить этот сервер как сервер Stratum-10, цитирую:

      Цитата

      "Although the default stratum for the Undisciplined Local Clock is 5, in cases where an ntpd may become accessible outside of your immediate, controlled, network is it strongly suggested the the stratum of the Undisciplined Local Clock be raised to no less than 10" - "Хоть для Недисциплинированных Локальных Часов по умолчанию и выставлен часовой слой 5, настоятельно рекомендуется выставить для них часовой слой никак не меньше 10 на случай доступности ntpd вне пределов непосредственно контролируемой вами локальной сети"

      Благо, для этого надо лишь дописать в "ntp.conf" всего одну строчку: 

      fudge 127.127.1.0 stratum 10
    • Были у меня и ещё вопросы к предложенной конфигурации, но ввиду собственного ламерства будет гораздо честнее выложить инструкцию, на которую сам оглядывался при настройке, приложить собственный конфиг, и дождаться замечаний от более опытных пользователей.

      Скрытый текст
      
      # use a random selection of 4 public stratum 2 servers
      # see http://twiki.ntp.org/bin/view/Servers/NTPPoolServers
      
      # правила для блокировки ненужных запросов (варианты IPv4 и IPv6); отключение monitor во избежание 
      # использования ntp-сервера в ДДОС-атаках (https://habrahabr.ru/post/209438/ )
      restrict default nomodify notrap nopeer noquery
      restrict -6 default nomodify notrap nopeer noquery
      disable monitor
      
      # правила, разрешающие локалхосту обращаться самому к себе (варианты IPv4 и IPv6)
      restrict 127.0.0.1
      restrict -6 ::1
      
      # путь к файлу ntp.drift
      driftfile  /opt/var/spool/ntp/ntp.drift
      
      # сервера, с которыми происходит обновление времени
      server 0.ru.pool.ntp.org iburst
      server 1.ru.pool.ntp.org iburst
      server 2.ru.pool.ntp.org iburst
      server 3.ru.pool.ntp.org iburst
      
      # разрешение на запрос точного времени из локальной сети; 192.168.1.0 - подсеть, 255.255.255.0 - маска
      restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap nopeer
      
      # закомментированые примеры настроек часов и/или источников сигнала эталонной частоты, подключённых к
      # локалхосту напрямую, а именно - приёмника GPS в первом случае, и шины(?) разделяемой памяти - во втором
      
      # GPS(NMEA)+PPS
      #server 127.127.20.0 minpoll 4 prefer
      #fudge 127.127.20.0 flag3 1 flag2 0
      
      # SMA PPS
      #server 127.127.28.0 minpoll 4 prefer
      #fudge 127.127.28.0 refid PPS flag3 1
      
      # закомментированый пример сервера точного времени в локальной сети
      #server 192.168.1.253
      
      # простые часы локалхоста как источник точного времени; по умолчанию - не используется при наличии более 
      # точных источников, вторая строка дополнительно это оговаривает
      server 127.127.1.0
      fudge 127.127.1.0 stratum 10

       

     

    • Thanks 2
×
×
  • Create New...