diff --git a/Linux/LinuxPractice/Linux Practice.png b/Linux/LinuxPractice/Linux Practice.png new file mode 100644 index 0000000..212b38a Binary files /dev/null and b/Linux/LinuxPractice/Linux Practice.png differ diff --git a/Linux/LinuxPractice/README.md b/Linux/LinuxPractice/README.md new file mode 100644 index 0000000..9c0279e --- /dev/null +++ b/Linux/LinuxPractice/README.md @@ -0,0 +1,43 @@ +# Введение +Данная практика посвещена базовым принципам администрирования 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/Linux/LinuxPractice/guide/Manual.md b/Linux/LinuxPractice/guide/Manual.md new file mode 100644 index 0000000..736df56 --- /dev/null +++ b/Linux/LinuxPractice/guide/Manual.md @@ -0,0 +1,234 @@ +# Практика 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. Если нет доступа к интернету с виртуальной машины нужно проверить нет ли у вас задвоения дефодетых маршрутов и если есть, то удалить лишнее. +```shell +ip r +``` +3. Python установлен по-умолчанию. Для установки flask необходимо ввести: +```shell +pip install flask +``` +4. Создайте файл 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 клиента принимает ответ от сервера из разных подсетей) diff --git a/Linux/LinuxPractice/vms/ubuntu_a/application/app.py b/Linux/LinuxPractice/vms/ubuntu_a/application/app.py new file mode 100644 index 0000000..2ad890e --- /dev/null +++ b/Linux/LinuxPractice/vms/ubuntu_a/application/app.py @@ -0,0 +1,18 @@ +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/Linux/LinuxPractice/vms/ubuntu_a/configs/network/netplan/client.yml b/Linux/LinuxPractice/vms/ubuntu_a/configs/network/netplan/client.yml new file mode 100644 index 0000000..b15d788 --- /dev/null +++ b/Linux/LinuxPractice/vms/ubuntu_a/configs/network/netplan/client.yml @@ -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 \ No newline at end of file diff --git a/Linux/report.md b/Linux/report.md new file mode 100644 index 0000000..526bd90 --- /dev/null +++ b/Linux/report.md @@ -0,0 +1,57 @@ +# Отчёт по лабораторной работе: Настройка сети между виртуальными машинами + +## Цель работы +Настроить связь между тремя виртуальными машинами (A, B, C) с маршрутизацией через шлюз (Машина B) и развернуть веб-сервер. + +## Выполненные шаги + +### 1. Настройка сети +- **Машина A (Сервер)** + - IP: 192.168.25.10/24 + - Интерфейс: enp0s8 + ```yaml + # configs/machine_A_netplan.yaml + network: + version: 2 + ethernets: + enp0s8: + addresses: [192.168.25.10/24] + ``` + +- **Машина B (Шлюз)** + - IP: 192.168.25.1/24 (enp0s8) и 192.168.3.1/24 (enp0s9) + - Включен IP-форвардинг + ```bash + echo 1 > /proc/sys/net/ipv4/ip_forward + ``` + +### 2. Настройка маршрутов +```bash +# На Машине A: +sudo ip route add 192.168.3.0/24 via 192.168.25.1 + +# На Машине C: +sudo ip route add 192.168.25.0/24 via 192.168.3.1 +``` + +### 3. Развертывание веб-сервера +- Запущен Flask-сервер на Машине A: +```python +# application/app.py +from flask import Flask +app = Flask(__name__) + +@app.route("/") +def hello(): + return "Hello from Machine A" + +app.run(host='192.168.25.10', port=5000) +``` + +## Результаты +- Успешный ping между всеми машинами +- Доступ к веб-серверу с Машины C: + ```bash + curl http://192.168.25.10:5000 + > Hello from Machine A + ``` \ No newline at end of file diff --git "a/Linux/\320\235\320\276\320\262\321\213\320\271 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202.py" "b/Linux/\320\235\320\276\320\262\321\213\320\271 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202.py" new file mode 100644 index 0000000..26a0b56 --- /dev/null +++ "b/Linux/\320\235\320\276\320\262\321\213\320\271 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202.py" @@ -0,0 +1,10 @@ +from flask import Flask +app = Flask(__name__) + +@app.route("/") +def hello(): + return "Hello World!" + + +if __name__ == "__main__": + app.run(host='192.168.25.10', port=5000) \ No newline at end of file diff --git "a/Linux/\320\235\320\276\320\262\321\213\320\271 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202.yaml" "b/Linux/\320\235\320\276\320\262\321\213\320\271 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202.yaml" new file mode 100644 index 0000000..5b6ba22 --- /dev/null +++ "b/Linux/\320\235\320\276\320\262\321\213\320\271 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202.yaml" @@ -0,0 +1,7 @@ +network: + version: 2 + ethernets: + enp0s8: + addresses: [192.168.25.1/24] + enp0s9: + addresses: [192.168.3.1/24] \ No newline at end of file diff --git "a/Linux/\320\241\320\275\320\270\320\274\320\276\320\272 \321\215\320\272\321\200\320\260\320\275\320\260 2025-03-24 223359.png" "b/Linux/\320\241\320\275\320\270\320\274\320\276\320\272 \321\215\320\272\321\200\320\260\320\275\320\260 2025-03-24 223359.png" new file mode 100644 index 0000000..e37224c Binary files /dev/null and "b/Linux/\320\241\320\275\320\270\320\274\320\276\320\272 \321\215\320\272\321\200\320\260\320\275\320\260 2025-03-24 223359.png" differ diff --git a/guide/Manual.md b/guide/Manual.md index d4cabdf..6f28a3e 100644 --- a/guide/Manual.md +++ b/guide/Manual.md @@ -159,11 +159,13 @@ sudo ip6tables-save > /etc/iptables/rules.v6 ### Веб-сервер (Машина А) 1. Для установки веб-сервера на машине А рекомендуется использовать python flask -2. Python установлен по-умолчанию. Для установки flask необходимо ввести: +2. Если нет доступа к интернету с виртуальной машины нужно проверить нет ли у вас задвоения дефодетых маршрутов и если есть, то удалить лишнее. +```ip r +4. Python установлен по-умолчанию. Для установки flask необходимо ввести: ```shell pip install flask ``` -3. Создайте файл app.py и поместите следующее содержимое: +4. Создайте файл app.py и поместите следующее содержимое: ```python from flask import Flask @@ -227,4 +229,4 @@ ip route add / via ``` 6. Также развернуть веб сервер на машине С и помощью curl получить ответ от веб сервера 7. настроить файрвол можно пожеланию (задание опциональное) -8. написать bash скрипт для каждой виртуальной машине, который повторяет действия сделанные вручную (в качестве проверке создайте заново 3 виртуалки, результат скрипта - сurl клиента принимает ответ от сервера из разных подсетей) \ No newline at end of file +8. написать bash скрипт для каждой виртуальной машине, который повторяет действия сделанные вручную (в качестве проверке создайте заново 3 виртуалки, результат скрипта - сurl клиента принимает ответ от сервера из разных подсетей)