Как читать TCP-пакеты в интерфейсе tun / tap?

Я работаю над простым проектом, который прослушивает интерфейс tun и изменяет пакеты, а затем повторно отправляет их на настоящий интерфейс.

Я пробовал songgao/water, pkg/tuntap и даже писал свой собственный на основе плавающего кода C, но, что бы я ни пробовал, я не могу получать TCP-пакеты (ICMP / UDP отлично работает).

Я чувствую, что упускаю что-то чрезвычайно очевидное, но я не могу понять это хоть убей ...

код:

package main

import (
    "log"
    "os"
    "os/exec"

    "golang.org/x/net/ipv4"

    "github.com/songgao/water"
)

const (
    // I use TUN interface, so only plain IP packet, no ethernet header + mtu is set to 1300
    BUFFERSIZE = 1600
    MTU        = "1300"
)

func main() {
    iface, err := water.New(water.Config{})
    fatalIf(err)

    log.Printf("tun interface: %s", iface.Name())
    runBin("/bin/ip", "link", "set", "dev", iface.Name(), "mtu", MTU)
    runBin("/bin/ip", "addr", "add", "10.2.0.10/24", "dev", iface.Name())
    runBin("/bin/ip", "link", "set", "dev", iface.Name(), "up")

    buf := make([]byte, BUFFERSIZE)

    for {
        n, err := iface.Read(buf)
        if err != nil {
            log.Fatal(err)
        }

        header, _ := ipv4.ParseHeader(buf[:n])

        log.Printf("isTCP: %v, header: %s", header.Protocol == 6, header)
    }
}

func fatalIf(err error) {
    if err != nil {
        log.Fatal(err)
    }
}

func runBin(bin string, args ...string) {
    cmd := exec.Command(bin, args...)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin
    fatalIf(cmd.Run())
}

Почему бы не использовать libpcap

stark 07.03.2020 14:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код работает у меня. Если я его запустил, то смогу увидеть TCP-пакеты после того, как инициирую какое-либо действие, связанное с TCP. В этом случае я использовал «ssh 10.2.0.11». Вот что у меня получилось:

2020/03/07 15:52:23 isTCP: false, header: ver=6 hdrlen=0 tos=0x0 totallen=0 id=0x8 flags=0x1 fragoff=0x1aff ttl=254 proto=128 cksum=0x0 src=0.0.0.0 dst=126.87.58.227
2020/03/07 15:52:27 isTCP: false, header: ver=6 hdrlen=0 tos=0x0 totallen=0 id=0x8 flags=0x1 fragoff=0x1aff ttl=254 proto=128 cksum=0x0 src=0.0.0.0 dst=126.87.58.227
2020/03/07 15:52:34 isTCP: false, header: ver=6 hdrlen=0 tos=0x0 totallen=0 id=0x8 flags=0x1 fragoff=0x1aff ttl=254 proto=128 cksum=0x0 src=0.0.0.0 dst=126.87.58.227
2020/03/07 15:52:36 isTCP: true, header: ver=4 hdrlen=20 tos=0x0 totallen=60 id=0x9cec flags=0x2 fragoff=0x0 ttl=64 proto=6 cksum=0x89b7 src=10.2.0.10 dst=10.2.0.11
2020/03/07 15:52:37 isTCP: true, header: ver=4 hdrlen=20 tos=0x0 totallen=60 id=0x9ced flags=0x2 fragoff=0x0 ttl=64 proto=6 cksum=0x89b6 src=10.2.0.10 dst=10.2.0.11
2020/03/07 15:52:39 isTCP: true, header: ver=4 hdrlen=20 tos=0x0 totallen=60 id=0x9cee flags=0x2 fragoff=0x0 ttl=64 proto=6 cksum=0x89b5 src=10.2.0.10 dst=10.2.0.11
2020/03/07 15:52:43 isTCP: true, header: ver=4 hdrlen=20 tos=0x0 totallen=60 id=0x9cef flags=0x2 fragoff=0x0 ttl=64 proto=6 cksum=0x89b4 src=10.2.0.10 dst=10.2.0.11

Как видите, TCP-клиент 10.2.0.10 пытается установить (TCP-SYN) соединение с 10.2.0.11.

Другие вопросы по теме