Как использовать 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