Мне нужно написать небольшое прокси-приложение для сервера сокетов, которое принимает подключения от локальных приложений на ВСЕХ интерфейсах (сокет должен быть привязан к 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 сокетов, если это то, что нужно.