diff --git a/application/app.py b/application/app.py new file mode 100644 index 0000000..7ccb6e6 --- /dev/null +++ b/application/app.py @@ -0,0 +1,17 @@ +from flask import Flask, request, jsonify + +app = Flask(__name__) + +@app.get("/get") +def get_data(): + return jsonify({"method": "GET", "status": "ok"}) + +@app.post("/post") +def post_data(): + return jsonify({"method": "POST", "data": request.get_json(silent=True)}) + +@app.put("/put") +def put_data(): + return jsonify({"method": "PUT", "data": request.get_json(silent=True)}) + +app.run(host="0.0.0.0", port=5000) \ No newline at end of file diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/config/.gitkeep @@ -0,0 +1 @@ + diff --git a/config/linux-a-netplan.yaml b/config/linux-a-netplan.yaml new file mode 100644 index 0000000..346db2f --- /dev/null +++ b/config/linux-a-netplan.yaml @@ -0,0 +1,12 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.4.10/24 + routes: + - to: 192.168.9.0/24 + via: 192.168.4.1 \ No newline at end of file diff --git a/config/linux-b-netplan.yaml b/config/linux-b-netplan.yaml new file mode 100644 index 0000000..7c040ad --- /dev/null +++ b/config/linux-b-netplan.yaml @@ -0,0 +1,13 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.4.1/24 + enp0s9: + dhcp4: false + addresses: + - 192.168.9.10/24 \ No newline at end of file diff --git a/config/linux-c-netplan.yaml b/config/linux-c-netplan.yaml new file mode 100644 index 0000000..f0b2d58 --- /dev/null +++ b/config/linux-c-netplan.yaml @@ -0,0 +1,12 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.9.100/24 + routes: + - to: 192.168.4.0/24 + via: 192.168.9.10 \ No newline at end of file diff --git a/configs.zip b/configs.zip new file mode 100644 index 0000000..eece52b Binary files /dev/null and b/configs.zip differ diff --git a/configs/linux-a-netplan.yaml b/configs/linux-a-netplan.yaml new file mode 100644 index 0000000..0b1df9d --- /dev/null +++ b/configs/linux-a-netplan.yaml @@ -0,0 +1,12 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.4.10/24 + routes: + - to: 192.168.9.0/24 + via: 192.168.4.1 \ No newline at end of file diff --git a/configs/linux-b-netplan.yaml b/configs/linux-b-netplan.yaml new file mode 100644 index 0000000..5e93929 --- /dev/null +++ b/configs/linux-b-netplan.yaml @@ -0,0 +1,13 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.4.1/24 + enp0s9: + dhcp4: false + addresses: + - 192.168.9.10/24 \ No newline at end of file diff --git a/configs/linux-c-netplan.yaml b/configs/linux-c-netplan.yaml new file mode 100644 index 0000000..8945724 --- /dev/null +++ b/configs/linux-c-netplan.yaml @@ -0,0 +1,12 @@ +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.9.100/24 + routes: + - to: 192.168.4.0/24 + via: 192.168.9.10 \ No newline at end of file diff --git a/pics/Linux_A_HTTP2.png b/pics/Linux_A_HTTP2.png new file mode 100644 index 0000000..8851264 Binary files /dev/null and b/pics/Linux_A_HTTP2.png differ diff --git a/pics/Linux_A_interfaces.png b/pics/Linux_A_interfaces.png new file mode 100644 index 0000000..e72828a Binary files /dev/null and b/pics/Linux_A_interfaces.png differ diff --git a/pics/Linux_A_ip_route.png b/pics/Linux_A_ip_route.png new file mode 100644 index 0000000..191b2d3 Binary files /dev/null and b/pics/Linux_A_ip_route.png differ diff --git a/pics/Linux_B_interfaces.png b/pics/Linux_B_interfaces.png new file mode 100644 index 0000000..b6089e9 Binary files /dev/null and b/pics/Linux_B_interfaces.png differ diff --git a/pics/Linux_B_ip_route.png b/pics/Linux_B_ip_route.png new file mode 100644 index 0000000..3a12909 Binary files /dev/null and b/pics/Linux_B_ip_route.png differ diff --git a/pics/Linux_B_tcpdump.png b/pics/Linux_B_tcpdump.png new file mode 100644 index 0000000..0893847 Binary files /dev/null and b/pics/Linux_B_tcpdump.png differ diff --git a/pics/Linux_C_Ping.png b/pics/Linux_C_Ping.png new file mode 100644 index 0000000..f48a152 Binary files /dev/null and b/pics/Linux_C_Ping.png differ diff --git a/pics/Linux_C_interfaces.png b/pics/Linux_C_interfaces.png new file mode 100644 index 0000000..48165bd Binary files /dev/null and b/pics/Linux_C_interfaces.png differ diff --git a/pics/Linux_C_ip_route.png b/pics/Linux_C_ip_route.png new file mode 100644 index 0000000..51a0a63 Binary files /dev/null and b/pics/Linux_C_ip_route.png differ diff --git a/report.md b/report.md new file mode 100644 index 0000000..461a302 --- /dev/null +++ b/report.md @@ -0,0 +1,270 @@ +# Практическая работа №1 +# Базовые принципы администрирования Linux + +## Цель работы + +Развернуть и настроить 3 виртуальные машины Linux в VirtualBox, организовать сетевое взаимодействие между ними через промежуточную машину-шлюз, поднять HTTP-сервер на Linux A, выполнить запросы с Linux C на Linux A и проконтролировать прохождение трафика через Linux B. + +## Используемые инструменты + +- VirtualBox +- Ubuntu Server 22.04 +- Netplan +- Python 3 +- Flask +- curl +- tcpdump + +## Исходные данные + +- Фамилия: **Dolinin** +- День рождения: **4** +- Месяц рождения: **9** + +## Схема стенда + +Были развернуты 3 виртуальные машины: + +- **Linux A** — сервер +- **Linux B** — шлюз +- **Linux C** — клиент + +Сетевая схема: + +- Linux A ↔ Linux B : сеть `192.168.4.0/24` +- Linux B ↔ Linux C : сеть `192.168.9.0/24` + +Назначенные IP-адреса: + +- **Linux A**: `192.168.4.10/24` +- **Linux B**: + - `192.168.4.1/24` + - `192.168.9.10/24` +- **Linux C**: `192.168.9.100/24` + +--- + +# 1. Подготовка виртуальных машин + +В VirtualBox были созданы 3 виртуальные машины на базе Ubuntu Server 22.04. + +## Настройка сетевых адаптеров в VirtualBox + +### Linux A +- Adapter 1: `NAT` +- Adapter 2: `Internal Network` → `net-a` + +### Linux B +- Adapter 1: `NAT` +- Adapter 2: `Internal Network` → `net-a` +- Adapter 3: `Internal Network` → `net-b` + +### Linux C +- Adapter 1: `NAT` +- Adapter 2: `Internal Network` → `net-b` + +--- + +# 2. Настройка Linux A + +## 2.1. Hostname и пользователь + +Для Linux A был задан hostname, а также добавлен пользователь: + +```bash +sudo hostnamectl set-hostname dolinin_server +sudo adduser dolinin_1 +``` +## 2.2. Настройка сети +На машине А были обнаружены интерфейсы: +- enp0s3 — NAT +- enp0s8 — внутренняя сеть +Файл `/etc/netplan/00-installer-config.yaml` был настроен следующим образом: +```yaml +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.4.10/24 + routes: + - to: 192.168.9.0/24 + via: 192.168.4.1 +``` +Применение настроек: +```bash +sudo chmod 600 /etc/netplan/00-installer-config.yaml +sudo netplan apply +``` +В результате интерфейс `enp0s8` получил адрес `192.168.4.10/24`, а маршрут в сеть `192.168.9.0/24` был направлен через `192.168.4.1`. +## 2.3. Развертывание HTTP-сервера +На Linux A был развернут простой HTTP-сервер на Flask, работающий на порту `5000`. +Файл `app.py`: +```python +from flask import Flask, request, jsonify + +app = Flask(__name__) + +@app.get("/get") +def get_data(): + return jsonify({"method": "GET", "status": "ok"}) + +@app.post("/post") +def post_data(): + return jsonify({"method": "POST", "data": request.get_json(silent=True)}) + +@app.put("/put") +def put_data(): + return jsonify({"method": "PUT", "data": request.get_json(silent=True)}) + +app.run(host="0.0.0.0", port=5000) +``` +--- + +# 3 Настройка Linux B + +## 3.1. Hostname и пользователь + +Для Linux B был задан hostname и создан пользователь: + +```bash +sudo hostnamectl set-hostname dolinin_gateway +sudo adduser dolinin_2 +``` +# 3.2. Настройка сети + +На машине B были обнаружены интерфейсы: + +- enp0s3 — `NAT` +- enp0s8 — `net-a` +- enp0s9 — `net-b` + +Файл /etc/netplan/00-installer-config.yaml был настроен следующим образом: +```yaml +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.4.1/24 + enp0s9: + dhcp4: false + addresses: + - 192.168.9.10/24 +``` +Применение настроек +```bash +sudo chmod 600 /etc/netplan/00-installer-config.yaml +sudo netplan apply +``` +В результате Linux B получил два адреса: + +- `192.168.4.1/24` в сети между Linux A и Linux B; +- `192.168.9.10/24` в сети между Linux B и Linux C. +## 3.3. Включение маршрутизации +Для пересылки пакетов между интерфейсами на Linux B был включён IP forwarding. +```bash +sudo nano /etc/sysctl.conf +``` +Раскомментирована строка +```bash +net.ipv4.ip_forward=1 +sudo sysctl -p +``` +## 3.4. Запуск tcpdump +Для контроля прохождения HTTP-трафика через Linux B был запущен tcpdump с фильтрацией по порту `5000`.\ +Во время выполнения запросов с Linux C на Linux A в выводе tcpdump фиксировались TCP-пакеты, проходящие через шлюз. +```bash +sudo tcpdump -i any port 5000 +``` +--- +# 4. Настройка Linux C +## 4.1. Hostname и пользователь +Для Linux C был задан hostname и создан пользователь: +```bash +sudo hostnamectl set-hostname dolinin_client +sudo adduser dolinin_3 +``` +## 4.2. Настройка сети +На машине C были обнаружены интерфейсы: +- enp0s3 — NAT +- enp0s8 — внутренняя сеть net-b\ +Файл `/etc/netplan/00-installer-config.yaml` был настроен следующим образом: +```yaml +network: + version: 2 + ethernets: + enp0s3: + dhcp4: true + enp0s8: + dhcp4: false + addresses: + - 192.168.9.100/24 + routes: + - to: 192.168.4.0/24 + via: 192.168.9.10 +``` +Применение настроек +```bash +sudo chmod 600 /etc/netplan/00-installer-config.yaml +sudo netplan apply +``` +В результате интерфейс enp0s8 получил адрес `192.168.9.100/24`, а маршрут в сеть `192.168.4.0/24` был направлен через `192.168.9.10` +## 4.3. Проверка сетевой связности +С Linux C была выполнена проверка доступности шлюза и сервера: +```bash +ping 192.168.9.10 +ping 192.168.4.10 +``` +Пакеты успешно доходили до Linux B и Linux A, что подтверждало корректность маршрутизации. +## 4.4. Отправка HTTP-запросов +С Linux C были отправлены три HTTP-запроса к серверу на Linux A с помощью curl.\ +В ответ сервер возвращал JSON-ответы, подтверждающие успешную обработку запросов. + +```bash +curl http://192.168.4.10:5000/get +``` +```bash +curl -X POST http://192.168.4.10:5000/post + -H "Content-Type: application/json" + -d '{"name":"Dolinin","lab":"1"}' +``` +```bash +curl -X PUT http://192.168.4.10:5000/put + -H "Content-Type: application/json" + -d '{"status":"updated"}' +``` +___ +# 5. Обеспечение сохранения настроек после перезагрузки +## 5.1. Сохранение сетевой конфигурации +Сетевые настройки были сохранены в файлах Netplan, поэтому после перезагрузки системы IP-адреса и маршруты применялись автоматически +## 5.3. Сохранение правил iptables +Для сохранения правил iptables после перезагрузки был установлен пакет: +```bash +sudo apt update +sudo apt install iptables-persistent -y +``` +После этого текущие правила были сохранены автоматически и восстанавливались при запуске системы. +___ +# 6. Результаты выполнения работы + +В ходе выполнения практической работы были: + +- Развернуты три виртуальные машины на Ubuntu Server 22.04; +- Настроены hostname и пользователи на каждой машине; +- Сконфигурирована сетевая схема с двумя подсетями; +- Настроена маршрутизация через промежуточную машину Linux B; +- Реализован HTTP-сервер на Flask на Linux A; +- Выполнены GET, POST и PUT-запросы с Linux C на Linux A; +- Выполнен контроль трафика на Linux B с помощью tcpdump; +- Обеспечено сохранение сетевых настроек и маршрутизации после перезагрузки. +___ +# 7. Заключение + +В результате выполнения работы были изучены базовые принципы администрирования Linux, включая настройку сети, статическую маршрутизацию, запуск сетевых сервисов, а также сохранения настроек после перезагрузки системы.