- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
Originally asked here: https://networkengineering.stackexchange.com/questions/56278/not-able-to-forward-traffic-from-tun-interface-to-lo
我正在编写一个小型 VPN 服务器,其中对于某个 IP 地址,我通过 http 代理
传递流量。
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
1.2.3.4
,我将其目标更新为 127.0.0.1
并将目标端口更新为 12345
。 TCP
和 IP
层的校验和source_ip
和source_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
lo
或 eth0
均未显示 --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/
这个问题在这里已经有了答案: Calculating mid in binary search (13 个回答) 关闭8年前。 我正在阅读二进制搜索...我知道查找中间值的传统方法就像 mid=(hi
我有一个大的 numpy 数组 k,形状未指定,我想构造一个相同形状的数组 d 当 中的相应条目时为 1.0 k 介于两个常量 lo 和 hi 之间,否则为 0.0。 (由于更大的代码在做什么,我不想
我正在尝试找出 Unicode 类别的基数,如 Lo。看来我找不到关于那个的权威信息。例如。 Fileformat.info维护此类别中有 11788 个字符的 View ,Codepoints.ne
假设我有一个像这样的对象数组 var outer = [ { "name": "T1", "inner": [ { "type": "DAY"
下面的代码是流行线段树代码的略微修改版本。 我的问题是为什么我们需要在递归构建树时进行 lo > hi 检查,我想不出一个 lo 永远大于 hi 的例子,因为在任何时候它们都等于 [2,2]递归不会更
算法如下: sort(A) quicksort(A, 0, n-1) end quicksort(A, lo, hi) if lo < hi then pi = partition(A
我现在在 Lo-Dash 文档站点上花了几个小时,但找不到解决我的问题的方法。不知道怎么叫,所以有点难找。我基本上想将一个数组分组到一个对象中,以便重复的条目是一个字段,而不同的条目是一个数组。 例如
看一眼 Lo-Dash 文档就会发现 API 属于以下类别: 数组, 链接, 收藏, 函数, 对象, 实用程序, 方法, 和属性 对 Arrays API 的更详细了解显示了大约 30 种适用于数组的
我知道 .so 文件是类似于 Windows 中的 .dll 文件的共享库文件,但是 .lo 文件呢? 最佳答案 .o object (contains compiled code)
如何使用 Lo Dash 使用大于和小于来过滤数组? 使用 Lo Dash 的 _.find demo data : var users = [ { 'user': 'barney', 'ag
我有一个来自推送项目的数组,当我使用 Lo-Dash 显示时,它按升序显示。 这是我的代码: Sorted Array // Sample array. var array = []; // Uti
是否有现有的方法可以在 ORMLite 中为我的 id 生成实现 HI/LO 算法? 我决定从 NHibernate 切换到 ORMLite,并且宁愿不使用 AutoIncrement 或 GUID。
我是 Java 编程新手,正在学习大学类(class),其中的作业是创建一个高/低猜谜游戏。游戏为用户提供最多 5 次尝试输入 1 到 100(含)之间的数字的机会。程序必须提供答案是否太低、太高或正
我有一个高低 ID 生成器,我在多线程环境中使用它。每个线程每秒最多可以调用生成器 100k 次 我有一个相当好的(而且安全的)实现,效果很好。 IdAllocator 是获取下一个“批处理”id 的
#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #define
我有一个经过简化的数据集: var data = [{ size: 400 }, { size: 500 }, { size: 800 }, { size: 400 }
我有两个对象 A 和 B。我想知道它们是否共享 key x 和 y。 我是这样写的: function sharesKeys(keys, objA, objB) { return _.ever
我在使用 Lo-Dash 合并两个对象时遇到问题并且不明白为什么下面的代码不起作用。我希望 _merge 调用用 fnaaa 扩展 bbb,但这并没有发生。 my={}; my.aaa=functio
如果我有类似的东西 var obj = [{keywords: "a, b, c"}, {keywords: "d, e, f"}] 然后做 var result = _.pluck(obj, 'ke
我有下面的内联汇编代码。我在存在 %hi、%lo 的每一行收到编译错误“错误:无效的‘asm’:%-字母后缺少操作数”。 void func() { __asm__ ( "lis %%r4,
我是一名优秀的程序员,十分优秀!