принять сокет от локального клиента на ВСЕХ интерфейсах; rejcct удаленный клиент - PullRequest
3 голосов
/ 16 мая 2009

Мне нужно написать небольшое прокси-приложение для сервера сокетов, которое принимает подключения от локальных приложений на ВСЕХ интерфейсах (сокет должен быть привязан к 0.0.0.0).

Я не знаю, как этого добиться (у меня есть дополнительные требования, которые предотвращают привязку к 127.0.0.1).

Первая попытка сделать это:

связывания (0.0.0.0) ... s = accept () ... // отклонить удаленное соединение если (s.src_addr не находится в local_interfaces) close () ... // продолжить работу с локальным соединением

Эта реализация имеет побочный эффект для удаленных приложений - они видят комбинацию принятия / закрытия. Система должна вести себя так, чтобы удаленное приложение воспринимало, что «там ничего нет»: -> SYN <- RST / ACK </p>

Для реализации этого поведения я использовал комбинацию API winsock SO_CONDITIONAL_ACCEPT и обратного вызова WSAAccept (LPCONDITIONPROC lpfnCondition), чтобы принимать / отклонять соединение на основе его исходного интерфейса (т. Е. Является ли он одним из локальных адресов или нет).

Это приводит к желаемому функциональному поведению: работают локальные приложения; удаленные приложения получают требуемую ошибку WSAECONNREFUSED.

Это связано с определенными ценами: SO_CONDITIONAL_ACCEPT имеет определенные побочные эффекты (см. MSDN), но, что более важно, нам нужна реализация LINUX и, возможно, позже придется перенести ее на другие UNIX.

Моим первым приоритетом является решение LINUX. Обратите внимание, что я готов пойти дальше API сокетов, если это то, что нужно.

Ответы [ 4 ]

1 голос
/ 16 мая 2009

Одним из простых решений будет использование и внешнего брандмауэра.

0 голосов
/ 18 мая 2009

Netfilters / iptables уже упоминался, так что я не буду вдаваться в это - возможно, это самый простой способ справиться с этим, но опять же, это не часть "вашей программы", а особенность ядра.

Но есть инструмент tcpwrappers, который также используют многие системные демоны - вы знаете эти файлы hosts.allow & hosts.deny в вашей папке / etc - они являются частью tcpwrappers и могут архивировать точный сценарий, который вы описали.

0 голосов
/ 17 мая 2009

Стандартный способ сделать это - все равно принять соединения, а затем, если они приходят с адреса, который вам не нравится, немедленно закройте их, не сообщая.

Если это действительно то, что вы отчаянно хотите сделать, это не является частью способа работы с сокетами BSD.

0 голосов
/ 16 мая 2009

Возможно, вам может потребоваться установить соответствующие фильтры пакетов, или же ваше приложение может установить эти фильтры самостоятельно. См. http://www.netfilter.org/ для получения подробной информации о команде iptables (есть также libnfnetlink, которая предоставляет API для управления фильтрами, но это, очевидно, не предназначено для общего использования приложения).

Рассматривали ли вы использование AF_UNIX сокетов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...