Номер телефона

Последнее обновление:

Разработка простого ТСР-сервера под Linux

В этой статье мы приведем небольшой сервер на языке С. При его помощи можно продемонстрировать взаимодействие между хостовой и гостевой ОС. Можно, конечно, взять что-то готовое, но его придется устанавливать и описывать дополнительно. Да и работу готового сервера, что называется, не пощупаешь руками. Поэтому проще набросать простенький сервер самостоятельно, на основе технологии сокетов, к примеру. Вот его исходный код на языке С:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include <sys/stat.h>

  1. char message[] = "Hello from Linux! ";
  2. char tmp[8];
  3. unsigned int sizeAddr;
  4. int main()
  5. {
  6. int sock, listSOCKET;
  7. struct sockaddr_in addr;
  8. char buffer[1024];
  9. int amount;
  10. listSOCKET = socket(AF_INET, SOCK_STREAM, 0);
  11.  if(listSOCKET < 0)
  12.    {
  13.     perror("socket cannot use. Exit.");
  14.     exit(1);
  15.    }

  1. addr.sin_family = AF_INET;
  2. addr.sin_port = htons(3001);
  3. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  4. if(bind(listSOCKET, (struct sockaddr *)&addr, sizeof(addr)) < 0)
  5.   {

  1.    perror("bind is wrong. Exit.");
  2.    exit(2);
  3.   }
  4. listen(listSOCKET, 1);
  5. int i =0;
  6. while(1)
  7. {i++;
  8.   sizeAddr=sizeof(addr);
  9.   sock = accept(listSOCKET, (struct sockaddr *)&addr, &sizeAddr );
  10.   printf ("\n");
  11.   if(sock < 0) {
  12.   perror("accept is wrong. Exit.");
  13.   exit(3);
  14. }
  15. amount = recv(sock, buffer, 1024, 0);

  1. strncat(buffer, message, sizeof(message));
  2. sprintf (tmp, "%d", i);
  3. strncat(buffer, tmp, strlen(tmp) * sizeof(char));
  4. printf("buffer= %s \n", buffer);
  5. send(sock, buffer, amount+sizeof(message) + strlen(tmp) * sizeof(char)-1, 0);
  6. if(amount <= 0) break;

  1. memset (buffer, 0, sizeof(buffer));

  1. close(sock);
  2. }
  3. return 0;
  4. }

Эта программа принимает сетевой запрос, выводит его содержимое в консоль (в на основнм хосте или в виртуальной машине - в зависимости от того, где он запущен), затем добавляет к нему фразу «Hello from Linux!» и счетчик обновлений страницы и затем, окончательно, отсылает все это обратно источнику запроса, т.е. клиенту. При каждом очередном обновлении страницы счетчик увеличивается на 1. Обсуждать программу не будем, ибо, видится, что все и так понятно. Отметим, что ее можно использовать для демонстрации взаимодействия между основным хостом и виртуальной машиной после проброса портов.

Как сделать запрос от клиента, запущенного на хосте?

В качестве клиента подойдет любая программа, способная отправлять запросы и получать на них ответы. Например, любой браузер. В его адресной строке необходимо ввести URL запроса.

Допустим, IP-адрес виртуальной машины есть 192.168.56.1. Также предположим, что в гостевой операционной системе есть свободный порт под номером 3000. Так вот, именно на этот адрес (и на порт 3000) и следует направить запрос. Т.е. в адресной строке браузера должно быть:

http://192.168.56.1:3000

Т.е. все как обычно:

  • протокол,
  • двоеточие,
  • два слеша,
  • доменное имя или IP-адрес,
  • двоеточие,
  • порт (номер порта).

Выполнив запрос браузера, обнаружим в окне страницы заголовки протокола HTTP, отправленные браузером, фразу «Hello from Linux!» и номер счетчика, который будет увеличиваться на 1 при каждом последующем обращении к странице (в результате ее обновления). Запрос направляется на порт под номером 3000 в ОС хоста, но затем на него действует правило проброса, перенаправляя его в ОС виртуальной машины (гостевую) на порт номер 3001.

Как видно, проброс портов в условиях действия политики NAT решил проблему взаимодействия между хостом и виртуальной машиной.

Для чего это может быть использовано?

Приведем парочку наиболее популярных примеров.

1. Например, в гостевой ОС можно запустить прокси-сервер, который, в свою очередь, будет соединяться с интернетом. И из хоста можно будет перенаправлять запросы, идущие на некоторые (или даже на все) IP-адреса. При этом запросы браузера в хостовой системе на открытие страницы того или иного (или всех) сайта будут перенаправлены в виртуальную машину и попадут на прокси-сервер. Ну, а он уже будет связываться с интернетом, получать контент страниц, как-то изменять его, при необходимости и возвращать его браузеру в хост. Причем, браузер даже и знать не будет, что его запросы перенаправляются на прокси-сервер.

При этом, если вдруг на вебсервере, т.е. на сайте, расположенном в интернете, попадется нечто нехорошее (так называемый вирус), практически все проблемы примет на себя ОС в виртуальной машине, в частности, запущенный в ней прокси-сервер. Что приведет, максимум, к краху этого прокси-сервера и, быть может, к краху ОС в виртуальной машине. Но, не более того.

Проблемы у хоста могут возникнуть, разве что, если прокси-сервер вернет ему полученный из интернета корректный, с точки зрения транспортного уровня (ТСР), но вредоносный трафик уровня НТТР/HTTPS. Который способен сделать проблему, разве что, для браузера. Что вылечится его перезапуском.

2. Для реализации удаленных функций. По аналогии, скажем, с механизмом RPC. Это когда Ваше приложение (работающее в основной ОС, т.е. на хосте) направляет системные запросы к функциям, библиотекам, расположенных где-то в другом месте – в данном случае, в виртуальной машине, в гостевой ОС. Хотя, вполне можно использовать здесь и непосредственно саму технологию RPC.

Удобство здесь проявляется в том, что эти библиотеки можно отключить, точнее, сделать полностью недоступными лишь одним движением – достаточно отключить виртуальную машину, либо сервер, управляющий взаимодействием с этими библиотеками. Подключение тоже, соответственно, весьма простое. При  этом важно, что только Ваш хост будет иметь возможность доступа к ним – так как IP-адрес гостевой ОС, в которой они будут работать, является частным (приватным), имея маску 192.168.0.0. А это означает, что политика NAT хоста запретит к ним доступ извне.

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

И последнее про проброс портов на TCP-сервер

Настроив правило проброса портов БЕЗ УКАЗАНИЯ IP-адресов, для которых действует такое правило (а, следовательно, оно будет действовать для ВСЕХ IP-адресов), надо быть точно уверенным, что ни порт 3000 на хосте, ни порт 3001 в гостевой ОС не используется никакими другими программами. Иначе так можно помешать их работе. Поэтому, для целей безопасности, в правилах проброса портов лучше бы использовать, наряду с номерами портов, и конкретные IP-адреса, для которых только и будет работать правило проброса.


Комментарии:
Научный Консалтинг11.03.2020 14:42
Дополнение. Также данный способ может быть использован для взаимодействия программ, работающих в разных операционных системах. Например, программа на основном хосте может работать в Windows, а сервер в виртуальной машине - Linux. При этом сервер, осуществляя взаимодействия с Linux, может выполнить те или иные действия и вернуть на хост результат. Точно также windows-программа, запущенная на хосте, может передать те или иные данные линуксовской программе. Это возможно, так как данные могут представлять собой текст, а он - одинаковый, вне зависимости от конкретной системы. Но, при этом, конечно, потребуется доработать данную программу-сервер. Также вполне можно написать аналогичную программу под Android/MacOS/... и взаимодействовать с этими ОС. Что открывает удобную и легкую возможность кроссплатформенного взаимодействия. Без использования java или т.п.
Олег19.03.2020 13:03
А этот сервер будет работать с SOCK?
Алексей19.03.2020 18:49РедактироватьУдалить
Олег, статья вообще не об этом.
Всего комментариев: 3
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-