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/server.py b/application/server.py new file mode 100644 index 0000000..e914fb9 --- /dev/null +++ b/application/server.py @@ -0,0 +1,20 @@ +from flask import Flask, request, jsonify + +app = Flask(__name__) + +@app.route('/get', methods=['GET']) +def get(): + return jsonify({'msg': 'GET received'}) + +@app.route('/post', methods=['POST']) +def post(): + data = request.json + return jsonify({'msg': 'POST received', 'data': data}) + +@app.route('/put', methods=['PUT']) +def put(): + data = request.json + return jsonify({'msg': 'PUT received', 'data': data}) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/configs/config_A b/configs/config_A new file mode 100644 index 0000000..27a956f --- /dev/null +++ b/configs/config_A @@ -0,0 +1,13 @@ +# This is the network config written by 'subiquity' +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s10: + dhcp4: no + addresses: [192.168.19.10/24] + routes: + - to: 192.168.9.0/24 + via: 192.168.19.1 + metric: 150 # for a correct order of routes \ No newline at end of file diff --git a/configs/config_B b/configs/config_B new file mode 100644 index 0000000..4ffc470 --- /dev/null +++ b/configs/config_B @@ -0,0 +1,12 @@ +# This is the network config written by 'subiquity' +network: + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.19.1/24] + enp0s9: + dhcp4: no + addresses: [192.168.9.1/24] + version: 2 \ No newline at end of file diff --git a/configs/config_C b/configs/config_C new file mode 100644 index 0000000..96ec029 --- /dev/null +++ b/configs/config_C @@ -0,0 +1,13 @@ +# This is the network config written by 'subiquity' +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: no + addresses: [192.168.9.10/24] + routes: + - to: 192.168.19.0/24 + via: 192.168.9.1 + metric: 150 \ 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/pics/1.png b/pics/1.png new file mode 100644 index 0000000..434ccfd Binary files /dev/null and b/pics/1.png differ diff --git a/pics/10_B.png b/pics/10_B.png new file mode 100644 index 0000000..1e1f3ee Binary files /dev/null and b/pics/10_B.png differ diff --git a/pics/11_B.png b/pics/11_B.png new file mode 100644 index 0000000..4bf0502 Binary files /dev/null and b/pics/11_B.png differ diff --git a/pics/12_B.png b/pics/12_B.png new file mode 100644 index 0000000..6971467 Binary files /dev/null and b/pics/12_B.png differ diff --git a/pics/13_B.png b/pics/13_B.png new file mode 100644 index 0000000..1891fb9 Binary files /dev/null and b/pics/13_B.png differ diff --git a/pics/14_B.png b/pics/14_B.png new file mode 100644 index 0000000..f7bf9e5 Binary files /dev/null and b/pics/14_B.png differ diff --git a/pics/15_B.png b/pics/15_B.png new file mode 100644 index 0000000..2144b89 Binary files /dev/null and b/pics/15_B.png differ diff --git a/pics/16_C.png b/pics/16_C.png new file mode 100644 index 0000000..cb6a892 Binary files /dev/null and b/pics/16_C.png differ diff --git a/pics/17_C.png b/pics/17_C.png new file mode 100644 index 0000000..ab9a885 Binary files /dev/null and b/pics/17_C.png differ diff --git a/pics/18_C.png b/pics/18_C.png new file mode 100644 index 0000000..01fac90 Binary files /dev/null and b/pics/18_C.png differ diff --git a/pics/19_C.png b/pics/19_C.png new file mode 100644 index 0000000..aa05737 Binary files /dev/null and b/pics/19_C.png differ diff --git a/pics/2.png b/pics/2.png new file mode 100644 index 0000000..7e4feb4 Binary files /dev/null and b/pics/2.png differ diff --git a/pics/3.png b/pics/3.png new file mode 100644 index 0000000..12805b3 Binary files /dev/null and b/pics/3.png differ diff --git a/pics/4.png b/pics/4.png new file mode 100644 index 0000000..cf8c1f9 Binary files /dev/null and b/pics/4.png differ diff --git a/pics/5.png b/pics/5.png new file mode 100644 index 0000000..c1efd64 Binary files /dev/null and b/pics/5.png differ diff --git a/pics/6.png b/pics/6.png new file mode 100644 index 0000000..dcc369d Binary files /dev/null and b/pics/6.png differ diff --git a/pics/7.png b/pics/7.png new file mode 100644 index 0000000..b97517d Binary files /dev/null and b/pics/7.png differ diff --git a/pics/8.png b/pics/8.png new file mode 100644 index 0000000..58f0c13 Binary files /dev/null and b/pics/8.png differ diff --git a/pics/9_B.png b/pics/9_B.png new file mode 100644 index 0000000..d40149f Binary files /dev/null and b/pics/9_B.png differ diff --git a/report.md b/report.md new file mode 100644 index 0000000..5be86a4 --- /dev/null +++ b/report.md @@ -0,0 +1,124 @@ + + + +# Отчёт + +## Linux A (Server) + +1. Сконфигурируем hostname как ```zaikovserver``` + +2. Создадим пользователя ```zaikov_1``` + + ![plot](./pics/1.png) + +3. Сконфигурируем виртуальный интерфейс с ip ```192.168.19.10/24```, указав нужные параметры в .yaml конфиге по пути ```/etc/netplan/``` и применив новые параметры с помощью netplan apply. Предварительно был добавлен интерфейс ```enp0s8```. + + ![plot](./pics/2.png) + ![plot](./pics/3.png) + Укажем ```metric``` для корректного дефолтного порядка маршрутизации (наверное, есть более правильный способ) + +4. Развернём http сервер на машине на порту 5000 с тремя эндпоинтами: + + ![plot](./pics/4.png) + + Для тестов сделаем ещё более упрощённый вариант: + + ![plot](./pics/5.png) + + Запустим: + + ![plot](./pics/6.png) + + Также для удобства добавим сервер в демон автозагрузки, оформив файл сервиса: + + ![plot](./pics/7.png) + + После перезагрузки проверим статус сервера: + + ![plot](./pics/8.png) + + +## Linux B (Gateway) + +1. Сконфигурируем hostname как ```zaikovgateway``` + +2. Создадим пользователя ```zaikov_2``` + + ![plot](./pics/9_B.png) + +3. Сконфигурируем два виртуальных интерфейса с ip ```192.168.19.1/24``` и ```192.168.9.10/24```. + + С помощью редактирования ```/etc/netplan/00-installer-config.yaml``` сконфигурируем два дополнительных виртуальных интерфейса ```enp0s8``` и ```enp0s9```: + + ![plot](./pics/10_B.png) + + и примением изменения с помощью + ```netplan apply``` (под рутом) + +4. С помощью утилит ```ip route``` и ```iptables``` настроим маршрут пакетов от Linux A до Linux C. Запретим все пакеты, кроме http пакетов через порт ```5000``` + С помощью команд + ``` + iptables -A FORWARD -i enp0s9 -o enp0s8 -p tcp --syn --dport 5000 -m conntrack --ctstate NEW -j ACCEPT + + iptables -A FORWARD -i enp0s9 -o enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + + iptables -A FORWARD -i enp0s9 -o enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + + iptables -P FORWARD DROP + ``` + + добавим правило принятия FORWARD (проброса) пакетов с одного интерфейса на другой (с ```enp0s9``` на ```enp0s8``` и наоборот, но рукопожатие - с клиента на сервер). + Также необходимо разрешить сам проброс пакетов с помощью команды: + ```echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward 1``` + и добавим в автозагрузку: + ```nano /etc/sysctl.conf``` + с помощью строки + ```net.ipv4.ip_forward = 1``` + + Проверим, что фаервол был настроен правильно. Изменим на сервере порт на ```5001```: + + ![plot](./pics/11_B.png) + + Запустим его и попробуем пробросить с клиента пакеты на ```5001```: + + ![plot](./pics/12_B.png) + + Пакеты не прошли, теперь и в фаерволе изменим порт на ```5001```: + + ![plot](./pics/13_B.png) + + Пробросим пакеты: + + ![plot](./pics/14_B.png) + + Как видно, фаервол настроен корректно и не позволяет tcp пакетам инициализации с клиента проходить на другие порты кроме разрешенного. Вернём ```5000```-й порт. + +5. Запустим программу tcpdump, предварительно добавив правило фильтрации с помощью команды: + + ``` + sudo iptables -t filter -I FORWARD -j NFLOG --nflog-group 6 (будем видеть все FWD пакетики) + ``` + + ![plot](./pics/15_B.png) + Пакеты летят (флаги синхронизации в начале S, флаги пушинга данных P, флаги завершения в конце F) + +## Linux C (Client) + +1. Сконфигурируем hostname как ```zaikovclient``` +2. Создадим пользователя ```zaikov_3``` + + ![plot](./pics/16_C.png) + +3. Сконфигурируем виртуальный интерфейс с ip ```192.168.9.100/24``` + + ![plot](./pics/17_C.png) + + и применим + + ![plot](./pics/18_C.png) + +4. С помощью команды curl на машине C пошлём 3 запроса на машину А в http сервер (```/get```, ```/post```, ```/put```): + + ![plot](./pics/19_C.png) + + На каждый запрос был получен ответ от сервера без ошибок \ 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