Разрешить входящие подключения только с указанного IP-адреса

#c #c #linux #sockets

#c #c #linux #сокеты

Вопрос:

У меня есть серверное приложение с прослушивающим сокетом, открытым на определенном IP-порту. Как я могу разрешить сокету разрешать входящие подключения только с одного указанного IP-адреса?

Ответ №1:

Вам придется либо использовать какое-либо программное обеспечение брандмауэра, чтобы ограничить входящие запросы к этому порту, либо отключить принятые подключения, которые вы не хотите обслуживать (на основе адреса сокета, возвращаемого accept ).).

Возможно, существуют библиотеки, которые делают это за вас, но в socket API нет ничего, что могло бы сделать это автоматически.

Ответ №2:

Когда вы принимаете соединение, вы можете проверить sockaddr после принятия, чтобы увидеть, пришло ли оно с правильного адреса. В противном случае вы немедленно закрываете сокет подключения, возвращенный accept.

Комментарии:

1. Я имею в виду принятие соединения только с однорангового узла с указанным ip-адресом!

2. @andrey: Я знаю, я неправильно истолковал ваш вопрос. Я уже изменил ответ.

3. @hackworks: Верно, но в любом случае суть спорна. Я отвечал не на тот вопрос.

4. В Win32 API есть хороший способ зарегистрировать функцию в accept. В зависимости от того, что возвращает функция, прием завершается успешно или завершается неудачей. Смотрите ссылку: msdn.microsoft.com/en-us/library/ms741513 (v = против 85).aspx

Ответ №3:

Вы должны принять соединение с помощью accept(), затем закрыть его, если оно вам не нужно (возможно, отправив ответ с ошибкой, если ваш протокол поддерживает это). Этого достаточно для большинства приложений.

Ответ №4:

Попробуйте: libauth, это надежный способ контроля доступаhttp://linux.die.net/man/3/libauth