Как использовать VPN(pptp) с пакетом golang net?

Я связал несколько vpn на сервере, который является ppp0 ~ ppp4. Теперь возникает проблема. Я хочу начать 5 этапов, каждый из которых использует сетевой интерфейс различий.
proc0 -> ppp0
proc1 -> ppp1
proc2 -> ppp2
proc3 -> ppp3
proc4 -> ppp4
Теперь я узнаю, как это сделать с языком c. Просто используйте setsockopt с параметром SO_BINDTODEVICE. Но как это сделать с сетевым пакетом в golang?

1 ответ

Вы, вероятно, хотите net.Interfaces() получить кусочек net.Interface() представляющих сетевые интерфейсы в вашей системе, или, как вы знаете имена интерфейсов, вы можете использовать net.InterfaceByName() чтобы получить конкретный net.Interface,

ppp0, err := net.InterfaceByName("ppp0")

Вы можете позвонить Interface.Addrs() на возвращенный net.Interface и получить IP-адрес (а) интерфейса.

addrs, err := ppp0.Addrs()

Затем вы можете использовать нужный адрес в остальной части вашего кода (возможно, используя net.ListenIP или же net.DialIP,

addr, err := net.ResolveIPAddr("ip4", addrs[0])
// check err
conn, err := net.ListenIP("ip4:pptp", addr)
// check err, then do stuff with conn

Что касается одновременного выполнения нескольких интерфейсов, вы можете запустить программу для каждого слушателя / интерфейса и переместить трафик по каналам, но это действительно зависит от того, что вы хотите сделать. (Вы просто регистрируете данные, отправляете данные, изменяете данные и т. д.)

LocalAddr номеронабирателя не работает для интерфейсов ppp, мы должны установить SOL_SOCKET флаг для сокета, используя setsockopt, для Go 1.11+ вы можете создать звонилку, как это

    dialer := net.Dialer{
        Control: func(network, address string, c syscall.RawConn) error {
            return c.Control(func(fd uintptr) {
                err := syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, 25, "ppp0")
                if err != nil {
                    log.Printf("control: %s", err)
                    return
                }
            })
        },
    }
    // use the dialer
Другие вопросы по тегам