diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b6e4761..0000000 --- a/.gitignore +++ /dev/null @@ -1,129 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ diff --git a/Linux Practice.png b/Linux Practice.png deleted file mode 100644 index 212b38a..0000000 Binary files a/Linux Practice.png and /dev/null differ diff --git a/README.md b/README.md deleted file mode 100644 index 0d4d13f..0000000 --- a/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Введение -Данная практика посвещена базовым принципам администрирования Linux. Для выполнения практики необходимо развернуть 3 виртуальные машины Linux. - -Как пример, можно использовать Virtual Box + Ubuntu Server 20.04. - -# Задание -Для выполнения данного задания необходимо: -1. Развернуть три виртуальные машины Linux, согласно схеме ниже - - -![info](Linux%20Practice.png) - -2. Linux A - 1. Сконфигурировать Hostname следующим образом: _server (пропустить если делаете через Play with docker) - 2. Создать пользователя _1 (пропустить если делаете через Play with docker) - 3. Сконфигурировать виртуальный интерфейс со следующим ip адресом: 192.168.<день рождения>.10/24 - 4. Развернуть Http сервер на виртуальной машине на порту 5000. Необходимо реализовать минимум три эндпоинта (запрос /get, /post, /put) -3. Linux B - 1. Сконфигурировать Hostname следующим образом: _gateway (пропустить если делаете через Play with docker) - 2. Создать пользователя _2 (пропустить если делаете через Play with docker) - 3. Сконфигурировать 2 виртуальных интерфейс со следующими ip адресом: 192.168.<день рождения>.1/24, 192.168.<месяц рождения>.10/24 - 4. С помощью утилит ip route и iptables настроить маршрут пакетов от Linux A до C. Должны быть запрещены все пакеты, кроме http пакетов через порт 5000 (маршруты обязательно, файрвол опционально) - 5. Запустить программу tcpdump с фильтрацией по портам 5000 -4. Linux C - 1. Сконфигурировать Hostname следующим образом: _client (пропустить если делаете через Play with docker) - 2. Создать пользователя _3 (пропустить если делаете через Play with docker) - 3. Сконфигурировать виртуальный интерфейс со следующим ip адресом: 192.168.<месяц рождения>.100/24 - 4. С помощью команды curl на машине C послать 3 запроса на машину А в http сервер (/get, /post, /put) -5. При перезагрузки системы все сервисы и сетевая архитектура должны также функционировать (сохранить свои настройки) -6. Сделать скриншоты всех этапов задания -7. Оформить отчет в виде Markdown файла. Приложить конфигурационные файлы в репозиторий -8. Для play with docker также нужно написать bash скрипты для воспроизведения на новых вм - - -Репозиторий оформить следующим образом: -- application - исходный код http сервера -- configs - конфигурационные файлы сетевых настроек виртуальных машин -- report.md - Отчет markdown - - -P.S. -Если не получилось использовать разные утилиты для настройки сети, используйте netplan -Смотрите [мануал](./guide/Manual.md) - там информация для virtual box и Play with docker diff --git a/application/app.py b/application/app.py new file mode 100644 index 0000000..78e3dee --- /dev/null +++ b/application/app.py @@ -0,0 +1,29 @@ +from flask import Flask, request, jsonify + +app = Flask(__name__) + +@app.route('/get', methods=['GET']) +def get_handler(): + return jsonify({ + 'method': 'GET', + 'message': 'GET request received' + }) + +@app.route('/post', methods=['POST']) +def post_handler(): + return jsonify({ + 'method': 'POST', + 'message': 'POST request received', + 'data': request.get_json(silent=True) + }) + +@app.route('/put', methods=['PUT']) +def put_handler(): + return jsonify({ + 'method': 'PUT', + 'message': 'PUT request received', + 'data': request.get_json(silent=True) + }) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/configs/linux-a-netplan.yaml b/configs/linux-a-netplan.yaml new file mode 100644 index 0000000..19c574f --- /dev/null +++ b/configs/linux-a-netplan.yaml @@ -0,0 +1,9 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.11.10/24 diff --git a/configs/linux-b-netplan.yaml b/configs/linux-b-netplan.yaml new file mode 100644 index 0000000..928506b --- /dev/null +++ b/configs/linux-b-netplan.yaml @@ -0,0 +1,13 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.11.1/24 + enp0s9: + dhcp4: false + addresses: + - 192.168.5.1/24 diff --git a/configs/linux-c-netplan.yaml b/configs/linux-c-netplan.yaml new file mode 100644 index 0000000..d17a1a1 --- /dev/null +++ b/configs/linux-c-netplan.yaml @@ -0,0 +1,12 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.5.100/24 + routes: + - to: default + via: 192.168.5.1 diff --git a/configs/rules.v4 b/configs/rules.v4 new file mode 100644 index 0000000..f500125 --- /dev/null +++ b/configs/rules.v4 @@ -0,0 +1,7 @@ +*filter +:INPUT ACCEPT [0:0] +:FORWARD DROP [0:0] +:OUTPUT ACCEPT [0:0] +-A FORWARD -i enp0s9 -o enp0s8 -p tcp --dport 5000 -j ACCEPT +-A FORWARD -i enp0s8 -o enp0s9 -p tcp --sport 5000 -j ACCEPT +COMMIT diff --git a/configs/sysctl-b.conf b/configs/sysctl-b.conf new file mode 100644 index 0000000..119d730 --- /dev/null +++ b/configs/sysctl-b.conf @@ -0,0 +1 @@ +net.ipv4.ip_forward=1 diff --git a/configs/web-server.service b/configs/web-server.service new file mode 100644 index 0000000..a82d878 --- /dev/null +++ b/configs/web-server.service @@ -0,0 +1,12 @@ +[Unit] +Description=Flask Web Server +After=network.target + +[Service] +User=borodin_1 +WorkingDirectory=/home/borodin_1/application +ExecStart=/usr/bin/python3 /home/borodin_1/application/app.py +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/guide/Manual.md b/guide/Manual.md deleted file mode 100644 index d4cabdf..0000000 --- a/guide/Manual.md +++ /dev/null @@ -1,230 +0,0 @@ -# Практика Linux (с virtualbox) - -## Создание виртуальной машины -1. Скачиваем [Virtual Box](https://www.virtualbox.org/) -2. Скачиваем дистрибутив [Ubuntu Server 20.04.iso](https://ubuntu.com/download/server) -3. Создаем виртуальную машину в virtualbox. Создаем новый виртуальный диск, назначаем 1gb Ram, 10gb Rom. При запуске указываем путь до iso файла -4. Следуем инструкциям при конфигурировании ОС. Создаем юзера и название машины согласно инструкции. Сетевые настройки оставляем по умолчанию. -5. Клонируем 2 раза созданную виртуальную машину (vdi диск). Переименовываем пользователя и хоста в каждой машине согласно инструкции. -## Настройка виртуальных машин -### Linux A -1. В настройках виртуальной машины заходим в сетевые интерфейсы: - 1. Nat меняем на сетевой мост - 2. Добавляем Внутреннюю сеть (называем servernet) -2. Подключаемся к виртуальной машине. Вводим команду -```shell -ip addr -``` -Убеждаемся, что один из интерфейсов подключен к той же подсети, что и хост. Запоминаем ip адрес - -3. С помощью команды ping с хоста (ноутбука) пробуем пинговать виртуальную машину: -```shell -ping 192.168.0.109 -n 4 -``` -Если пинг идет успешно, значит виртуальная машина подключена к подсети с вашим ноутбуком. - -4. Для удобства стоит прописать ssh ключ к виртуальной машине. - -[Сгенерировать ключ](https://losst.ru/avtorizatsiya-po-klyuchu-ssh) можно командой (из терминала Linux или MobaExtern) -```shell -ssh-keygen -t rsa -N "" -f my.key -``` -По-умолчанию можно со всем согласиться. - -Далее необходимо скопировать ключ на виртуальную машину -```shell -ssh-copy-id -i my.key.pub alekseev_1@192.168.0.109 -``` - -Ввести пароль при запросе. - -Далее можно подключаться к виртуальной машине по ssh: -```shell -ssh -i my.key alekseev_1@192.168.0.109 -``` - -5. Необходимо настроить сеть. В ubuntu 20.04 по-умолчанию сеть настраивается утилитой netplan. Откроем конфигурационный файл и настроим наши адаптары следующим образом: -```shell -sudo nano /etc/netplan/00-installer-config.yaml -``` - -Добавим в конфигурационный файл следующее содержимое (ip адреса использовать согласно заданию): - -```yaml -network: - ethernets: - enp0s3: # этот интерфейс используем для доступа с ноутбука - dhcp4: true - enp0s8: # этот интерфейс настравиваем на передачу запросов - dhcp4: no - addresses: [192.168.<день рождения>.10/24] - gateway4: 192.168.<день рождения>.1 - version: 2 -``` - -Далее сохраняем файл. Применяем настройки -```shell -sudo netplan apply -``` -6. Проверяем настройки с помощью ip addr. Сетевая настройка завершена - -### Linux B -1. В настройках виртуальной машины заходим в сетевые интерфейсы: - 1. Nat меняем на сетевой мост - 2. Добавляем Внутреннюю сеть 2 штуки (называем servernet и clientnet) -2. Подключаемся к виртуальной машине. Меняем имя хоста и юзера согласно заданию. -3. Для удобства также стоит прописать ssh ключ к виртуальной машине (Например командами добавить нового пользователя adduser (не забыть добавить в группу sudo), сменить название хоста hostname newname). -4. Необходимо настроить сеть. В ubuntu 20.04 по-умолчанию сеть настраивается утилитой netplan. Откроем конфигурационный файл и настроим наши адаптары следующим образом: -```shell -sudo nano /etc/netplan/00-installer-config.yaml -``` -Добавим в конфигурационный файл следующее содержимое (ip адреса использовать согласно заданию): - -```yaml -network: - ethernets: - enp0s3: # этот интерфейс используем для доступа с ноутбука - dhcp4: true - enp0s8: # этот интерфейс настравиваем на передачу запросов сервера (Помните про виртуальную сеть в VirtualBox) - dhcp4: no - addresses: [192.168.<день рождения>.1/24] - enp0s9: # этот интерфейс настравиваем на передачу запросов клиента - dhcp4: no - addresses: [192.168.<месяц рождения>.1/24] - version: 2 -``` - -Далее сохраняем файл. Применяем настройки -```shell -sudo netplan apply -``` -6. Проверяем настройки с помощью ip addr. Сетевая настройка завершена - -### Linux C -1. В настройках виртуальной машины заходим в сетевые интерфейсы: - 1. Nat меняем на сетевой мост - 2. Добавляем Внутреннюю сеть 2 штуки (называем servernet и clientnet) -2. Подключаемся к виртуальной машине. Меняем имя хоста и юзера согласно заданию. -3. Для удобства также стоит прописать ssh ключ к виртуальной машине (Например командами добавить нового пользователя adduser (не забыть добавить в группу sudo), сменить название хоста hostname newname). -4. Необходимо настроить сеть. В ubuntu 20.04 по-умолчанию сеть настраивается утилитой netplan. Откроем конфигурационный файл и настроим наши адаптары следующим образом: -```shell -sudo nano /etc/netplan/00-installer-config.yaml -``` -Добавим в конфигурационный файл следующее содержимое (ip адреса использовать согласно заданию): - -```yaml -network: - ethernets: - enp0s3: # этот интерфейс используем для доступа с ноутбука - dhcp4: true - enp0s8: # этот интерфейс настравиваем на передачу запросов - dhcp4: no - addresses: [192.168.<месяц рождения>.10/24] - gateway4: 192.168.<месяц рождения>.1 - version: 2 -``` - -Далее сохраняем файл. Применяем настройки -```shell -sudo netplan apply -``` -6. Проверяем настройки с помощью ip addr. Сетевая настройка завершена - -### Конфигурация маршрутов - -1. Наиболее простой способ с текущей конфигурацией, это разрешить переброс пакетов ip в нашем gateway -```shell -echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward 1 - - nano /etc/sysctl.conf # Также можно добавить 1 в файл для автозагрузки -``` -Таким образом виртуальные машины А и С будут видеть друг друга в сети -2. Чтобы разрешить переброс только конкретных пакетов по конкретному порту, следуюет настроить маршрут [следующим образом](https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables): -```shell -iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 5000 -m conntrack --ctstate NEW -j ACCEPT - -iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - -iptables -P FORWARD DROP - -``` -Также необходимо сохранить правила iptables -```shell -sudo apt-get install iptables-persistent -sudo iptables-save > /etc/iptables/rules.v4 -sudo ip6tables-save > /etc/iptables/rules.v6 -``` -3. Посмотреть трафик можно [с помощью](https://unix.stackexchange.com/questions/313180/iptables-forward-chain-traffic-not-seen-by-tcpdump) - -### Веб-сервер (Машина А) -1. Для установки веб-сервера на машине А рекомендуется использовать python flask -2. Python установлен по-умолчанию. Для установки flask необходимо ввести: -```shell -pip install flask -``` -3. Создайте файл app.py и поместите следующее содержимое: -```python -from flask import Flask - -app = Flask(__name__) - -@app.route("/") -def hello_world(): - return "

Hello, World!

" - -app.run(host='0.0.0.0', port=5000) -``` -4. Запустить скрипт можно командой -```shell -python app.py -``` -5. С помощью systemd необходимо создать сервис, который запускает скрипт через автозагрузку -```shell -nano /lib/systemd/system/web-server.service -``` -Вставить следующее содержимое в файл: -```ini -[Unit] -Description=Web-Server -[Service] -Type=idle -WorkingDirectory=/home/user/server/ -ExecStart=python app.py -[Install] -WantedBy=multi-user.target -``` -Перезапустить службы и активировать автозагрузку -```shell -systemctl daemon-reload -systemctl enable web-server -``` -### Веб-клиент (Машина С) -1. Чтобы послать запрос на машину А, необходимо ввести следующую команду: -```shell -curl 'http://192.168.<день рождения>.10:5000/ -``` -2. Если поменять на сервере порт отличный от 5000 и попробовать отправить запрос, шлюз не должен пропустить пакеты - -# Практика Linux (с play with docker) -тоже самое, что "Практика Linux (с virtualbox)", но -1. вместо создание ВМ на virtualbox создаем три ВМ на https://labs.play-with-docker.com/ -2. чтобы по ssh зайти на каждую машину, нужно сгенерировать ключ протоколом ed25519 -```bash -ssh-keygen -t ed25519 -ssh @direct.labs.play-with-docker.com -``` -3. в pwd используется дистрибутив alpine, поэтому часть функционала (systemd, netplan) отсутсвует -4. настройку сети необходимо сделать с помощью ipvlan. Серевер А и С - по одному адаптеру согласно схеме. Сервер В - два адаптера согласно схеме, подсети должны быть разные -```shell -ip link add macvlan1 link eth0 type macvlan mode bridge # создаем новый адаптер с типом bridge и делаем связь адаптера с eth0 -ip address add dev macvlan1 xxx.xxx.xxx.xxx/ # добавляем ip адрес адаптеру -ip link set macvlan1 up # включаем адаптер -``` -5. прописать маршруты у клиента А и С к их подсетям через шлюз машину В -```shell -ip route add / via -``` -6. Также развернуть веб сервер на машине С и помощью curl получить ответ от веб сервера -7. настроить файрвол можно пожеланию (задание опциональное) -8. написать bash скрипт для каждой виртуальной машине, который повторяет действия сделанные вручную (в качестве проверке создайте заново 3 виртуалки, результат скрипта - сurl клиента принимает ответ от сервера из разных подсетей) \ No newline at end of file diff --git a/images/2vir.jpg b/images/2vir.jpg new file mode 100644 index 0000000..0bd0af0 Binary files /dev/null and b/images/2vir.jpg differ diff --git a/images/borodin_1.jpg b/images/borodin_1.jpg new file mode 100644 index 0000000..79c8931 Binary files /dev/null and b/images/borodin_1.jpg differ diff --git a/images/curl.jpg b/images/curl.jpg new file mode 100644 index 0000000..73dd8f2 Binary files /dev/null and b/images/curl.jpg differ diff --git a/images/firewall.jpg b/images/firewall.jpg new file mode 100644 index 0000000..3d4a917 Binary files /dev/null and b/images/firewall.jpg differ diff --git a/images/getpostput.jpg b/images/getpostput.jpg new file mode 100644 index 0000000..a72f5af Binary files /dev/null and b/images/getpostput.jpg differ diff --git a/images/hostname.jpg b/images/hostname.jpg new file mode 100644 index 0000000..f1c7d45 Binary files /dev/null and b/images/hostname.jpg differ diff --git a/images/ip_birth_date.jpg b/images/ip_birth_date.jpg new file mode 100644 index 0000000..d1d0be8 Binary files /dev/null and b/images/ip_birth_date.jpg differ diff --git a/images/server2.jpg b/images/server2.jpg new file mode 100644 index 0000000..36f7e6b Binary files /dev/null and b/images/server2.jpg differ diff --git "a/images/\321\213\321\203\320\272\320\274\321\203\320\272.jpg" "b/images/\321\213\321\203\320\272\320\274\321\203\320\272.jpg" new file mode 100644 index 0000000..150eae9 Binary files /dev/null and "b/images/\321\213\321\203\320\272\320\274\321\203\320\272.jpg" differ diff --git a/report.md b/report.md new file mode 100644 index 0000000..6b79a4f --- /dev/null +++ b/report.md @@ -0,0 +1,167 @@ +# Отчет по первой лабораторной работе Linux (Бородин Михаил 11.05 группа 5142704/50801) + +## Цель работы + +Настроить сетевую архитектуру из трех виртуальных машин Linux: +- Linux A- HTTP-сервер +- Linux B - шлюз (gateway/router) +- Linux C - клиент + +Необходимо обеспечить маршрутизацию трафика между Linux C и Linux A через Linux B, развернуть HTTP-сервер на порту 5000 и подтвердить прохождение трафика через gateway с помощью `tcpdump`. + +## Схема сети + +`Linux A <-> Linux B <-> Linux C` + +### Подсеть между Linux A и Linux B +- Linux A: `192.168.11.10/24` +- Linux B: `192.168.11.1/24` + +### Подсеть между Linux B и Linux C +- Linux B: `192.168.5.1/24` +- Linux C: `192.168.5.100/24` + +## Параметры виртуальных машин + +![Переименованы hostname](images/hostname.jpg) + +### Linux A +- Hostname: `borodin_server` +- Пользователь: `borodin_1` +![Создан пользователь borodin_1](images/borodin_1.jpg) +- IP-адрес: `192.168.11.10/24` +![Виртуальный интерфейс с ip с датой рождения](images/ip_birth_date.jpg) +- HTTP-сервер flask на порту `5000` + +![HTTP-сервер](images/server.jpg) + +![Проверка работы HTTP-сервера](images/server2.jpg) + +### Linux B +- Hostname: `borodin_gateway` +- Пользователь: `borodin_2` +- IP-адрес 1: `192.168.11.1/24` +- IP-адрес 2: `192.168.5.1/24` +- Включена маршрутизация IPv4, настроен firewall для пропуска HTTP-трафика по TCP-порту `5000` + +![2 виртуальных интерфейса](images/2vir.jpg) + +![Строгий firewall](images/firewall.jpg) + +### Linux C +- Hostname: `borodin_client` +- Пользователь: `borodin_3` +- IP-адрес: `192.168.5.100/24` +- Шлюз по умолчанию: `192.168.5.1` + +![Запросы на машину А с машины С](images/curl.jpg) + +## Настройка Linux A + +На Linux A был изменен hostname на `borodin_server`, создан пользователь `borodin_1`, настроен статический IP-адрес `192.168.11.10/24` на внутреннем интерфейсе. + +На машине был развернут HTTP-сервер на flask, работающий на порту `5000`. + Реализация трёх эндпоинтов: +- `/get` +- `/post` +- `/put` + +![Проверка get, post, put](images/getpostput.jpg) + +Для автоматического запуска приложения после перезагрузки был создан systemd-сервис `web-server.service`. + +## Настройка Linux B + +На Linux B был изменен hostname на `borodin_gateway`, создан пользователь `borodin_2`, сконфигурированы два интерфейса: +- `192.168.11.1/24` +- `192.168.5.1/24` + +Для пересылки пакетов между подсетями была включена маршрутизация IPv4: + +```bash +net.ipv4.ip_forward=1 +``` + +С помощью `iptables` была настроена фильтрация трафика. Разрешена пересылка только HTTP-пакетов по TCP-порту `5000` между интерфейсами `enp0s9` и `enp0s8`. Политика цепочки `FORWARD` установлена в `DROP`. + +Для анализа прохождения HTTP-трафика использовалась утилита `tcpdump` с фильтром: + +```bash +sudo tcpdump -i any port 5000 +``` + +## Настройка Linux C + +На Linux C был изменен hostname на `borodin_client`, создан пользователь `borodin_3`, настроен IP-адрес `192.168.5.100/24` и шлюз по умолчанию `192.168.5.1`. + +После этого с Linux C выполнялись HTTP-запросы к Linux A через Linux B. + +## Исходный код HTTP-сервера + +В каталоге `application` размещен исходный код Flask-приложения `app.py`, реализующего минимально требуемые эндпоинты. + +Пример проверочных запросов: + +```bash +curl http://192.168.11.10:5000/get +curl -X POST http://192.168.11.10:5000/post -H "Content-Type: application/json" -d '{"name":"test"}' +curl -X PUT http://192.168.11.10:5000/put -H "Content-Type: application/json" -d '{"id":1}' +``` + +## Проверка работы + +На Linux A сервер корректно запускался и отвечал на запросы `GET`, `POST` и `PUT`. + +На Linux C был выполнен запрос: + +```bash +curl http://192.168.11.10:5000/get +``` + +В ответ был получен корректный JSON от сервера Linux A. + +На Linux B с помощью `tcpdump` был зафиксирован проходящий трафик по порту `5000`, что подтверждает маршрутизацию HTTP-пакетов через gateway. + +## Проверка после перезагрузки + +После перезагрузки виртуальных машин были проверены условия: +- сетевые настройки сохранились; +- systemd-сервис `web-server` на Linux A автоматически запустился; +- параметр `net.ipv4.ip_forward=1` на Linux B сохранился; +- правила `iptables` на Linux B сохранились; +- Linux C продолжил успешно обращаться к Linux A по адресу `192.168.11.10:5000`. + +Таким образом, вся сетевая архитектура и необходимые сервисы продолжили функционирование после reboot. + +## Конфигурационные файлы + +В каталоге `configs` размещены: +- `linux-a-netplan.yaml` +- `linux-b-netplan.yaml` +- `linux-c-netplan.yaml` +- `web-server.service` +- `sysctl-b.conf` +- `rules.v4` + +## Структура репозитория + +```text +application/ + app.py +configs/ + linux-a-netplan.yaml + linux-b-netplan.yaml + linux-c-netplan.yaml + web-server.service + sysctl-b.conf + rules.v4 +images/ +report.md +``` + +## Вывод + +В ходе работы была настроена инфраструктура из трех виртуальных машин Linux с маршрутизацией трафика через промежуточный шлюз. +На Linux A был развернут HTTP-сервер на Flask на порту `5000`. +С Linux C были успешно выполнены HTTP-запросы к Linux A через Linux B. +Прохождение трафика было подтверждено с помощью `tcpdump` на Linux B. +После перезагрузки все основные настройки и сервисы сохранились и продолжили работать. diff --git a/vms/ubuntu_a/application/app.py b/vms/ubuntu_a/application/app.py deleted file mode 100644 index e54afbd..0000000 --- a/vms/ubuntu_a/application/app.py +++ /dev/null @@ -1,18 +0,0 @@ -from crypt import methods -from flask import Flask - -app = Flask(__name__) - -@app.route("/", methods=['GET']) -def hello_world(): - return "

Hello, World!

" - -@app.route("/", methods=['PUT']) -def hello_world_put(): - return "

Hello, World!

" - -@app.route("/", methods=['POST']) -def hello_world_post(): - return "

Hello, World!

" - -app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/vms/ubuntu_a/configs/network/netplan/client.yml b/vms/ubuntu_a/configs/network/netplan/client.yml deleted file mode 100644 index 653e3a4..0000000 --- a/vms/ubuntu_a/configs/network/netplan/client.yml +++ /dev/null @@ -1,9 +0,0 @@ -network: - ethernets: - enp0s3: # этот интерфейс используем для доступа с ноутбука - dhcp4: true - enp0s8: # этот интерфейс настравиваем на передачу запросов - dhcp4: no - addresses: [192.168.26.10/24] - gateway4: 192.168.26.1 - version: 2 \ No newline at end of file