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..9b42c7d 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,82 @@ -# Введение -Данная практика посвещена базовым принципам администрирования 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 + +# LinuxPractice +# LinuxHW1 +Первое домашнее задание по "ПО облачных платформ" + +Работал в Play-with-docker. + +# Для начала создадим три контейнера при помощи нажатия кнопки ADD NEW INSTANCE. + +Вот результат (рисунок 1) +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/94fa61b3-b644-4193-97a2-33f7ff7c0279) +Рисунок 1 - Контейнеры в Play-With-Docker + +Теперь настроим сети, используя ipvlan. +В контейнер А и С добавим адаптеры + +Контейнер А после настройки +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/811e3454-3012-4702-a14e-841aa374fcd3) + + +Контейнер С +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/5b4e4ea8-b643-40dd-ae53-3fa40bc1eb05) + + +Теперь добавим по адаптеру в контейнер В + +192.168.17.1 с маской 255.255.255.0 +192.168.3.1 с маской 255.255.255.0 + +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/452ad078-1b32-4a8e-b3c0-16fb7fa539e5) + + +# Маршруты +Далее настроим маршрутизацию. Скажем контейнеру A отсылать пакеты в контейнер C через адаптер macvlan1 на контейнере B. + +В машине A: ip route add 192.168.3.0/24 via 192.168.17.1 +Для контейнера С настроим передачу обратным образом +и тогда получим +В контейнере А +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/21e35150-021a-448a-95df-7d735222dbf7) + + +В контейнере С +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/753e3370-109c-4df2-b81d-c8775bbe5adc) + + + +# Web server +Добавим файл с нашим сервером, в наш контейнер А + +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/bf839fa3-f515-4a98-bed3-bd2920876bc3) + +И запустим его + +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/c78e608c-93a9-42ca-8e57-5e514707353b) + +Теперь проверим работу наших серверов отправим все три запроса с сервера С + +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/4dcad131-025f-4342-85ff-ea025dc1dc46) + +Можем убедиться в их прохождении на сервера А , посмотрев логи +![image](https://github.com/BilioboMain/LinuxPractice_2/assets/53617626/845510cb-e20f-40df-afa7-a1c61f6f01cb) + +# Написание скриптов +Общие настройки серверов, можно либо подключитьса по ssh, либо использовать возможности самой платформы для передачи файлов, я выбрал вариант попроще +Для кажлого сервера с командой touch 'file_name' создал .sh файл, затем изменил его содержимое редактором фалов платформы +Далее сделал его исполняемым командой chmod +x filename +И теперь каждый файл мы можем запустить при помощи sudo ./filename.sh + +Перейдём к настройкам +после запуска на нашем сервера А, мы получаем следующую картину +![image](https://github.com/BilioboMain/LinuxPractice/assets/53617626/663afdf5-c243-47fe-a33f-324f716bd47d) +![image](https://github.com/BilioboMain/LinuxPractice/assets/53617626/2faa8d9c-dbc8-4472-abea-653dbd39ff26) + +на второй картинке сразу можно увидеть логи, которые показывает, что мы дернули роут + +Далее запустив sudo ./server_b.sh на нашем втором сервере мы получим +![image](https://github.com/BilioboMain/LinuxPractice/assets/53617626/488c414b-dfed-4eef-8bf5-429999140c0a) + +После запуска скрипта на сервере C получим следующее сообщение, значит сервера работают корректно + +![image](https://github.com/BilioboMain/LinuxPractice/assets/53617626/f9477ac9-1763-460e-a63e-f314b0f3bc33) diff --git a/vms/ubuntu_a/application/app.py b/application/app.py similarity index 100% rename from vms/ubuntu_a/application/app.py rename to application/app.py diff --git a/configs/server_a.sh b/configs/server_a.sh new file mode 100644 index 0000000..694f478 --- /dev/null +++ b/configs/server_a.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# default values +IPADDR=192.168.1.10/24 +GATEWAY=192.168.1.1 +TOSUBNET=192.168.2.0/24 +# work check - server_a.sh --ip-adress=192.168.1.20/24 --gateway=192.168.1.1 --to-subnet=192.168.2.0/24 +PARSED_ARGUMENTS=$(getopt -o i::,g::,t:: -l ip-adress::,gateway::,to-subnet:: -n 'server_a.sh' -- "$@") +echo "$PARSED_ARGUMENTS" +VALID_ARGUMENTS=$? +if [ "$VALID_ARGUMENTS" != "0" ]; then + echo " Something wrong" + exit 2 +fi + +eval set -- "$PARSED_ARGUMENTS" +while : +do + case "$1" in + --ip-adress | -i) IPADDR=$2; shift 2 ;; + --gateway | -g) GATEWAY=$2; shift 2 ;; + --to-subnet | -t) TOSUBNET=$2; shift 2 ;; + --) shift; break ;; + *) echo "Unexpected option: $1 - this should not happen." + exit 2 ;; + esac +done +echo "IPADDR=$IPADDR" +echo "GATEWAY=$GATEWAY" +echo "TOSUBNET=$TOSUBNET" + +ip link add macvlan1 link eth0 type macvlan mode bridge # создаем новый адаптер с типом bridge и делаем связь адаптера с eth0 +ip address add dev macvlan1 $IPADDR # добавляем ip адрес адаптеру +ip link set macvlan1 up # включаем адаптер +#ip route add / via +ip route add $TOSUBNET via $GATEWAY + +pip install flask + +cat > app.py << EOF +from flask import Flask + +app = Flask(__name__) + + +@app.route("/", methods=['GET']) +def hello_world(): + return "

[GET]Hello, World!

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

[PUT]Hello, World!

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

[POST]Hello, World!

" + +app.run(host='0.0.0.0', port=5000) +EOF + +python3 app.py \ No newline at end of file diff --git a/configs/server_b.sh b/configs/server_b.sh new file mode 100644 index 0000000..a27750c --- /dev/null +++ b/configs/server_b.sh @@ -0,0 +1,33 @@ +#!/bin/bash +IPFIRST=192.168.1.1/24 +IPSECOND=192.168.2.1/24 +# work check - bash server_b.sh --ip-first=192.168.17.2/24 --ip-second=192.168.18.2/24 +PARSED_ARGUMENTS=$(getopt -o f::,s:: -l ip-first::,ip-second:: -n 'server_b.sh' -- "$@") +echo "$PARSED_ARGUMENTS" +VALID_ARGUMENTS=$? +if [ "$VALID_ARGUMENTS" != "0" ]; then + echo " Something wrong" + exit 2 +fi + +eval set -- "$PARSED_ARGUMENTS" +while : +do + case "$1" in + --ip-first | -f) IPFIRST=$2; shift 2 ;; + --ip-second | -s) IPSECOND=$2; shift 2 ;; + --) shift; break ;; + *) echo "Unexpected option: $1 - this should not happen." + exit 2 ;; + esac +done +echo "IPFIRST=$IPFIRST" +echo "IPSECOND=$IPSECOND" + +ip link add macvlan1 link eth0 type macvlan mode bridge # создаем новый адаптер с типом bridge и делаем связь адаптера с eth0 +ip address add dev macvlan1 $IPFIRST # добавляем ip адрес адаптеру +ip link set macvlan1 up # включаем адаптер + +ip link add macvlan2 link eth0 type macvlan mode bridge # создаем новый адаптер с типом bridge и делаем связь адаптера с eth0 +ip address add dev macvlan2 $IPSECOND # добавляем ip адрес адаптеру +ip link set macvlan2 up # включаем адаптер \ No newline at end of file diff --git a/configs/server_c.sh b/configs/server_c.sh new file mode 100644 index 0000000..7e931a8 --- /dev/null +++ b/configs/server_c.sh @@ -0,0 +1,39 @@ +#!/bin/bash +IPADDR=192.168.2.10/24 +GATEWAY=192.168.2.1 +TOSUBNET=192.168.1.0/24 +HTTP='http://192.168.1.10:5000/' +# work check - server_c.sh --ip-adress=192.168.1.20/24 --gateway=192.168.1.1 --to-subnet=192.168.2.0/24 --http=http://192.168.1.10:5000/ +PARSED_ARGUMENTS=$(getopt -o i::,g::,t::,h:: -l ip-adress::,gateway::,to-subnet::,http:: -n 'server_c.sh' -- "$@") +echo "$PARSED_ARGUMENTS" +VALID_ARGUMENTS=$? +if [ "$VALID_ARGUMENTS" != "0" ]; then + echo " Something wrong" + exit 2 +fi + +eval set -- "$PARSED_ARGUMENTS" +while : +do + case "$1" in + --ip-adress | -i) IPADDR=$2; shift 2 ;; + --gateway | -g) GATEWAY=$2; shift 2 ;; + --to-subnet | -t) TOSUBNET=$2; shift 2 ;; + --http | -h) HTTP=$2; shift 2 ;; + --) shift; break ;; + *) echo "Unexpected option: $1 - this should not happen." + exit 2 ;; + esac +done +echo "IPADDR=$IPADDR" +echo "GATEWAY=$GATEWAY" +echo "TOSUBNET=$TOSUBNET" +echo "HTTP=$HTTP" + +ip link add macvlan1 link eth0 type macvlan mode bridge # создаем новый адаптер с типом bridge и делаем связь адаптера с eth0 +ip address add dev macvlan1 $IPADDR # добавляем ip адрес адаптеру +ip link set macvlan1 up # включаем адаптер +#ip route add / via +ip route add $TOSUBNET via $GATEWAY + +curl $HTTP \ 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/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