Skip to content

Latest commit

 

History

History
339 lines (241 loc) · 10.2 KB

File metadata and controls

339 lines (241 loc) · 10.2 KB

Шаг 1: создание виртуальных машин в PWD

С помощью возможностей https://labs.play-with-docker.com/ создаем три виртуальные машины при помощи нажатия ADD NEW INSTANCE(см. рис. 1).

Рисунок 1 - Три виртуальные машины в Play With Docker

Шаг 2: генерация SSH-ключа

Для подключения к виртуальным машинам по ssh необходимо сгененрировать ключ (см. рис. 2).

Рисунок 2 - Генерация ключа ssh протоколом ed25519

Подключение к виртуальным машинам происходит по командам, указанным для каждой ВМ в PWD:

  1. ssh ip172-18-0-40-cnibn7q91nsg00b8iieg@direct.labs.play-with-docker.com
  2. ssh ip172-18-0-50-cnibn7q91nsg00b8iieg@direct.labs.play-with-docker.com
  3. ssh ip172-18-0-56-cnibn7q91nsg00b8iieg@direct.labs.play-with-docker.com

Шаг 3: Настройка маршрутов

Согласно схеме, приведенной на рисунке 3, необходимо настроить сеть:

  • у Linux A и Linux C - по 1 адаптеру
  • Linux B - по 2 адаптера

Рисунок 3 - Развертка трех ВМ по заданной схеме

По заданию каждому адаптеру необходимо назначить следующие ip-адреса: Linux A : 192.168.14.10 / 24 (см. рис. 4)

Linux С : 192.168.11.100 / 24 (см. рис. 5)

Linux B_1 : 192.168.14.1 / 24 (см. рис. 6)

Linux B_2 : 192.168.11.1 / 24 (см. рис. 7)

Рисунок 4 - Создание адаптера и установка IP - адреса для Linux A

Рисунок 5 - Создание адаптера и установка IP - адреса для Linux C

Рисунок 6 - Создание 1-го адаптера и установка IP - адреса для Linux B

Рисунок 7 - Создание 2-го адаптера и установка IP - адреса для Linux B

После настройки сети на ВМ необходимо прописать маршруты у клиентов А и С к их подсетям через машину В при помощи команды: ip route add <subnet A vm>/<mask> via <gateway ip B vm> (см. рис. 8, 9).

Рисунок 8 - Настройка маршрута передачи от А к С через B

Рисунок 9 - Настройка маршрута передачи от C к A через B

Шаг 3: Настройка файрвола

На Linux B необходимо настроить файрвол таким образом, чтобы Linux B пропускал только http и только через порт 5000.

Это можно сделать при помощи tcpdump.

apk add tcpdump

tcpdump -i any -s 0 'tcp port http' -w /tmp/http.cap and 'port 5000'

После этого, послав запрос с Linux A на Linux C, через порт, например, 1234, получим следующее:

Рисунок 10 - Запрос через порт, отличный от 5000

Шаг 4: Организация клиент-серверного взаимодействия между А и С

После настройки маршрутов необходимо развернуть сервер на тачке А (врржууууух =3 ). Для этого нужно использовать библиотеку Flask (см. рис. 10)

Рисунок 11 - Установка Flask

Далее создаем файл app.py со следующим содержимым:

from flask import Flask, request

app = Flask(__name__)

data = {"username":"", "password":""}

@app.route("/")
def get_():
    return data

@app.route("/",methods = ['POST'])
def post():
    data_json=request.get_json()
    if data_json is None:
        return 'Invalid JSON data', 400

    data['username']=data_json['username']
    data['password']=data_json['password']
    print(f"Data received {data_json}")

    return [data['username'], data['password']]

@app.route("/", methods =['PUT'])
def put():
    str = request.args.get('password')
    print(f"New password received {str}")
    data['password'] = str
    return [data['username'], data['password']]

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

EOF

Запущенный сервер выглядит так:

Рисунок 12 - Сервер на машине А

Рисунок 13 - Ответ на отправленные запросы с машины С на А

Рисунок 14 - Запросы, пришедшие на сервер А

Для более упрощения работы с виртуальными машинами напишем три скрипта.

Скрипт конфигурации виртуальной машины А

#!/bin/bash
# Linux A
echo -e "Starting the MACVLAN installation\n"
ip link add macvlan1 link eth0 type macvlan mode bridge
ip address add dev macvlan1 192.168.14.10/24
ip link set macvlan1 up

echo -e "Ending the MACVLAN installation\n\n"

echo -e "Routing configuration FROM Linux A to Linux C \n\n"
ip route add 192.168.11.0/24 via 192.168.14.1

echo -e "Start to installing FLASK \n"
pip install flask
echo -e "End to installing FLASK \n\n"

echo -e "Creating web-server\n"
touch app.py
cat << EOF >app.py

from flask import Flask, request

app = Flask(__name__)

data = {"username":"", "password":""}

@app.route("/")
def get_():
    return data

# @app.route("/<number>", methods =['POST'])
# def post_(number):
#     return f"POST-request : {number}\n\n"

@app.route("/",methods = ['POST'])
def post():
    data_json=request.get_json()
    if data_json is None:
        return 'Invalid JSON data', 400

    data['username']=data_json['username']
    data['password']=data_json['password']
    print(f"Data received {data_json}")

    return [data['username'], data['password']]

@app.route("/", methods =['PUT'])
def put():
    str = request.args.get('password')
    print(f"New password received {str}")
    data['password'] = str
    return [data['username'], data['password']]

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

EOF

echo -e "Run the server\n"
python app.py

Скрипт конфигурации виртуальной машины В

#!/bin/bash
# Linux B

echo -e "Starting the first MACVLAN installation\n"
ip link add macvlan1 link eth0 type macvlan mode bridge
ip address add dev macvlan1 192.168.14.1/24
ip link set macvlan1 up
echo -e "Ending the first MACVLAN installation\n\n"

echo -e "Starting the second MACVLAN installation\n"
ip link add macvlan2 link eth0 type macvlan mode bridge
ip addres add dev macvlan2 192.168.11.1/24
ip link set macvlan2 up
echo -e "Ending the second MACVLAN installation\n\n"

echo -e "Installation tcpdump\n"
apk add tcpdump

echo -e "Configurate tcpdump (only http throw 5000 port)"

tcpdump -i any -s 0 'tcp port http' -w /tmp/http.cap and 'port 5000'

Скрипт конфигурации виртуальной машины С

#!/bin/bash
# Linux РЎ

echo -e "Starting the first MACVLAN installation\n"

ip link add macvlan1 link eth0 type macvlan mode bridge
ip address add dev macvlan1 192.168.11.100/24
ip link set macvlan1 up
ip route add 192.168.14.0/24 via 192.168.11.1

echo -e "Ending the first MACVLAN installation\n\n"

echo -e "Sending GET-request\n"
curl "http://192.168.14.10:5000/"


echo -e "Sending POST-request\n"
curl -X POST -H "Content-Type: application/json" -d' {"username":"Po","password":"xyz"}' http://192.168.14.10:5000

echo -e "\nChanging passwords \n"

curl -X PUT http://192.168.14.10:5000?password=ber453

echo -e "Sending request to incorrect port\n"
curl http://192.168.14.10:5002