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
10 changes: 7 additions & 3 deletions controller/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,26 @@ all: generate build
generate:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
$(PROTO_DIR)/file_service/file_service.proto \
$(PROTO_DIR)/admin_service/admin_service.proto \
$(PROTO_DIR)/communication/communication.proto

build: generate
mkdir -p $(BIN_DIR)
go build -o $(BIN_DIR)/grpc_server ./$(GRPC_SERVER)
go build -o $(BIN_DIR)/manager ./$(MANAGER)

build-riscv:
bazel build --platforms=@rules_go//go/toolchain:linux_riscv64 //cmd/grpc_server:grpc_server
mkdir -p $(BIN_DIR)
cp -f bazel-bin/cmd/grpc_server/grpc_server_/grpc_server $(BIN_DIR)/grpc_server 2>/dev/null || cp -f bazel-bin/cmd/grpc_server/grpc_server $(BIN_DIR)/grpc_server

clean:
rm -rf $(BIN_DIR)
rm -f $(PROTO_DIR)/communication/*.pb.go
rm -f $(PROTO_DIR)/file_service/*.pb.go
rm -f $(PROTO_DIR)/admin_service/*.pb.go

run-server: build
./$(BIN_DIR)/grpc_server

run-manager: build
./$(BIN_DIR)/manager

5 changes: 3 additions & 2 deletions controller/internal/service/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,18 +77,19 @@ func (s *Service) Check(checkValue string, endpointName string) ([]int, error) {
continue
}

resp.Body.Close()

if resp.StatusCode != http.StatusOK {
resp.Body.Close()
log.Printf("Provider %s returned %s", providerName, resp.Status)
continue
}

var data map[string]interface{}
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
resp.Body.Close()
log.Printf("Error parsing response from %s: %v", providerName, err)
continue
}
resp.Body.Close()

categoryPath := provider.Endpoints[endpointName].Categories
actual, err := s.jsonParser.ExtractCategories(data, categoryPath)
Expand Down
37 changes: 32 additions & 5 deletions test/virtual_load_network/.env
Original file line number Diff line number Diff line change
@@ -1,7 +1,34 @@
NUM_HOSTS=3
SUBNET=10.0.0
GATEWAY=10.0.0.254
NUM_HOSTS_NET1=2
NUM_HOSTS_NET2=2

SUBNET1=10.0.0
SUBNET2=10.0.1
GATEWAY1=10.0.0.254
GATEWAY2=10.0.1.254
BRIDGE1=br-testnet1
BRIDGE2=br-testnet2
DNS=8.8.8.8
FILTER_PATH=../../worker/main-x86-virt
BRIDGE_IFACE=br-testnet

SUBNET1_V6=fd00:1::
SUBNET2_V6=fd00:2::
DNS_V6=2001:4860:4860::8888

INET_SUBNET=10.0.3
INET_BRIDGE=br-inet
INET_SUBNET_V6=fd00:b::

MGMT_SUBNET=10.0.2
MGMT_BRIDGE=br-mgmt
MGMT_SUBNET_V6=fd00:a::

YOCTO_DEPLOY_DIR=/home/lespend/program/yadro/vm_build_risc_v/qemu/poky/build/tmp/deploy/images/qemuriscv64
QEMU_ROOTFS=${YOCTO_DEPLOY_DIR}/cluster-image-qemuriscv64.rootfs.ext4
QEMU_KERNEL=${YOCTO_DEPLOY_DIR}/Image
QEMU_BIOS=${YOCTO_DEPLOY_DIR}/fw_jump.elf
QEMU_MEMORY=4G
QEMU_CPUS=2

FILTER_RISCV_BIN=../../worker/main-riscv
CONTROLLER_BIN=../../controller/bazel-bin/cmd/grpc_server/grpc_server_/grpc_server

HUGEPAGES=1024
2 changes: 1 addition & 1 deletion test/virtual_load_network/Dockerfile.traffic-gen
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FROM alpine:3.20

RUN apk add --no-cache curl bash
RUN apk add --no-cache curl bash iproute2

COPY ./scripts/traffic-gen.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
Expand Down
25 changes: 25 additions & 0 deletions test/virtual_load_network/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
SCRIPTS_DIR = scripts
WORKER_DIR = ../../worker
CONTROLLER_DIR = ../../controller

.PHONY: run stop logs build build-worker build-controller clean-vms

run: build
sudo $(SCRIPTS_DIR)/start.sh

stop:
sudo $(SCRIPTS_DIR)/stop.sh

logs:
@sudo bash -c 'while true; do clear; cat shared/filter1.log 2>/dev/null | tail -10; echo "---"; cat shared/filter2.log 2>/dev/null | tail -10; echo "---"; cat shared/controller.log 2>/dev/null | tail -5; sleep 2; done'

build: build-worker build-controller

build-worker:
cd $(WORKER_DIR) && bazel build --config=riscv64 //:worker

build-controller:
$(MAKE) -C $(CONTROLLER_DIR) build-riscv
Comment on lines +18 to +22

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Очевидно не хватает зависимостей по файлам


clean-vms:
rm -f filter1.qcow2 filter2.qcow2 controller.qcow2
86 changes: 55 additions & 31 deletions test/virtual_load_network/README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,74 @@
# Тестовый стенд виртуальной нагрузки
# Виртуальный тестовый стенд

## Установка
## Что необходимо сделать
- [x] Настроить топологию сети и виртуальные машины
- [x] Добавить кросс-компиляцию controller под RISC-V
- [x] Добaвить кросс-компиляцию dpdk библиотеки
- [x] На данный момент используется Docker контейнер внутри которого билдиться библиотека. Это медленно (минут 50, но делается один раз)
- [ ] (\*) По хорошему необходимо создать отдельный sysroot с помощью Yocto Project внутри которого будем билдить
- [x] Запуск фильтров и контроллера
- [x] Запуск фильтров происходит через ssh подключение и прописывание вручную комманды
- [ ] (\*) По хорошему необходимо сделать запуск через systemd
- [ ] Взаимодействие controller и worker, пока не сделано:
- [ ] Кросс компиляция worker вместе с dpdk-filter. На данный момент билдиться только сам dpdk-filter

### DPDK
```sh
sudo apt-get install -y meson ninja-build python3-pyelftools libbpf-dev
git clone https://github.com/DPDK/dpdk.git
cd dpdk
meson setup -Denable_drivers=net/af_xdp,net/tap build
ninja -C build
sudo ninja -C build install
```
## Подготовка

### Компиляция worker
### Создание RISC-V образа
```sh
cd worker
make -f Makefile.main_x86 virt
sudo scripts/create_image.sh
```

Пока скрипт из test-image переписан только под arch linux. Надо переписать его под ubuntu и запускать внутри docker контейнера

Подробности: `wiki/using_test_image.md`

## Конфигурация

Параметры задаются в `.env`:
Параметры в `.env`:

| Переменная | По умолчанию | Описание |
|---------------|---------------------------|----------------------------------|
| NUM_HOSTS | 3 | Количество генераторов трафика |
| SUBNET | 10.0.0 | Подсеть (первые 3 октета) |
| GATEWAY | 10.0.0.254 | Адрес шлюза |
| DNS | 8.8.8.8 | DNS для контейнеров |
| FILTER_PATH | ../../worker/main-x86-virt| Путь до бинаря фильтра |
| HUGEPAGES | 1024 | Количество hugepages |
| Переменная | По умолчанию | Описание |
|------------------|----------------------|-----------------------------------|
| NUM_HOSTS_NET1 | 2 | Генераторов в сети 1 |
| NUM_HOSTS_NET2 | 2 | Генераторов в сети 2 |
| SUBNET1 | 10.0.0 | Подсеть 1 |
| SUBNET2 | 10.0.1 | Подсеть 2 |
| MGMT_SUBNET | 10.0.2 | Управляющая подсеть |
| QEMU_IMAGE | ubuntu-...riscv64.img| Путь к RISC-V образу |
| QEMU_MEMORY | 4G | RAM на каждую VM |
| QEMU_CPUS | 2 | CPU на каждую VM |
| FILTER_RISCV_BIN | ../../worker/main-riscv-virt | Путь к бинарю фильтра |
| CONTROLLER_BIN | ../../controller/bin/grpc_server | Путь к контроллеру |
| HUGEPAGES | 1024 | Количество hugepages |

## Запуск

Виртуальные машины и сеть:
```sh
cd test/virtual_load_network
sudo scripts/start.sh
make run
```

Запуск фильтров осуществляется через подлкючение по ssh:
```
# for filter1
ssh-keygen -R 10.0.2.1
ssh ubuntu@10.0.2.1
# password ubuntu
# in VM:
sudo rm -rf /var/run/dpdk /dev/hugepages/rtemap_*
sudo LIBXDP_OBJECT_PATH=/usr/lib/riscv64-linux-gnu/bpf LD_LIBRARY_PATH=/mnt/lib /mnt/filter --no-pci --iova-mode=va -d /mnt/lib/librte_net_af_xdp.so -d /mnt/lib/librte_net_tap.so --

Скрипт выполняет:
1. Настройку hugepages
2. Запуск контейнеров-генераторов через `docker compose`
3. Создание veth пары и tc mirroring на bridge compose-сети
4. Настройку NAT
5. Запуск DPDK фильтра
# Also for filter2
ssh-keygen -R 10.0.2.2
ssh ubuntu@10.0.2.2
# password ubuntu
# in VM:
sudo rm -rf /var/run/dpdk /dev/hugepages/rtemap_*
sudo LIBXDP_OBJECT_PATH=/usr/lib/riscv64-linux-gnu/bpf LD_LIBRARY_PATH=/mnt/lib /mnt/filter --no-pci --iova-mode=va -d /mnt/lib/librte_net_af_xdp.so -d /mnt/lib/librte_net_tap.so --
```

## Остановка
```sh
sudo scripts/stop.sh
make stop
```
1 change: 1 addition & 0 deletions test/virtual_load_network/configs/controller.env

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опять ключ попал в код

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
KASPERSKY_API_KEY=wyo915OXTCe5stpLCtc5Ww==
15 changes: 15 additions & 0 deletions test/virtual_load_network/configs/policy.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[global.rules]
block_categories = ["adult", "malware"]
block_domains = ["example.com", "blocked-site.com"]
allow_domains = ["google.com", "github.com"]
min_trust_level = 50

[global.rules.block_by_trust]
dangerous = 10
suspicious = 30

[filters.filter_1]
block_domains = ["extra-blocked.com"]

[filters.filter_2]
allow_domains = ["extra-allowed.com"]
5 changes: 5 additions & 0 deletions test/virtual_load_network/configs/worker.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CONTROLLER_GRPC_ADDR=10.0.2.3:50051
METRICS_GATEWAY_ADDRESS=10.0.2.254
METRICS_GATEWAY_PORT=9091
DPDK_PORT_IN=eth0
DPDK_PORT_OUT=eth1
79 changes: 72 additions & 7 deletions test/virtual_load_network/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,25 +1,90 @@
services:
traffic-gen:
traffic-gen-1:
build:
context: .
dockerfile: Dockerfile.traffic-gen
networks:
- testnet
- testnet1
cap_add:
- NET_ADMIN
dns:
- ${DNS:-8.8.8.8}
- ${DNS_V6:-2001:4860:4860::8888}
deploy:
replicas: ${NUM_HOSTS:-3}
replicas: ${NUM_HOSTS_NET1:-2}
restart: unless-stopped

traffic-gen-2:
build:
context: .
dockerfile: Dockerfile.traffic-gen
networks:
- testnet2
cap_add:
- NET_ADMIN
dns:
- ${DNS:-8.8.8.8}
- ${DNS_V6:-2001:4860:4860::8888}
deploy:
replicas: ${NUM_HOSTS_NET2:-2}
restart: unless-stopped

pushgateway:
image: prom/pushgateway:latest
ports:
- "9091:9091"
restart: unless-stopped

prometheus:
image: prom/prometheus:latest
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
ports:
- "9090:9090"
depends_on:
- pushgateway
restart: unless-stopped

grafana:
image: grafana/grafana:latest
volumes:
- ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro
- grafana-data:/var/lib/grafana
ports:
- "3000:3000"
environment:
GF_AUTH_ANONYMOUS_ENABLED: "true"
GF_AUTH_ANONYMOUS_ORG_ROLE: "Admin"
depends_on:
- prometheus
restart: unless-stopped

networks:
testnet:
testnet1:
driver: bridge
enable_ipv6: true
driver_opts:
com.docker.network.bridge.name: "br-testnet1"
com.docker.network.bridge.enable_ip_masquerade: "false"
ipam:
config:
- subnet: ${SUBNET1:-10.0.0}.0/24
gateway: ${SUBNET1:-10.0.0}.254
- subnet: ${SUBNET1_V6:-fd00:1::}0/64
gateway: ${SUBNET1_V6:-fd00:1::}ff

testnet2:
driver: bridge
enable_ipv6: true
driver_opts:
com.docker.network.bridge.name: "br-testnet"
com.docker.network.bridge.name: "br-testnet2"
com.docker.network.bridge.enable_ip_masquerade: "false"
ipam:
config:
- subnet: ${SUBNET:-10.0.0}.0/24
gateway: ${GATEWAY:-10.0.0.254}
- subnet: ${SUBNET2:-10.0.1}.0/24
gateway: ${SUBNET2:-10.0.1}.254
- subnet: ${SUBNET2_V6:-fd00:2::}0/64
gateway: ${SUBNET2_V6:-fd00:2::}ff

volumes:
grafana-data:
Loading
Loading