Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed Linux Practice.png
Binary file not shown.
125 changes: 82 additions & 43 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,82 @@
# Введение
Данная практика посвещена базовым принципам администрирования Linux. Для выполнения практики необходимо развернуть 3 виртуальные машины Linux.

Как пример, можно использовать Virtual Box + Ubuntu Server 20.04.

# Задание
Для выполнения данного задания необходимо:
1. Развернуть три виртуальные машины Linux, согласно схеме ниже


![info](Linux%20Practice.png)

2. Linux A
1. Сконфигурировать Hostname следующим образом: <your_surname>_server (пропустить если делаете через Play with docker)
2. Создать пользователя <your_surname>_1 (пропустить если делаете через Play with docker)
3. Сконфигурировать виртуальный интерфейс со следующим ip адресом: 192.168.<день рождения>.10/24
4. Развернуть Http сервер на виртуальной машине на порту 5000. Необходимо реализовать минимум три эндпоинта (запрос /get, /post, /put)
3. Linux B
1. Сконфигурировать Hostname следующим образом: <your_surname>_gateway (пропустить если делаете через Play with docker)
2. Создать пользователя <your_surname>_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 следующим образом: <your_surname>_client (пропустить если делаете через Play with docker)
2. Создать пользователя <your_surname>_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)
File renamed without changes.
60 changes: 60 additions & 0 deletions configs/server_a.sh
Original file line number Diff line number Diff line change
@@ -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 <subnet A vm>/<mask> via <gateway ip B vm>
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 "<p>[GET]Hello, World!</p>"

@app.route("/", methods=['PUT'])
def hello_world_put():
return "<p>[PUT]Hello, World!</p>"

@app.route("/", methods=['POST'])
def hello_world_post():
return "<p>[POST]Hello, World!</p>"

app.run(host='0.0.0.0', port=5000)
EOF

python3 app.py
33 changes: 33 additions & 0 deletions configs/server_b.sh
Original file line number Diff line number Diff line change
@@ -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 # включаем адаптер
39 changes: 39 additions & 0 deletions configs/server_c.sh
Original file line number Diff line number Diff line change
@@ -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 <subnet A vm>/<mask> via <gateway ip B vm>
ip route add $TOSUBNET via $GATEWAY

curl $HTTP
Loading