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 index 0d4d13f..e32dd39 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,92 @@ -# Введение -Данная практика посвещена базовым принципам администрирования 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 +# linux_hw +Отчет по практической работе с виртуальными машинами на ОС Linux Ubuntu 24.04.2 + + +Работа начинается с создания и настройки виртуальных машин А, Б и С, где А - сервер, В - шлюз и С - клиент. +Ниже предствлены скрины настройки виртуальных машин и их состояние: +![lA](https://github.com/user-attachments/assets/f56d747e-8ed7-478a-8a48-09658b5529b7) +![lB](https://github.com/user-attachments/assets/3ca036d4-ab4f-49e7-8d5f-5e6af0e795ca) +![lC](https://github.com/user-attachments/assets/433c7a9b-32d3-4033-a36c-b89570f33eab) + +--- + +На всех трех виртуальных машинах был изменён 'hostname' в соответствии с заданием в файле etc/hostname : +![etc_hostnameA (1)](https://github.com/user-attachments/assets/8baf5b48-20e2-43bb-bc03-26076d1739df) +![etc_hostnameB](https://github.com/user-attachments/assets/f145e03c-e9b9-4a26-a04b-46d7b1765f26) +![etc_hostnameC](https://github.com/user-attachments/assets/3b8d81fe-23e8-4f84-8ae9-372055d5f3d0) + +После презагрузки машинам были присвоены новые 'hostname':
+ВМ А - shcerbakovaserver
ВМ Б - shcerbakovagateway
ВМ С - shcerbakovaclient + +![hostnameA](https://github.com/user-attachments/assets/98458eb8-6b85-488d-b471-c26618bdafc6) +![hostnameC](https://github.com/user-attachments/assets/0885b811-0621-45bf-97ed-7c28fbca0cac) +![hostnameB](https://github.com/user-attachments/assets/c50691a5-7f0b-4536-9761-8c06824659c0) + + +--- + +Далее была произведена конфигурация виртуальных интерфейсов на всех трех виртуальных машинах: +![netplan_ipaA](https://github.com/user-attachments/assets/2f1838c0-cf51-4bbc-90f0-5f9117383459) +![netplan_ipaB](https://github.com/user-attachments/assets/d1851135-18b0-4f61-8ec7-c6af9631bea2) +![netplan_ipaC](https://github.com/user-attachments/assets/3d826db3-6c1d-41fa-bf64-a00a6e0eb795) + +На ВМ А был для 'enp0s3' был выставлен автоматический ip-адрес, а для 'enp0s8' - "192.168.26.10/24" в соответствии с заданием;
+На ВМ Б был для 'enp0s3' был также выставлен автоматический ip-адрес, для 'enp0s8' - "192.168.26.1/24", а для enp0s9 - "192.168.6.1/24" в соответствии с заданием;
+На ВМ С был для 'enp0s3' выставлен автоматический ip-адрес, а для 'enp0s8' - "192.168.6.1/24" в соответствии с заданием; + +--- + +Перейдем к рассмотрению процесса настраивания виртуальных машин по отдельности. + +Начнем с ВМ А. + +Создан http-сервер на порту 5000. Также были реализованы три эндпоинта (запрос /get, /post, /put). Ниже представлен результат настройки: + +![flask_apppy](https://github.com/user-attachments/assets/512b78df-97f7-4326-ae00-37017c0fc1f7) + +--- + +Рассмотрит ВМ Б. + +С помощью утилит ip route и iptables были настроены маршрут пакетов от ВМ A до ВМ C и была настроена фильтрация по порту 5000. + +Настройка маршрутов представлена ниже: + +![nastroykaB](https://github.com/user-attachments/assets/86ae56c8-923b-489e-96cd-4ba0d9294faa) + +--- + +Перейдем к ВМ С. + +Ранее была представлена конфигурация ВМ С. А ниже представлены запросы, передаваемые через ВМ Б на ВМ А: + +![get_post_put](https://github.com/user-attachments/assets/c62403b9-1683-4a16-bdfb-c558d645de3c) + +Как можно заметить, ВМ С успешно получает фидбек от ВМ А. + +--- + +Теперь рассмотрит фидбек, получаемый с ВМ А, и мониторинг с помощью 'tcpdump' по порту 5000, установленный на ВМ Б. + +На скринах ниже представлено состояние ВМ А во время получения запросов с ВМ С: + +![gpp_A](https://github.com/user-attachments/assets/28b301dd-f375-4133-a2e3-430737eca823) + +Так же с помощью команды 'tcpdump' были получены логи передачи пакетов с ВМ С на ВМ А. Ниже представлены скрины. + +Мониторинг запросов GET с ВМ С на ВМ А: +![logs_get](https://github.com/user-attachments/assets/de673c05-e077-4875-b30b-166d80d0e281) + +Мониторинг запросов POST с ВМ С на ВМ А: + +![logs_post](https://github.com/user-attachments/assets/6ad2142d-cf7e-4429-8c17-16ed08de83ee) + +Мониторинг запросов PUT с ВМ С на ВМ А: + +![logs_put](https://github.com/user-attachments/assets/4c9fc810-437c-4ce1-95af-fb1dbcb4825b) + +--- + +По вышепредставленным скринам и описаниям происходящего можно сделать вывод, что все виртуальные машины были успешно настроены. Все три вида запросов с ВМ С на ВМ А через ВМ Б проходят успешно. + +--- diff --git a/configs/client b/configs/client new file mode 100644 index 0000000..5b8d5cd --- /dev/null +++ b/configs/client @@ -0,0 +1,9 @@ +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.6.10/24] + gateway4: 192.168.6.1 + version: 2 diff --git a/configs/gateway b/configs/gateway new file mode 100644 index 0000000..f2509c7 --- /dev/null +++ b/configs/gateway @@ -0,0 +1,11 @@ +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.26.1/24] + enp0s9: + dhcp4: no + addresses: [192.168.6.1/24] + version: 2 diff --git a/configs/server b/configs/server new file mode 100644 index 0000000..ffe1037 --- /dev/null +++ b/configs/server @@ -0,0 +1,9 @@ +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.26.10/24] + gateway4: 192.168.26.1 + version: 2 diff --git a/configs/webserver b/configs/webserver new file mode 100644 index 0000000..ef72f76 --- /dev/null +++ b/configs/webserver @@ -0,0 +1,10 @@ +[Unit] +Description=Web-Server + +[Service] +Type=idle +WorkingDirectory=/home/user/server +ExecStart=python3 app.py + +[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/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