• Создание DNS сервера с ответом по умолчанию?

    @romancelover
    программист C++ под Linux
    dnsmasq умеет такое:

    https://wiki.archlinux.org/index.php/dnsmasq#Overr...

    Furthermore, it's possible to return a specific address for all domain names that are not answered from /etc/hosts or DHCP by using a special wildcard:

    address=/#/1.2.3.4
    Ответ написан
    1 комментарий
  • Что такое криптор и дескриптор класса в C++?

    @romancelover
    программист C++ под Linux
    Скорее всего имеется в виду конструктор и деструктор класса, то есть функции, отвечающие за инициализацию объекта и освобождение связанных с ним ресурсов.
    Ответ написан
    Комментировать
  • Как пробросить белый ip адрес на виртуалку полученный через GRE туннель?

    @romancelover
    программист C++ под Linux
    Это мне напоминает свою конфигурацию сети.
    Провайдер даёт одну /64 подсеть IPv6. К компьютеру подключён по проводу телефон, на который пробрасывается один из адресов по VPN.
    При этом на компьютере запущен NDP прокси, который отвечает на запросы NDP по IP телефона. Вышестоящий роутер делает NDP запрос, кому принадлежит адрес телефона, компьютер отвечает, что ему, роутер отправляет пакет компьютеру, тот его получает и маршрутизирует в сеть телефона.

    В вашем случае с IPv4 это будет ARP прокси. При этом сервер будет отвечать на ARP запросы, как будто адрес виртуалки принадлежит ему, а на самом деле получать пакеты на маршрутизацию куда-то ещё, и передавать их в туннель.
    Ответ написан
    Комментировать
  • Как открыть порт через 2 роутера?

    @romancelover
    программист C++ под Linux
    Ещё вариант:
    1) меняете сеть LAN на втором роутере на отличную от сети первого (например, на первом 192.168.1.0, на втором 192.168.2.0).
    2) на втором роутере задаёте в настройках WAN Static IP из сети первого роутера (например, 192.168.1.10) и отключаете NAT.
    3) на первом роутере добавляете маршрут на сеть второго роутера через его адрес, например, 192.168.2.0 через 192.168.1.10.
    4) все настройки NAT и проброс портов делается на первом роутере, даже если компьютер подключён к второму.
    Возможно будет проблема с тем, что роутер будет принимать адреса только из своей подсети в качестве назначения проброса портов (хотя он натит адреса обеих подсетей и по идее может пробрасывать порты на любую подсеть, это только ограничение пользовательского интерфейса). В таком случае можно поиграться с режимом разработчика в браузере и изменить параметры HTTP запроса.
    Ответ написан
    Комментировать
  • Как обеспечить доступ мобильному телефону к Exchange в локальной сети, не используя vpn?

    @romancelover
    программист C++ под Linux
    Мысль такая: берём у провайдера IPv6, у того, кто хочет подключаться без VPN, тоже ставится IPv6 (хорошо, если у него оператор МТС, иначе без VPN не обойтись), и он подключается к хосту с Exchange или какими-то другими локальными сервисами. Для ограничения доступа можно перед хостом поставить firewall, блокирующий подключения к Exchange. Перед подключением клиент выполняет какое-то действие, требующее аутентификации (например, обращается по HTTPS ссылке с указанным сертификатом или логином и паролем, или заходит по SSH с определённым ключом, просто заходит, не вводит какую-то команду), можно и port knocking'ом просто обратиться, (хотя это уже не так безопасно, если кто-то может просмотреть трафик клиента), и по этому действию с адреса клиента на определённое время разрешается доступ к сервисам.
    Хотя можно и просто порты пробросить, и не использовать IPv6, с контролем по такому же принципу (по умолчанию доступ закрыт, по какому-то действию с аутентификацией на определённое время с адреса клиента открывается). Без IPv6 возможна ситуация, что у клиента shared IP, и кто-то ещё с этого же IP зайдёт, но это маловероятно.
    Ответ написан
    3 комментария
  • Как посмотреть на телефоне список подключившихся девайсов к раздаваемого интернету (к точке доступа телефона)?

    @romancelover
    программист C++ под Linux
    команда arp -an или ip neigh в эмуляторе терминала (termux подойдёт) выведет IP и MAC подключённых устройств.
    Ответ написан
    Комментировать
  • Как сменить айпи на втором ПК, подключенному к одной LAN сети?

    @romancelover
    программист C++ под Linux
    Вообще-то проще всего заказать самый дешёвый VPS с доступом по SSH, подключиться к нему с туннелем
    ssh -p port user@server -D localport

    и на адресе localhost:localport у вас будет локальный SOCKS прокси, программа, выходящая через него в инет, будет иметь внешний IP от VPS. Можно использовать "проксификатор", вроде proxychains под Linux.
    Можно даже запускать несколько подключений, подключаться к разным портам локального прокси, и иметь несколько разных внешних IP даже на одном компьютере.
    Ответ написан
  • Как узнать какие были изменения после установки программы linux?

    @romancelover
    программист C++ под Linux
    dpkg -L util-linux

    equery f util-linux

    rpm -ql util-linux

    Эти команды (в зависимости от дистрибутива) выдают список файлов, принадлежащих указанному пакету (util-linux в примере).
    Ответ написан
    Комментировать
  • Что означают флаги GCC?

    @romancelover
    программист C++ под Linux
    -o (output) - имя выходного файла
    -l (library) - имя библиотеки для линковки (-lxdo означает "использовать библиотеку libxdo").
    Ответ написан
    Комментировать
  • Как раздать интернет с андроида через usb-ethernet переходник?

    @romancelover
    программист C++ под Linux
    Скорее всего никак, можно попробовать только с рутом. Тогда способ раздачи интернета не будет отличаться от обычного линукса (iptables и т.п.), обычный android не содержит интерфейса для этого. Раздача будет запускаться скриптом из командной строки.
    С точки зрения андроида, USB Ethernet и USB при подключении к компьютеру - это совершенно разные сетевые интерфейсы, поэтому при подключении USB Ethernet не запустится раздача как по обычному USB, даже если USB Ethernet поддерживается в системе.
    Есть ещё вариант: андроид подключается к какому-то миникомпьютеру на линуксе с USB и Ethernet интерфейсами, он раздаёт интернет по USB как обычно, а на этом компьютере в bridge объединяются интерфейсы RNDIS от андроида и Ethernet. Так раздача должна работать, там нет ограничения, что устройство должно быть только одно.
    Ответ написан
  • Как защитить компьютер от мусорного софта?

    @romancelover
    программист C++ под Linux
    Поставить линукс (чтобы отсечь большинство специфичного для винды malware), создать пользователя с админскими правами, и подключаться под ним удалённо, а ребёнку давать простого юзера.
    Но Wine работает от простого пользователя, и у каждого пользователя свой каталог .wine. То есть он сам сможет туда ставить игры, моды всякие, а в случае повреждения этого каталога или попадания туда вирусни можно его просто снести и переустановить игрушки. Можно настроить и бэкап инкрементный по расписанию (то есть в начале месяца архивируется весь этот каталог, а потом каждый день только изменения), тогда если ребёнок скачал что-то не то, его данные можно будет восстановить, чтобы не терять какие-то данные (хотя сейчас игры скорее всего хранят данные в облаках, поэтому такой необходимости может и не быть). При этом бэкап запускается от root юзера, и malware от обычного юзера не сможет удалить бэкапы.
    Ответ написан
  • Почему ГПСЧ нужно инициализировать в main()?

    @romancelover
    программист C++ под Linux
    Потому что в srand() будет передаваться одинаковое число. Функция time возвращает число секунд от начала 1970 года, её значение меняется раз в секунду, а цикл программы выполняется намного быстрее.
    Ответ написан
    Комментировать
  • Правильное применение const?

    @romancelover
    программист C++ под Linux
    Параметры функции, объявленные как const ссылки, могут инициализироваться результатом выражения (rvalue), а обычные ссылки, без const - только присваиваемому выражению (lvalue). В С++11 появились также rvalue ссылки, которые могут быть изменяемыми. Сложные объекты лучше передавать в функции по ссылкам (или указателям), чтобы избегать копирования.
    Значит если параметр передаётся по ссылке, то ссылка с const может быть входным параметром функции, а без const - скорее всего выходным (или двунаправленным, который передаётся в функцию и там модифицируется, и служит результатом выполнения). Параметр по ссылке без const может быть входным, но это неудобно - в нём нельзя передать выражение, а только переменную (или в общем случае lvalue). И ещё это сбивает использующих функцию программистов с толку, наводя их на мысль, что параметр по ссылке должен модифицироваться внутри вызываемой функции.

    Сразу понятно назначение параметров, какой параметр входной, какой выходной. Параметр по значению всегда входной, по указателю - аналогично ссылке, с const только входной, без const скорее всего выходной (но не обязательно).
    rvalue ссылки нужны в том случае, если нужно сохранить объект, переданный в функцию, без копирования (объект по const ссылке пришлось бы скопировать внутри функции, а это неоптимально). Параметр по rvalue ссылке - тоже входной параметр функции, как и по const ссылке.
    Ответ написан
    1 комментарий
  • Почему функция не видит public переменную из другого класса?

    @romancelover
    программист C++ под Linux
    mWindow определён в классе Window, а обращаются к нему в другом классе Camera, в котором члена mWindow нет. Как компилятор узнает о связи между классами Camera и Window, чтобы один использовал члены другого?
    Можно обратиться к нему в том случае, если Camera будет наследником Window (но в данной ситуации это скорее всего не нужно), или в Camera будет член типа Window или указатель на него (Window* _window) тогда _window->mWindow будет допустимо.
    Ответ написан
    Комментировать
  • Доступ и к Интернету и к локальной сети для клиента OpenVPN?

    @romancelover
    программист C++ под Linux
    В зависимости от настроек клиента, если там задан маршрут только на сеть за VPN сервером, то интернет останется, а если маршрут по умолчанию, то отвалится. Можно для проверки зайти на сайты вроде 2ip, если там IP VPN сервера, интернет идёт через него и зависит от VPN.
    Это задаётся в конфиге: redirect-gateway для маршрута по умолчанию и ifconfig/route для обычного маршрута (вам скорее всего нужен такой вариант, чтобы выход в интернет не зависел от VPN, он задаётся по умолчанию).

    ifconfig задаёт IP и маску подсети, все адреса по маске относятся к данной сети и идут по VPN.
    route позволяет перенаправлять на VPN другие подсети (скорее всего вам не понадобится).
    то есть просто на одном компе ifconfig 10.10.10.11 netmask 255.255.255.0, на другом ifconfig 10.10.10.12 netmask 255.255.255.0, и можно обращаться к ним по IP 10.10.10.11 и 10.10.10.12.
    Ответ написан
    1 комментарий
  • Можно ли узнать WAN IP Wi-Fi сетей поблизости?

    @romancelover
    программист C++ под Linux
    Можно узнать только MAC-адрес. IP-адрес передаётся в зашифрованной части кадра.
    MAC-адрес передаётся только в локальной сети, WAN IP по нему не определить.
    Даже если сеть без шифрования, или кадры удалось как-то расшифровать, у IP-пакетов в локальной сети в качестве адресов источника или назначения будут внутренние IP-адреса клиентов. WAN IP туда проставится уже после NAT, и пойдёт по тому интерфейсу, которым точка подключена к провайдеру.

    Хотя я нашёл способ, с помощью которого WAN IP всё же можно попытаться определить. Хотя это будет только IPv6 адрес самого роутера, а не клиентов за ним (тем более что подсеть для клиентов может отличаться от найденной).
    На многих роутерах (в частности Sercomm от МГТС), IPv6 адреса назначаются по EUI-64, по MAC-адресу. Допустим удалось выяснить MAC адрес на Wi-Fi, например, 94:4a:8c:00:11:22. На WAN будет адрес 94:4a:8c:00:11:23 - они часто назначаются подряд, и известна подсеть для IPv6 адресов у данного провайдера в данной местности, например, 2a00:1370:8030::/48.
    Тогда можно пропинговать адреса по маске 2a00:1370:8030:xxxx:964a:8cff:fe00:1123 (всего 16 бит, т.е. 65536 адресов). Если какой-то из них ответит - это искомый WAN IP. Если роутер дырявый, он может по этому адресу держать какой-то интерфейс управления.
    Ответ написан
    Комментировать
  • Возможно ли получить данные с телефона который использует мой вайфай?

    @romancelover
    программист C++ под Linux
    Напрямую подключиться только через вайфай и слить данные не получится, данные на телефонах достаточно хорошо защищены. Для получения доступа к данным нужен физический доступ и ввод пароля (https://m.habr.com/ru/post/541190/). Cookies передаются по HTTPS поэтому просто их угнать, как когда-то раньше, тоже не выйдет.
    Можно попытаться подсунуть ему фишинговую страницу, когда во время серфинга в интернете через ваш Wi-Fi он перенаправляется на страницу, выглядящую как форма авторизации в соцсети или каком-то популярном сервисе, но находящуюся на подконтрольном вам сервере. Пользователь может не заметить этого и ввести там свой пароль, который останется на вашем сервере.
    Если пользователь начинающий, и сидит через браузер, можно перенаправить его на sslstrip, чтобы снять защиту данных SSL. Браузер выдаст предупреждение о небезопасном подключении, но пользователь может на это забить. Но в современных браузерах есть защита от такого способа (HSTS), и если они запомнили, что на каком-то сайте вход через HTTPS, то HTTP без шифрования автоматом будет запрещаться.
    Ответ написан
    Комментировать
  • Как скормить компилятору такую шляпу?

    @romancelover
    программист C++ под Linux
    У меня компилятор (g++ 10.2.0) сам подсказывает, чего не хватает:
    test.cpp: В конкретизации «void Sorts::PrintArray(int) [с T = int]»:
    test.cpp:161:21: required from here
    test.cpp:118:26: ошибка: зависимое имя «std::__cxx11::list::iterator» разбирается как не тип, но конкретизация дает тип
    118 | for (std::list::iterator it = arrayList.begin(); it != arrayList.end(); it++)
    | ^~~~~~~~
    test.cpp:118:26: замечание: задайте «typename std::__cxx11::list::iterator», если подразумевается тип

    И так во во всех четырёх местах с итераторами. Это связано с тем, что std::list::iterator - это не обычный тип, а шаблонный, а по правилам языка С++ требуется указывать, что этот шаблон должен разбираться именно как тип.

    Это нужно потому, что не всегда возможно определить, является ли подстановка шаблона типом или значением.
    void foo(const T& t)
    {
       // declares a pointer to an object of type T::bar
       T::bar * p;
    }
    
    struct StructWithBarAsType
    {
       typedef int bar;
    };
    
    struct StructWithBarAsValue
    {
        static int bar;
    };

    Непонятно, T::bar это тип или значение? Если в шаблон передать StructWithBarAsType, то это могло бы быть типом, если StructWithBarAsValue - то значением. Поэтому по умолчанию компилятор принимает такую запись за значение (а раз такого члена iterator в std::vector нет, то компилятор ругается на это), а если указать typename, то он будет знать, что это именно тип.
    Ответ написан
    Комментировать
  • Как заставить OpenVPN использовать прокси?

    @romancelover
    программист C++ под Linux
    https://forums.openvpn.net/viewtopic.php?t=15299
    был уже такой вопрос.

    что можно попробовать:
    1) кроме HTTP_PROXY добавить ещё HTTPS_PROXY

    2) сделать прозрачный прокси на стороне VPN сервера через iptables

    3) задать прокси в настройках на стороне клиента
    Ответ написан
    2 комментария
  • Как решить задачу на поиск простых множителей?

    @romancelover
    программист C++ под Linux
    Программа пытается проверять на делимость все числа от 600851475143 подряд, и на этом зависает (слишком много проверок нужно выполнить). Переменная С уменьшается только вычитанием единицы.
    И считает она не то, что нужно.
    Я поправил так (самый простой код, можно ещё оптимизировать, например, проверять числа до корня квадратного из делимого, а не до делимого). Но для новичка сойдёт.
    #include <iostream>
    int main()
    {
        std::cout << "Hello World!\n";
        unsigned long long C = 600851475143;
        unsigned long long temp=3;
        if((C % 2) == 0)
        {
            C = C / 2;
            std::cout << 2 << std::endl;
        }
        while  (C > 1)
        {
            if (C % temp == 0) {
                C = C / temp;
                std::cout << temp << std::endl;
            }
            temp=temp+2;
        }
    }

    Вывод:
    Hello World!
    71
    839
    1471
    6857
    Ответ написан