{"id":19573945,"url":"https://github.com/hexresearch/hexcapt","last_synced_at":"2025-02-26T11:17:22.056Z","repository":{"id":99626593,"uuid":"72301704","full_name":"hexresearch/hexcapt","owner":"hexresearch","description":null,"archived":false,"fork":false,"pushed_at":"2016-11-13T10:54:58.000Z","size":64,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-01-09T03:56:54.313Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hexresearch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-29T18:15:13.000Z","updated_at":"2020-02-10T05:03:47.000Z","dependencies_parsed_at":"2023-05-16T00:15:53.800Z","dependency_job_id":null,"html_url":"https://github.com/hexresearch/hexcapt","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Fhexcapt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Fhexcapt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Fhexcapt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Fhexcapt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hexresearch","download_url":"https://codeload.github.com/hexresearch/hexcapt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240840106,"owners_count":19866168,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T06:37:06.653Z","updated_at":"2025-02-26T11:17:22.010Z","avatar_url":"https://github.com/hexresearch.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n#  hexcapt\n\n## Краткое описание работы\n\nСервис ```hexcapt``` осуществляет работу captive portal следующим образом:\n\n- Маркирует сетевые соединения, используя заданный при помощи API уровень доступа (см.конфигурирование)\n- Запускает заданное число DNS прокси с заданными настройками, для осуществления различного \nразрешения адресов в зависимости от заданных режимов\n- Осуществляет перенаправление (DNAT) DNS запросов на заданный инстанс DNS прокси в зависимости \nот заданного для MAC адреса (пользователя) уровня доступа\n- Осуществляет фильтрацию проходящего наружу трафика в зависимости от уровня доступа (см.\n```modes/mode/forward``` )\n- Осуществляет перенаправление (DNAT) входящего для заданных портов на локальный сервис,\nв случае, если это указано в настройках режимов\n \n\nТаким образом, для конфигурации по умолчанию выполняется следующее:\n\n**Пользователи с уровнем доступа по умолчанию (0):**\n\n- DNS запросы перенаправляются на локальный DNS прокси\n- Все адреса разрешаются на локальный адрес портала (192.168.2.1)\n- Все HTTP запросы перенаправляются на локальный сервер на порту 81\n- Соединения наружу блокируются\n\n**Пользователи с уровнем доступа 1:**\n\n- DNS запросы перенаправляются на локальный DNS прокси\n- Адреса (кроме исключений) разрешаются вышестоящим DNS\n- Адреса (исключения) разрешаются на локальный адрес портала (192.168.2.1)\n- Все HTTP запросы наружу разрешены (кроме списка исключений, по DNS(!))\n- Прочие соединения наружу блокируются\n\n**Пользователи с уровнем доступа 2:**\n\n- DNS запросы перенаправляются на локальный DNS прокси\n- Адреса (кроме исключений) разрешаются вышестоящим DNS\n- Разрешены HTTP, HTTPS соединения наружу\n- Прочие соединения наружу блокируются\n\nДанное поведение является настраиваемым, например, для добавления перенаправления\nHTTP на локальный сервер в режиме 1 необходимо добавить:\n\n```\n\tredirect:\n\t\t- [tcp, 80, 81]\n```\n\nв соответствующую секцию конфига:\n\n```\nmodes:\n    - mode:\n        marks: [1]\n        redirect:\n            - [tcp, 80, 81]\n        forward:\n            - [tcp, 443]\n\n```\n\nСервис самостоятельно создает необходимые цепочки и правила iptables в следующих таблицах:\n\n- ``` mangle / PREROUTING ``` (маркирование трафика)\n- ``` nat / PREROUTING ``` (DNAT)\n- ``` filter / INPUT ``` (фильтр входящих соединений)\n- ``` filter / FORWARD ``` (разрешение роутинга в зависимости от режимов)\n\n\n### Компоненты\n\n#### hexcapt\n\nОсновной сервис. Реализует API, создает необходимые правила iptables/netfilter\n\n#### hexcapt-client\n\nКлиент для сервиса. Взаимодействует с сервисом по протоколу HTTP через API (см. ниже)\n\n#### hexcapt.yaml\n\nКонфигурационный файл сервиса (см. ниже)\n\n#### hexcapt.service\n\nФайл сервиса ```systemd```.\n\n\n#### ndnproxy \n\nКонфигурируемый, легковесный DNS прокси, использующийся для организации\nCaptive Portal.\n\n#### libndm.so\n\nShared library, необходимая ndnproxy (должна находиться в LD_PATH).\n\n\n## API\n\nДля управления сервисом существует HTTP API:\n\n```\n\nHTTP GET http://URL:PORT/hexcapt/set-access?mac-addr=MAC\u0026mark=MARK\n\n```\n\nПример:\n\n```\n\ncurl -i http://localhost:10011/hexcapt/set-access?mac-addr=fe:66:3f:e6:e5:e3\u0026mark=1\n\n```\n\nЛибо можно использовать консольный клиент:\n\n```\n\nhexcapt-client\n\nUsage: hexcapt-client [--url ARG] --mac ARG --access ARG\n  hexcapt client utility\n\nAvailable options:\n  -h,--help                Show this help text\n  --url ARG                hexcapt API URL\n  --mac ARG                MAC address to set acess\n  --access ARG             access mark\n\n\n```\n\n**Пример:**\n\n```hexcapt-client --mac C1:34:2D:51:C4:E4  --access 1```\n\nДанный клиент по умолчанию считает, что сервис ```hexcapt``` работает на той же машине, что\nи клиент. Порт API, на котором слушает сервер, ```hexcapt-client``` ищет в конфигурационных\nфайлах ```hexcapt.yaml``` в тех же местах, и в той же последовательности, что и сервис.\n\nВозможно явно задать URL API при помощи параметра ```--url``` в виде ```http://URL:PORT```.\n\n\n## Установка\n\n- Скопировать ```nexcapt``` в ```/usr/bin``` или ```/usr/local/bin```\n- Скопировать ```nexcapt-client``` в ```/usr/bin``` или ```/usr/local/bin```\n- Скопировать ```hexcapt.yaml``` в ```/etc```\n- Скопировать ```ndnproxy``` в ```/usr/bin``` или ```/usr/local/bin```\n- Скопировать ```libndm.so``` в ```/usr/lib``` или ```/usr/local/lib```\n- Запустить ldconfig\n- Убедиться, что ```libndm.so``` доступен в ```LD_PATH```\n- Скопировать ```hexcapt.service``` в ```/etc/systemd/system```\n- Проверить, что путь к ```hexcapt``` в ```hexcapt.service``` соответствует реальному положению дел\n- Выполнить ```systemctl daemon-reload```\n- Выполнить ```systemctl enable hexcapt```\n\n## Запуск \n\n Сервис должен стартовать автоматически при загрузке системы при помощи systemd.\n Ручной старт/стоп/перазапуск осуществляются при помощи команды ```systemctl start|stop|restart hexcapt```\n\n\n## Конфигурирование\n\n1. Убедиться, что бинарник ```ndnproxy``` находится в системном пути и доступен\n1. Настройки сервиса находятся в файле ```hexcapt.yaml``` \n\n\n### Настройки hexcapt.yaml\n\n```\n\n# порт, на котором слушает HTTP API\nlisten: 10011\n\n# адрес, к которому биндится HTTP API\nbind: 0.0.0.0\n\n# частота обновления таблицы mangle\nsleep: 1.0\n\n# интерфейс локальной сети роутера\ninput-iface: br0\n\n# локальный IP роутера\nlocal-ip:  192.168.2.1\n\n# режимы работы сервиса\nmodes:\n\n    - mode:\n\t    \n# без определенных марок - режим по умолчанию.\n# (некоторые) настройки отсюда добавляются в прочие режимы,\n# например, local-domains\n\n        marks: []\n\n#  данные домены будут резолвится на локальный адрес\n#  для указанных режимов (если марка не задана - то для всех режимов)\n#  при задании домена в виде: *.zaycev.net\n#  резолвится как сам домен, так и его поддомены.\n\n        local-domains:\n            - \"clients3.google.com\"\n            - \"connectivitycheck.android.com\"\n            - \"geowalk.ru\"\n            - \"start.tutu.tv\"\n            - \"tilestream.geowalk.ru\"\n            - \"tutu.tv\"\n            - \"video.tutu.tv\"\n            - \"www.geowalk.ru\"\n            - \"www.msftncsi.com\"\n            - \"www.tutu.tv\"\n            - \"www.video.tutu.tv\"\n\n\n    - mode:\n# марки,  определенныё для режима - может быть несколько\n        marks: [0]\n\n# DNAT-ы для данного режима (протокол, порт источника, порт назначения)\n# может быть несколько\n        redirect:\n            - [tcp, 80, 81]\n\n        local-domains: []\n\n    - mode:\n        marks: [2]\n        local-domains: []\n        forward:\n            - [tcp, 443]\n            - [tcp, 80]\n\n\n# инстансы ndnproxy\nndnproxy:\n\n\n    - instance:\n# TCP порт, на котором слушает прокси\n        tcp-port: 10053\n\n# UDP порт, на котором слушает прокси\n        udp-port: 10053\n# марки, по которым выполняется перенаправление (DNAT)\n# на этот инстанс прокси\n        marks: [0]\n\n# заданные статические адреса (маски поддерживаются)\n        static-a:\n            - ['*', 192.168.2.1]\n\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexresearch%2Fhexcapt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhexresearch%2Fhexcapt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexresearch%2Fhexcapt/lists"}