2013-06-04 5 views
0

Я занимаюсь программированием сокетов в Linux. Был вопрос. Как мы можем разрешить конкретные IP-адреса для подключения к нашему серверу .Сокеты в Linux - serv_addr.sin_addr.s_addr = INADDR_ANY;

Например:

  • Разрешить 10.0.0.1
  • Запретить 10.0.0.1

Я специально говорю об этой строке коды, где мы заполняем INADDR_ANY наших sockaddr_in структуры

serv_addr.sin_addr.s_addr = INADDR_ANY; 

Остальной Кодекса только для справки:

struct sockaddr_in serv_addr; 


serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = INADDR_ANY; // Here's my question!! 
serv_addr.sin_port = htons(portno); 
+1

Я немного ржавый, но не 'serv_addr' серверный сокет? Как, например, это сокет TCP, который вы используете для прослушивания? В строке, на которую вы ссылаетесь, это просто настройка IP-адреса интерфейса для прослушивания, а не подключение. – austin

+0

@austin Фактически «serv_addr» - это структура, которая содержит информацию о сервере. Разрешено использование портов, IP-адресов, TCP/IP v4/v6 и т. Д. И да, это позволяет принимать все соединения. Я хочу ограничить это конкретными IP-адресами. Btw, прослушивание и принятие выполняется после этого шага. – Safeer

+0

Остин абсолютно прав: если serv_addr используется для привязки прослушивающего сокета, вы не можете разместить там IP-адрес партнера. –

ответ

1

Это называется брандмауэром. В linux вы настраиваете его с помощью iptables(8).

Если вы хотите сделать это в своем приложении, невозможно выборочно прослушивать его на основе адреса партнера (вы можете слушать только выборочно, исходя из вашего адреса, и если вы используете Linux со «слабой конечной системой» модель ", вы должны проверить, понимаете ли вы, что это значит! --- прослушивание определенного адреса, вероятно, не совсем делает то, что вы ожидаете, и не является безопасным способом отбрасывать пакеты из ненадежных интерфейсов.).

Вместо этого прослушайте INADDR_ANY, затем позвоните getpeername(2) на принятом fd, подтвердите его и закройте соединение, если оно не соответствует фильтру вашего приложения.

+0

Это то, чего я никогда не пробовал. Выглядит хорошо и легко. Но все же для целей знаний, как фактически выбраны IP-адреса, разрешенные в моем подходе к коду. – Safeer

+0

Извините, я не совсем понимаю, о чем вы спрашиваете. Если вы хотите связать сокет только для приема соединений с определенных IP-адресов, вы не сможете. Это невозможно с помощью API сокетов. Вы должны слушать все соединения, а затем закрывать те, которые вы не хотите, как я описал в последнем абзаце. Подход вашего кода звучит так, как будто он не работает. –

+0

Хорошо. Понял. Благодаря! – Safeer

Смежные вопросы