diff --git a/application/app.py b/application/app.py new file mode 100644 index 0000000..aa542e6 --- /dev/null +++ b/application/app.py @@ -0,0 +1,23 @@ +from flask import Flask, request + +app = Flask(__name__) + +@app.route('/') +def hello_world(): + return "

Hello, World from ismukhanova_server!

This is Linux A." + +@app.route('/get', methods=['GET']) +def handle_get(): + return "This is a GET request response from Linux A (ismukhanova_server)." + +@app.route('/post', methods=['POST']) +def handle_post(): + return "This is a POST request response from Linux A (ismukhanova_server). Received data: {data}" + +@app.route('/put', methods=['PUT']) +def handle_put(): + data = request.data.decode() if request.data else "No data sent in PUT body" + return "This is a PUT request response from Linux A (ismukhanova_server). Received data: {data}" + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/configs/LinuxA/00-installer-config.yaml b/configs/LinuxA/00-installer-config.yaml new file mode 100644 index 0000000..8215e98 --- /dev/null +++ b/configs/LinuxA/00-installer-config.yaml @@ -0,0 +1,11 @@ +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.13.10/24] + routes: + - to: 192.168.8.0/24 + via: 192.168.13.1 + version: 2 \ No newline at end of file diff --git a/configs/LinuxA/web-server-A.service b/configs/LinuxA/web-server-A.service new file mode 100644 index 0000000..95ca209 --- /dev/null +++ b/configs/LinuxA/web-server-A.service @@ -0,0 +1,13 @@ +[Unit] +Description=My Flask Web Server Ismukhanova +After=network.target + +[Service] +Type=idle +User=ismukhanova_1 +WorkingDirectory=/home/ismukhanova_1/web_app_A +ExecStart=/usr/bin/python3 /home/ismukhanova_1/web_app_A/app.py +Restart=always + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/configs/LinuxB/00-installer-config.yaml b/configs/LinuxB/00-installer-config.yaml new file mode 100644 index 0000000..c0b30d0 --- /dev/null +++ b/configs/LinuxB/00-installer-config.yaml @@ -0,0 +1,11 @@ +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.13.1/24] + enp0s9: + dhcp4: no + addresses: [192.168.8.1/24] + version: 2 \ No newline at end of file diff --git a/configs/LinuxB/linux_b_iptables.rules b/configs/LinuxB/linux_b_iptables.rules new file mode 100644 index 0000000..ba89e1b --- /dev/null +++ b/configs/LinuxB/linux_b_iptables.rules @@ -0,0 +1,10 @@ +# Generated by iptables-save v1.8.10 (nf_tables) on Thu May 22 00:19:48 2025 +*filter +:INPUT ACCEPT [641:59661] +:FORWARD DROP [0:0] +:OUTPUT ACCEPT [598:57089] +-A FORWARD -i enp0s8 -o enp0s9 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A FORWARD -i enp0s9 -o enp0s8 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A FORWARD -i enp0s9 -o enp0s8 -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT +COMMIT +# Completed on Thu May 22 00:19:48 2025 \ No newline at end of file diff --git a/configs/LinuxC/00-installer-config.yaml b/configs/LinuxC/00-installer-config.yaml new file mode 100644 index 0000000..ae7911d --- /dev/null +++ b/configs/LinuxC/00-installer-config.yaml @@ -0,0 +1,11 @@ +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.8.100/24] + routes: + - to: 192.168.13.0/24 + via: 192.168.8.1 + version: 2 \ No newline at end of file diff --git a/report.md b/report.md new file mode 100644 index 0000000..0d5be33 --- /dev/null +++ b/report.md @@ -0,0 +1,131 @@ +# Отчет по лабораторной работе: Администрирование Linux и Сетевое Взаимодействие + +**Выполнила:** Исмуханова Асель +**Группа:** 5142704/40801 + +## Введение + +В данной лабораторной работе была поставлена задача развернуть и сконфигурировать три виртуальные машины Linux (сервер, шлюз, клиент) для обеспечения сетевого взаимодействия между ними согласно заданной схеме. Работа включала настройку IP-адресации, маршрутизации и развертывание простого веб-сервера. + +## Используемое ПО и окружение + +* **Система виртуализации:** Oracle VM VirtualBox 7.1.8 r168469 (Qt6.5.3) +* **Образ гостевой ОС:** Ubuntu Server 20.04.6 LTS +* **Хостовая ОС:** Windows 11 +* **Сетевая конфигурация VirtualBox:** Сетевой мост, Внутренние сети (`servernet`, `clientnet`). + + +## Этап 1: Настройка Linux-A (ismukhanova_server) + +Была создана и настроена виртуальная машина Linux-A в VirtualBox. Данная машина послужила основой и была клонирована для создания Linux-B и Linux-C. + +![Скриншот настроек Linux-A в VirtualBox:](screenshots/linux_a_virtualbox_network.png) + +Был изменен hostname на `ismukhanova_server`. +Был создан пользователь `ismukhanova_1` с правами sudo. + +Сетевые адаптеры в VirtualBox для Linux-A были настроены следующим образом: +- Адаптер 1: Сетевой мост (для доступа с хоста и в интернет). +- Адаптер 2: Внутренняя сеть с именем `servernet`. + + +Конфигурация сети была выполнена с помощью Netplan. Содержимое файла /etc/netplan/00-installer-config.yaml для Linux-A находится в папке configs (00-installer-config.yaml). + +Результат применения конфигурации Netplan: +Вывод ip a на Linux-A: +![Скриншот команды ip a для машины A](screenshots/linux_a_ip_a.png) + +Вывод ip route на Linux-A: +![Скриншот команды ip route для машины A](screenshots/linux_a_ip_route.png) + + +### Настройка SSH-доступа по ключу +На хост-компьютере Windows был сгенерирован SSH-ключ. Открытый ключ был успешно скопирован на Linux-A, что позволило осуществлять подключение по SSH без пароля. + +![Скриншот успешного подключения по SSH без пароля](screenshots/linux_a_ssh_no_password.png) + +### Развертывание HTTP-сервера (Flask) + +На Linux-A были установлены python3-pip и Flask. Был создан скрипт app.py (см. папку application/app.py), реализующий веб-сервер с тремя эндпоинтами. +Для автоматического запуска веб-сервера был создан systemd сервис. Конфигурация сервиса находится в файле configs/LinuxA/web-server-A.service. + + +![Статус запущенного веб-сервера на Linux-A](screenshots/linux_a_webserver_status.png) + +## Этап 2: Настройка Linux-B (ismukhanova_gateway) + +Виртуальная машина Linux-B была создана путем клонирования Linux-A. Был изменен hostname на ismukhanova_gateway и создан пользователь ismukhanova_2 с правами sudo. Ненужный веб-сервис, унаследованный от Linux-A, был остановлен и отключен. + +Сетевые адаптеры в VirtualBox для Linux-B были настроены для выполнения функций шлюза: +Адаптер 1: Сетевой мост. +Адаптер 2: Внутренняя сеть servernet (для связи с Linux-A). +Адаптер 3: Внутренняя сеть clientnet (для связи с Linux-C). + +![Скриншот настроек сетевых адаптеров Linux-B в VirtualBox](screenshots/linux_b_virtualbox_network.png) + +Конфигурация сети была выполнена с помощью Netplan. Содержимое файла /etc/netplan/00-installer-config.yaml для Linux-B находится в папке configs (00-installer-config.yaml). + +Результат применения конфигурации Netplan: +![Вывод ip a на Linux-B](screenshots/linux_b_ip_a.png) + +![Вывод ip route на Linux-B](screenshots/linux_b_ip_route.png) + +### Настройка IP Forwarding + +Для обеспечения возможности пересылки пакетов между сетями на Linux-B был включен IP Forwarding. Изменения были внесены в /etc/sysctl.conf для сохранения настройки после перезагрузки. + +### Настройка iptables + +Для управления трафиком между сетями servernet и clientnet были настроены правила iptables. Политика по умолчанию для цепочки FORWARD была установлена в DROP. Были добавлены правила для разрешения установленных и связанных соединений, а также для разрешения новых TCP-соединений с Linux-C на Linux-A только по порту 5000. Конфигурация правил iptables сохранена в файле configs/LinuxB/linux_b_iptables.rules. + +## Этап 3: Настройка Linux-C (ismukhanova_client) + +Виртуальная машина Linux-C была создана путем клонирования Linux-A. Был изменен hostname на ismukhanova_client и создан пользователь ismukhanova_3 с правами sudo. +Сетевые адаптеры в VirtualBox для Linux-C: +Адаптер 1: Сетевой мост. +Адаптер 2: Внутренняя сеть clientnet (для связи с Linux-B). + + +![Скриншот настроек сетевых адаптеров Linux-C](screenshots/linux_c_virtualbox_network.png) + +Конфигурация сети была выполнена с помощью Netplan, включая явное указание маршрута к сети Linux-A (192.168.13.0/24) через шлюз Linux-B (192.168.8.1). Содержимое файла /etc/netplan/00-installer-config.yaml для Linux-C находится в папке configs (00-installer-config.yaml). + +Результат применения конфигурации Netplan: + +![Вывод ip a на Linux-C](screenshots/linux_c_ip_a.png) +![Вывод ip route на Linux-C](screenshots/linux_c_ip_route.png) + +## Этап 4: Тестирование взаимодействия + +Для отслеживания трафика на Linux-B была запущена команда sudo tcpdump -i any port 5000 -n -vv. + +GET-запрос: +![Результат GET-запрос на Linux-C](screenshots/test_curl_get.png) + +POST-запрос: +![Результат POST-запрос на Linux-C](screenshots/test_curl_post.png) + +PUT-запрос: +![Результат PUT-запрос на Linux-C](screenshots/test_curl_put.png) + + +### Проверка блокировки другого трафика +Попытка ping с Linux-C на Linux-A (192.168.13.10): +![alt text](screenshots/test_ping_blocked.png) + +Пинг не проходит, так как правила iptables на Linux-B разрешают только TCP трафик на порт 5000 в цепочке FORWARD между данными сетями. + +Попытка ssh с Linux-C на Linux-A (192.168.13.10): +![alt text](screenshots/test_ssh_blocked.png) +SSH-соединение не устанавливается, так как порт 22 не разрешен правилами iptables на Linux-B для пересылки. + +### Проверка сохранения настроек после перезагрузки + +Все три виртуальные машины были перезагружены (sudo reboot). После перезагрузки были выполнены следующие проверки: +IP Forwarding на Linux B активен (cat /proc/sys/net/ipv4/ip_forward показал 1). +Правила iptables на Linux B загружены (sudo iptables -L FORWARD -v -n показал настроенные правила). +Веб-сервер на Linux A запущен (systemctl status web-server.service показал active (running)). +Тестовый запрос curl http://192.168.13.10:5000/get с Linux C на Linux A прошел успешно. + +## Заключение +В ходе выполнения лабораторной работы были успешно развернуты и настроены три виртуальные машины Linux. Настроено сетевое взаимодействие согласно схеме: обеспечена связь между клиентом (Linux-C) и сервером (Linux-A) через шлюз (Linux-B). На шлюзе настроена фильтрация трафика с помощью iptables, разрешающая только HTTP-запросы на порт 5000 к серверу. Веб-сервер на Flask был успешно развернут и протестирован. Все выполненные конфигурации сохраняются после перезагрузки системы, что подтверждает их корректное применение. diff --git a/screenshots/linux_a_ip_a.png b/screenshots/linux_a_ip_a.png new file mode 100644 index 0000000..ab7b19a Binary files /dev/null and b/screenshots/linux_a_ip_a.png differ diff --git a/screenshots/linux_a_ip_route.png b/screenshots/linux_a_ip_route.png new file mode 100644 index 0000000..7bc4a4a Binary files /dev/null and b/screenshots/linux_a_ip_route.png differ diff --git a/screenshots/linux_a_netplan_config.png b/screenshots/linux_a_netplan_config.png new file mode 100644 index 0000000..fb46e81 Binary files /dev/null and b/screenshots/linux_a_netplan_config.png differ diff --git a/screenshots/linux_a_ssh_no_password.png b/screenshots/linux_a_ssh_no_password.png new file mode 100644 index 0000000..b1f612a Binary files /dev/null and b/screenshots/linux_a_ssh_no_password.png differ diff --git a/screenshots/linux_a_virtualbox_network.png b/screenshots/linux_a_virtualbox_network.png new file mode 100644 index 0000000..1786243 Binary files /dev/null and b/screenshots/linux_a_virtualbox_network.png differ diff --git a/screenshots/linux_a_webserver_status.png b/screenshots/linux_a_webserver_status.png new file mode 100644 index 0000000..b76df55 Binary files /dev/null and b/screenshots/linux_a_webserver_status.png differ diff --git a/screenshots/linux_b_ip_a.png b/screenshots/linux_b_ip_a.png new file mode 100644 index 0000000..834d1e8 Binary files /dev/null and b/screenshots/linux_b_ip_a.png differ diff --git a/screenshots/linux_b_ip_route.png b/screenshots/linux_b_ip_route.png new file mode 100644 index 0000000..9afd39b Binary files /dev/null and b/screenshots/linux_b_ip_route.png differ diff --git a/screenshots/linux_b_virtualbox_network.png b/screenshots/linux_b_virtualbox_network.png new file mode 100644 index 0000000..2d40cf3 Binary files /dev/null and b/screenshots/linux_b_virtualbox_network.png differ diff --git a/screenshots/linux_c_ip_a.png b/screenshots/linux_c_ip_a.png new file mode 100644 index 0000000..7d328af Binary files /dev/null and b/screenshots/linux_c_ip_a.png differ diff --git a/screenshots/linux_c_ip_route.png b/screenshots/linux_c_ip_route.png new file mode 100644 index 0000000..8dff437 Binary files /dev/null and b/screenshots/linux_c_ip_route.png differ diff --git a/screenshots/linux_c_virtualbox_network.png b/screenshots/linux_c_virtualbox_network.png new file mode 100644 index 0000000..b8dda56 Binary files /dev/null and b/screenshots/linux_c_virtualbox_network.png differ diff --git a/screenshots/test_curl_get.png b/screenshots/test_curl_get.png new file mode 100644 index 0000000..4662ac2 Binary files /dev/null and b/screenshots/test_curl_get.png differ diff --git a/screenshots/test_curl_post.png b/screenshots/test_curl_post.png new file mode 100644 index 0000000..d847ce1 Binary files /dev/null and b/screenshots/test_curl_post.png differ diff --git a/screenshots/test_curl_put.png b/screenshots/test_curl_put.png new file mode 100644 index 0000000..4a29d3a Binary files /dev/null and b/screenshots/test_curl_put.png differ diff --git a/screenshots/test_ping_blocked.png b/screenshots/test_ping_blocked.png new file mode 100644 index 0000000..77da535 Binary files /dev/null and b/screenshots/test_ping_blocked.png differ diff --git a/screenshots/test_ssh_blocked.png b/screenshots/test_ssh_blocked.png new file mode 100644 index 0000000..cdd9dee Binary files /dev/null and b/screenshots/test_ssh_blocked.png differ