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 added Linux/LinuxPractice/Linux Practice.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 changes: 43 additions & 0 deletions Linux/LinuxPractice/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Введение
Данная практика посвещена базовым принципам администрирования 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
234 changes: 234 additions & 0 deletions Linux/LinuxPractice/guide/Manual.md
Original file line number Diff line number Diff line change
@@ -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 [email protected]
```

Ввести пароль при запросе.

Далее можно подключаться к виртуальной машине по ssh:
```shell
ssh -i my.key [email protected]
```

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 "<p>Hello, World!</p>"

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 <domain-name>@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/<mask> # добавляем ip адрес адаптеру
ip link set macvlan1 up # включаем адаптер
```
5. прописать маршруты у клиента А и С к их подсетям через шлюз машину В
```shell
ip route add <subnet A vm>/<mask> via <gateway ip B vm>
```
6. Также развернуть веб сервер на машине С и помощью curl получить ответ от веб сервера
7. настроить файрвол можно пожеланию (задание опциональное)
8. написать bash скрипт для каждой виртуальной машине, который повторяет действия сделанные вручную (в качестве проверке создайте заново 3 виртуалки, результат скрипта - сurl клиента принимает ответ от сервера из разных подсетей)
18 changes: 18 additions & 0 deletions Linux/LinuxPractice/vms/ubuntu_a/application/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from crypt import methods
from flask import Flask

app = Flask(__name__)

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

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

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

app.run(host='0.0.0.0', port=5000)
Original file line number Diff line number Diff line change
@@ -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
Loading