Серверный сокет - принимать соединения только с IP-адресов в белом списке - PullRequest
1 голос
/ 14 марта 2012

У меня есть сервер сокетов, который прослушивает и принимает подключения от клиента, который работает следующим образом:

... do some pre-processing (socket, binds, etc)
//listen to client
if (listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
}

printf("server: waiting for connections...\n");

while(1) {  // main accept() loop
    sin_size = sizeof client_addr;
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
    if (new_fd == -1) {
        perror("accept");
        continue;
    }
     //do something .....
    .....
}

Как я могу ограничить сервер, чтобы он принимал соединение только с определенных IP-адресов? Например, я могу создать текстовый файл, содержащий белый список разрешенных IP-адресов, в следующем формате:
202.168.2.5 - 202.168.2.127
92.104.3.1 - 92.104.4.254
// и так далее

Таким образом, я хочу отклонить соединение со всех IP-адресов, не включенных в белый список. Если API библиотеки сокетов не поддерживает это, я согласен с идеей сначала принимать подключения, а затем сразу же закрыть socketfd, если peeraddress не находится в белом списке. Но как это сделать, как я могу проверить, что определенный IP-адрес находится в диапазоне, указанном в моем белом списке? Любые примеры будут оценены.

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Вы хотите позвонить getpeername , чтобы получить адресную информацию от клиента. Затем проверьте, найден ли их IP-адрес в белом списке.Если нет, отключите их.

Чтобы проверить, что их IP-адрес находится в заданном диапазоне, вы хотите преобразовать байты адреса в одно число.Это можно сделать с помощью следующего:

unsigned int n = bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3];

Если нижняя граница диапазона адресов равна A, а верхняя граница - B, а ip-адрес клиента - X, тогда они занесены в белый список if (A <= X && X <= B).

Если каждый диапазон IP-адресов проверяет ложность, то их нет в белом списке, и вам следует их отключить.

2 голосов
/ 14 марта 2012

Не уверен, в чем тут вопрос, точнее в чем проблема.Адрес клиента будет в their_addr, поэтому просто поищите его в белом списке.Если не найдено, закройте.Возможно, вы захотите либо конвертировать their_addr в тот же формат, что и записи в белом списке, либо, возможно, наоборот.

1 голос
/ 14 марта 2012

Только в Windows, вы можете использовать WSAAccept() вместо accept().WSAAccept() имеет параметр, которому вы можете передать функцию обратного вызова.Перед тем, как новое соединение будет принято, обратный вызов вызывается с адресами и значениями QOS для этого соединения.Обратный вызов может затем вернуть CF_ACCEPT, CF_DEFER или CF_REJECT при необходимости.

...