Go net .DialUDP интерфейс автоматического выбора обратной связи - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть потребность отправить некоторые UDP-пакеты от eth0 на хосте к себе, также на eth0.

У меня есть некоторый рабочий код Go, но он использует интерфейс обратной связи вместо eth0, как и ожидалось.

package main

import (
    "net"
)

func main() {
    ip := net.ParseIP("192.168.1.158")

    src := net.UDPAddr{IP: ip, Port: 8888,}
    dest := net.UDPAddr{IP: ip, Port: 88}

    conn, _ := net.DialUDP("udp", &src, &dest)

    conn.Write([]byte("hi"))
}

192.168.1.158 - это основной и единственный IP-адрес для интерфейса на моей машине.

Выполнение следующей команды показывает мне traffi c:

sudo tcpdump udp -v -i lo

Однако я ожидал бы, что трафик c будет связан с системным интерфейсом с IP-адресом, который я определил.

Я пропустил здесь шаг?

Я также попробовал этот немного другой подход, но с теми же результатами:

src, _ := net.ResolveUDPAddr("udp", "192.168.1.158:8888")
dest, _ := net.ResolveUDPAddr("udp", "192.168.1.158:88")

1 Ответ

1 голос
/ 25 февраля 2020

Однако я ожидаю, что трафик c будет связан с системным интерфейсом с заданным IP-адресом.

Это просто неверное ожидание, не связанное с Go.

Просто попробуйте ping 192.168.1.158 и проверьте с помощью tcpdump -i lo -n icmp против tcpdump -i eth0 -n icmp, где фактически передаются данные. Вы увидите, что пакеты передаются по интерфейсу lo. Аналогично ip route get 192.168.1.158 покажет вам, что маршрут к вашему локальному адресу проходит через интерфейс lo.

...