Почему добавление установленного сокета TCP к карте BPF_MAP_TYPE_SOCKMAP нарушает SSL? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть следующая программа BPF:

#include <uapi/linux/bpf.h>
#include <linux/version.h>

#include "bpf_helpers.h"
#include "bpf_map.h"

struct bpf_map_def SEC("maps/sock_ops") sock_ops = {
    .type = BPF_MAP_TYPE_SOCKMAP,
    .key_size = sizeof(int),
    .value_size = sizeof(unsigned int),
    .max_entries = 2,
    .pinning = 0,
    .namespace = "",
};

SEC("cgroup/sock_ops/sock_map_update")
int sock_ops_sock_map_update(struct bpf_sock_ops *ops)
{
    int op;
    op = (int) ops->op;

    if (op == BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB || op == BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) {
        uint32_t idx = 0;
        bpf_sock_map_update(ops, &sock_ops, &idx, BPF_ANY);
    }

    return 0;
}

char _license[] SEC("license") = "GPL";
u32 _version SEC("version") = LINUX_VERSION_CODE;

Все, что он делает, это добавляет установленные сокеты TCP в sock_ops sockmap . Затем я загружаю эту программу как BPF_PROG_TYPE_SOCK_OPS программу, присоединяю ее к cgroup v2 и запускаю оболочку в этой cgroup.

Однако, похоже, это нарушает SSL:

$ curl https://www.google.com/
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.google.com:443

HTTP работает как положено:

$ curl http://www.google.com/
<!doctype html><html...

Почему это?

uname -a: Linux ubuntu-bionic 4.18.0-16-generic # 17 ~ 18.04.1-Ubuntu SMP Вт 12 февраля 13:35:51 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux

...