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/vms/ubuntu_a/application/app.py b/application/app.py similarity index 55% rename from vms/ubuntu_a/application/app.py rename to application/app.py index e54afbd..3890a24 100644 --- a/vms/ubuntu_a/application/app.py +++ b/application/app.py @@ -1,18 +1,18 @@ -from crypt import methods from flask import Flask app = Flask(__name__) @app.route("/", methods=['GET']) def hello_world(): - return "

Hello, World!

" + return "

Hello, World!

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

Hello, World!

" + return "

Hello, World!

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

Hello, World!

" + return "

Hello, World!

\n" -app.run(host='0.0.0.0', port=5000) \ No newline at end of file +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) \ No newline at end of file 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/report.md b/report.md new file mode 100644 index 0000000..0e9f31c --- /dev/null +++ b/report.md @@ -0,0 +1,124 @@ +# Отчет по практической работе: Базовые принципы администрирования Linux +## Введение +Данная практика посвящена базовым принципам администрирования ОС Linux. Для выполнения практики необходимо развернуть 3 виртуальные машины Linux. +В качестве среды виртуализации используется VirtualBox, операционная система — Ubuntu Server 20.04. + +--- + +## Цели и исходные данные +**Цель работы:** Настройка трех виртуальных машин Linux (сервер, шлюз и клиент), конфигурация сети между ними, настройка маршрутизации с фильтрацией трафика и развертывание простого веб-сервера. + +**Инструменты:** VirtualBox, Ubuntu Server 20.04.06 LTS. + +**Исходные данные студента:** +* Фамилия: Байнин +* День рождения: 30 +* Месяц рождения: июнь + +--- + +## Глава 1. Подготовка виртуальных машин + +### 1.1. Linux_A (Сервер) +* **Имя машины:** lin1 +* **Пользователь:** bainin_1 + +### 1.2. Linux_B (Шлюз) +* **Имя машины:** lin2 +* **Пользователь:** bainin_2 + +### 1.3. Linux_C (Клиент) +* **Имя машины:** lin3 +* **Пользователь:** bainin_3 + +![Screenshot_3.jpg](screenshots/Screenshot_3.jpg) + +--- + +## Глава 2. Настройка Linux A (Сервер) + +### 2.1. Настройка сети +Сетевые адаптеры в VirtualBox: +* Адаптер 1: NAT! +* Адаптер 2: Внутренняя сеть + +Конфигурация Netplan (`/etc/netplan/00-installer-config.yaml`): + +![Screenshot_1.jpg](screenshots/Screenshot_1.jpg) + +--- + +## Глава 3. Настройка Linux B (Шлюз) + +### 3.1. Настройка сети +Сетевые адаптеры в VirtualBox: +* Адаптер 1: Внутренняя сеть (связь с сервером) +* Адаптер 2: Внутренняя сеть (связь с клиентом) +* Адаптер 3: Сетевой мост + +Конфигурация Netplan (`/etc/netplan/00-installer-config.yaml`): + +![Screenshot_2.jpg](screenshots/Screenshot_2.jpg) + + +--- + +## Глава 4. Настройка Linux C (Клиент) + +### 4.1. Настройка сети +Сетевые адаптеры в VirtualBox: +* Адаптер 1: Внутренняя сеть +* Адаптер 2: Сетевой мост (для установки пакетов) + + +Конфигурация Netplan (`/etc/netplan/00-installer-config.yaml`) с указанием шлюза `192.168.5.1`: + +![Screenshot_5.jpg](screenshots/Screenshot_5.jpg) + +--- + +## Глава 5. Тестирование работоспособности + +### 5.1. Мониторинг трафика (tcpdump) +На шлюзе (Linux B) запущена утилита `tcpdump` для отслеживания пакетов, проходящих по порту 5000: + +![Screenshot_6.jpg](screenshots/Screenshot_6.jpg) + +### 5.2. Отправка запросов с Клиента (Linux C) на Сервер (Linux A) +С клиента выполнены HTTP-запросы к серверу `192.168.21.10:5000` с проверкой ответов: + +**GET запрос:** + +![Screenshot_9.jpg](screenshots/Screenshot_9.jpg) + + +**POST запрос:** + +![Screenshot_10.jpg](screenshots/Screenshot_10.jpg) + + +**PUT запрос:** + +![Screenshot_8.jpg](screenshots/Screenshot_8.jpg) + +**Проверка сервера:** + +![Screenshot_11.jpg](screenshots/Screenshot_11.jpg) + +## Главо 6. Автозапуск + +### 6.1. Автозапуск веб-сервера +На стороне сервера Flask-приложение настроено как системная служба systemd. Это гарантирует запуск сервера при старте ОС и его автоматический перезапуск в случае сбоя. +**Конфигурация сервиса (/etc/systemd/system/web-server.service):** + +![Screenshot_15.jpg](screenshots/Screenshot_15.jpg) + +**Сервис работает** + +![Screenshot_13.jpg](screenshots/Screenshot_13.jpg) + +## Вывод +В ходе выполнения практической работы «Базовые принципы администрирования Linux» была успешно развернута и настроена сетевая инфраструктура из трех виртуальных машин. Сконфигурированы IP-адреса для сервера (Linux A), клиента (Linux C) и два статических интерфейса для шлюза (Linux B). + +С помощью `iptables` на шлюзе настроена маршрутизация и строгая фильтрация трафика, разрешающая исключительно проброс HTTP-запросов на порт 5000. На сервере развернут веб-сервер Flask. Все настройки корректно сохраняются после перезагрузки систем. + diff --git a/screenshots/Screenshot_1.jpg b/screenshots/Screenshot_1.jpg new file mode 100644 index 0000000..60dd450 Binary files /dev/null and b/screenshots/Screenshot_1.jpg differ diff --git a/screenshots/Screenshot_10.jpg b/screenshots/Screenshot_10.jpg new file mode 100644 index 0000000..fc5ba4c Binary files /dev/null and b/screenshots/Screenshot_10.jpg differ diff --git a/screenshots/Screenshot_11.jpg b/screenshots/Screenshot_11.jpg new file mode 100644 index 0000000..bea6afa Binary files /dev/null and b/screenshots/Screenshot_11.jpg differ diff --git a/screenshots/Screenshot_13.jpg b/screenshots/Screenshot_13.jpg new file mode 100644 index 0000000..e8e93b4 Binary files /dev/null and b/screenshots/Screenshot_13.jpg differ diff --git a/screenshots/Screenshot_15.jpg b/screenshots/Screenshot_15.jpg new file mode 100644 index 0000000..f91ec66 Binary files /dev/null and b/screenshots/Screenshot_15.jpg differ diff --git a/screenshots/Screenshot_2.jpg b/screenshots/Screenshot_2.jpg new file mode 100644 index 0000000..da0b2f4 Binary files /dev/null and b/screenshots/Screenshot_2.jpg differ diff --git a/screenshots/Screenshot_3.jpg b/screenshots/Screenshot_3.jpg new file mode 100644 index 0000000..58486d1 Binary files /dev/null and b/screenshots/Screenshot_3.jpg differ diff --git a/screenshots/Screenshot_4.jpg b/screenshots/Screenshot_4.jpg new file mode 100644 index 0000000..e0b3f8d Binary files /dev/null and b/screenshots/Screenshot_4.jpg differ diff --git a/screenshots/Screenshot_5.jpg b/screenshots/Screenshot_5.jpg new file mode 100644 index 0000000..4fa69f2 Binary files /dev/null and b/screenshots/Screenshot_5.jpg differ diff --git a/screenshots/Screenshot_6.jpg b/screenshots/Screenshot_6.jpg new file mode 100644 index 0000000..fc83724 Binary files /dev/null and b/screenshots/Screenshot_6.jpg differ diff --git a/screenshots/Screenshot_7.jpg b/screenshots/Screenshot_7.jpg new file mode 100644 index 0000000..96290eb Binary files /dev/null and b/screenshots/Screenshot_7.jpg differ diff --git a/screenshots/Screenshot_8.jpg b/screenshots/Screenshot_8.jpg new file mode 100644 index 0000000..86ec459 Binary files /dev/null and b/screenshots/Screenshot_8.jpg differ diff --git a/screenshots/Screenshot_9.jpg b/screenshots/Screenshot_9.jpg new file mode 100644 index 0000000..aae0576 Binary files /dev/null and b/screenshots/Screenshot_9.jpg differ 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