gpt4 book ai didi

go - 无法将流量从 `tun` 接口(interface)转发到 `lo`

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:29 25 4
gpt4 key购买 nike

Originally asked here: https://networkengineering.stackexchange.com/questions/56278/not-able-to-forward-traffic-from-tun-interface-to-lo

我正在编写一个小型 VPN 服务器,其中对于某个 IP 地址,我通过 http 代理 传递流量。

当前设置

  • TUN 接口(interface)已启动并运行在 10.0.2.0/24

iptables 配置

  • iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
  • iptables -t nat -A POSTROUTING -j MASQUERADE

VPN逻辑

  • 当我收到一个发往某个地址的 IP 数据包时,例如 1.2.3.4,我将其目标更新为 127.0.0.1 并将目标端口更新为 12345
  • 我重新计算了 TCPIP 层的校验和

代码

  • 我使用 gopackets 解析 IP 层和 TCP 层
  • 更新目标端口和ip地址
  • 在应用层创建一个NAT入口,这样我就可以把响应包中的source_ipsource_port改回来
// Code to receive packet from tun interface

pkt := gopacket.NewPacket(packet, layers.LayerTypeIPv4, gopacket.DecodeOptions{
NoCopy: true,
Lazy: false,
})
if ntPkt := pkt.NetworkLayer().(*layers.IPv4); ntPkt != nil {
var err error
if tPkt := pkt.TransportLayer().(*layers.TCP); tPkt != nil {
// Adding NAT entry
h.nLock.RLock()
hash := fmt.Sprintf("%s:%d", waterutil.IPv4Source(packet).String(), waterutil.IPv4SourcePort(packet))
if _, ok := h.natTable[hash]; !ok {
h.nLock.RUnlock()
h.nLock.Lock()
h.natTable[hash] = net.TCPAddr{IP: waterutil.IPv4Destination(packet), Port: int(waterutil.IPv4DestinationPort(packet))}
h.nLock.Unlock()
} else {
h.nLock.RUnlock()
}
buf := gopacket.NewSerializeBuffer()
ntPkt.DstIP = h.proxyIP
tPkt.DstPort = layers.TCPPort(h.proxyPort)
tPkt.SetNetworkLayerForChecksum(ntPkt)
err = gopacket.SerializeLayers(buf, h.opts,
ntPkt,
tPkt)
if err != nil {
logger.E("Error while serializing, skipping the changes", err)
return nil
}
copy(packet, buf.Bytes())
}
}

// Code to write packet onto tun interface

预期输出

  • 来自 tun0 的流量将被转发到 eth0(即使我不添加该 iptable 条目,默认路由也会做同样的事情)
  • eth0 将知道 lo 地址,因此会将数据包转发到环回地址,并最终转发到在本地主机上运行的代理

实际输出

  • 数据包在中间丢失
  • tshark -i tun0 显示从 tun0
  • 发出的数据包
2419 279.256438200     10.0.2.3 ? 127.0.0.1    TCP 60 [TCP Retransmission] 47129 ? 12345 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1 TSval=550203836 TSecr=0 WS=256
  • loeth0 均未显示 --dport 12345 的相应条目。

最佳答案

发现问题:

  • 网络配置正常。
  • go代码序列化报文错误

  • 错误代码

err = gopacket.SerializeLayers(buf, h.opts,
ntPkt,
tPkt)
err = gopacket.SerializePacket(buf, h.opts, pkt)                

关于go - 无法将流量从 `tun` 接口(interface)转发到 `lo`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54290037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com