отключить telnet на http порт? - PullRequest
1 голос
/ 10 марта 2011

Я мог бы задавать неправильные вопросы сейчас, но терпите меня.

У меня есть система Linux с демоном и веб-интерфейсом к нему. Демон принимает запрос сокета на определенный порт и принимает команды. Обычно такие команды выдаются веб-интерфейсом, который имеет безопасную процедуру входа в систему. Однако, так как HTTP позволяет кому-либо подключаться к этому порту через telnet и выполнять необработанные команды, мне нужен способ защиты системы от злоупотреблений.

На самом деле я не думаю, что есть способ настроить apache, чтобы запретить telnet, потому что тогда все это, вероятно, больше не будет работать.

Так есть ли способ разрешить только сокет, созданный из локального хоста?

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

Спасибо

Ответы [ 4 ]

5 голосов
/ 10 марта 2011

Используйте iptables, чтобы ограничить доступ к порту 80 только для соединений с локального хоста

iptables -I INPUT -j ACCEPT -p tcp --destination-port 80 -i lo
iptables -A INPUT -j DROP -p tcp --destination-port 80 -i eth0
3 голосов
/ 10 марта 2011

Пусть ваш демон bind () только для локального хоста (127.0.0.1), а ваш веб-сервер совершает вызовы 127.0.0.1. Таким образом, никто за пределами коробки не может напрямую подключиться к нему.

struct inaddr_in listen_addr = {0};

listen_addr.sin_family = AF_INET;
listen_addr.sin_port = htons(my_port);
listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

В качестве альтернативы добавьте правило брандмауэра / iptables, которое блокирует порт вашего демона от чего-либо, кроме localhost.

2 голосов
/ 10 марта 2011

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

struct sockaddr_in sin;
socklen_t slen = sizeof(sin);
bzero(&sin, sizeof(sin));
if (getpeername(sock, (struct sockaddr *) &sin, &slen) != 0) {
  /* getpeername failed */
  close(sock);
  return;
}
char * c = inet_ntoa(sin.sin_addr);
/* Now loop through your list of permitted addresses and compare to c */

Отказ от ответственности: Код не скомпилирован или не протестирован, но должен дать вам представление о том, как его реализовать.

1 голос
/ 10 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...