2013-06-13 5 views
0

Я хочу получать запрос на определенный порт только с localhost (как от 127.0.0.1, так и от my_local_ip);Как разрешать TCP-соединения только с локального хоста

Я попробовал следующее:

int localhost = (127 << 24) + 1; // 127.0.0.1  
sock_address.sin_addr.s_addr = htonl(localhost);  

Это позволяет мне подключаться только с 127.0.0.1 но не от фактического локального IP. Я также попытался:

char hostName[128] = ""; 
struct hostent  *pHost  = 0; 
gethostname(hostName, sizeof(hostName)); 
pHost = gethostbyname(hostName); 
memcpy(&sock_address.sin_addr, pHost->h_addr_list[0], pHost->h_length); 

тем, что я не был в состоянии соединиться с 127.0.0.1, я был в состоянии соединиться с локальным IP, но удаленные запросы также ответил

Что я делаю неправильно? Есть ли другой путь?

Спасибо!

+1

Что вы подразумеваете под «фактическим IP» ?! У вашего компьютера может быть много интерфейсов, и каждый интерфейс может иметь много IP-адресов. Фактически, 127.0.0.1 * * - один из адресов одного из ваших интерфейсов. Это так же, как и ваш «фактический IP», как и любой другой ваш адрес. –

+0

Спасибо @Kerrek SB - хорошо, я имею в виду, что я хочу, чтобы иметь возможность принимать запрос на любом интерфейсе на моей машине, но только с моей машины и блокировать удаленные подключения – kande

+0

Ну, перечислите все свои интерфейсы и перечислите каждый адрес каждого интерфейс - тогда проверьте, есть ли среди них нужный адрес. –

ответ

1

Из вашего приложения вы можете установить только те интерфейсы, которые будут связаны с портом. В первом случае вы привязали его к интерфейсу loopback (lo, IP-адрес 127.0.0.1), и это означает, что вы можете подключиться к нему только потому, что только ваш собственный хост достигает этого интерфейса. Если вы привязываете порт к внешнему интерфейсу, например eth0 с IP-адресом 10.1.2.3, внешние хосты могут подключаться к этому порту, если брандмауэр не блокирует запрос на соединение.

Единственный способ сделать то, что вы хотите, - настроить фильтр пакетов (брандмауэр) вашего локального компьютера для отказа/отправки запросов на соединение (SYN-пакеты) на этот конкретный порт, входящий с IP-адресов, которые не распознаются как ваши своя. В этом случае удаленный хост подумает, что ваш TCP-порт закрыт или заблокирован, в зависимости от того, как вы устанавливаете фильтр.

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

+1

Спасибо. я понимаю – kande