maybeonly 最近的时间轴更新
maybeonly

maybeonly

V2EX 第 193338 号会员,加入于 2016-09-25 08:10:24 +08:00
maybeonly 最近回复了
@eh5
> “和很多东西冲突”

也曾考虑过这方面的问题,在真实部署中会很依赖端口选择(配置)
确实,代码本身不会利用自己已经用过的 snat 后的源端口,但是如果这些端口和其他 dnat 规则冲突,抑或被其他程序占用呢?运营商的 cgnat 没有这个问题,毕竟人家的 ip 就是专供 nat 用的。家用的话,可能不得不特别小心 dnat 的选择,以及用 ip_local_port_range 隔离了。然后发现 dnat 搭配的 hairpin 怎么办? emmmm 。。。

当时自己考虑的结果是,不得不和 conntrack 做某种程度的“交易”才能解决这个问题。
交给 conntrack 选 snat 后的源端口就没这个问题,只要识别到这个内部 ip:port 和外部 ip:port 的组合,后续不走 conntrack 按照 fullcone 的实现就好了。不仅能指定源端口,也可以实现比如针对某个 ip 实现 fullcone ,etc 。

同时被解决的另一个问题是,什么都没配置的话可以继续走系统的 conntrack ,只有配置了命中了正确的端口范围才能 fullcone 。在实践上也会是相对比较安全的。

然而咱终究是懒得 1b ,对勤奋的楼主表示深深的敬意。
@eh5
> 这个只有改了包的大小超过 MTU 时需要发回去,比如 Cilium 的 NAT64 对超过 MTU 的包就是这样的,但 einat 没改理应不需要啊。。 为什么内核没有拆包我就不知道了
理论上吓一跳链路比包“窄”就需要。虽然对于 ipv4 ,我是没见过哪个路由器是不分片而回 icmp 的(除非设置了 df )

> 正常情况下 ctrl + c 是会清 bpf 程序再退出的,可以`bpftool prog` 看一下有没有 `egress_snat` 和 `ingress_rev_snat`, 但 qdisc clsact 确实没删但也没什么大问题(主要是懒得查 qdisc 占用情况了,也不能全部删掉。。)
没有了,只是再启动会报个 warning ,并不影响正常工作的。
WARN einat: libbpf: Kernel error message: Exclusivity flag on, cannot modify
@eh5
1. 既然想着共存了,改 conntrack 确实不是好事情,不过似乎可以(部分)绕过 conntrack ?
当时考虑的是在入口和出口分别捕包,然后在出口处发现符合条件的报文后反查刚刚从入口抓过来的数据包,可能用到的匹配条件有:protocol+dst ip & port/id, length, 应该还有 ip 报文的 id 。
抓到该端口相关的东西后续由 ebpf 完成 nat ,不再经过内核。
2. 对于碎片,考虑发 icmpv6 type2 或者 icmp type3 回去?不确定能起多大作用。

由于我太懒了,以上全部都停留在设想,具体能实现到什么程度,在真实网络环境中运行咋样,以及对性能的影响,也只能说停留在设想中了。。。
p.s. ctrl+c 掉程序没有清理 tc 钩子,下次重启进程得手工删 tc 。。。

再次感谢楼主。
很多年前在本站某网友的影响下设置为 254 ,就渐渐成为习惯了
直到今天我家内网有 7 个/24 了还是这样
曾经某一天有了 v6 ,突然发现,这 192.168.0.254 是网关,那 v6 网关是多少?
1. 用 2001:db8::fe ?嗯,有点奇怪,但是其实是问题最小的。(实际上在用这个)
2. 用 2001:db8::1 ?啊,那 192.168.0.1 怎么办?
3. 用 2001:db8::ffff:ffff:ffff:fffe ?*,输入这种地址要死了。
4. 肯定有人说,用 fe80::1 呀?这个,路由没问题,但是如果需要连接到网关呢?(实际上也配置了 fe80::1 ,并不矛盾)
你看,用.1 就这些鸟问题。

有个问题是,有没有机会和现有的 ipt/nft 创建的 dnat 规则甚至 snat 结合使用呢?
有考虑过自己搓一个,用 ipt/nft 写 snat ,对于匹配某些东西的 snat 到某些特定的源端口(范围),然后在出口侧抓住这些内核 nat 过的源端口,对与这些源端口相关的报文/连接/端口进行 full cone 的……不过不知道能实现到什么程度,以及代价到底怎么样
再赞一遍。
p.s. 用 netns 测试了 v4 ,好像没有理睬用 ip l s mtu 设置的 mtu ,设置为 1480 仍然是按照 1500 拆包的
用单个 wg 的话
给自己发 4 个配置文件,然后起 4 个 wg 隧道
假如四个 wg 客户端 ip 分别是 198.51.100.1-198.51.100.4 ,接口分别是 wg1-wg4
那么可以加路由
ip r a default dev wg1 table 1001
...
ip r a default dev wg4 table 1004
然后加规则
ip ru a f 198.51.100.1 table 1001
...
ip ru a f 198.51.100.4 table 1004
然后加出口 nat 规则(可能需要适当调整一下,比如结合默认路由的 srcip )
iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.25 -j SNAT --to 198.51.100.1
iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.33 -j SNAT --to 198.51.100.2
iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to 198.51.100.3
iptables -t nat -A POSTROUTING -j SNAT --to 198.51.100.4
然后就可以把不同的连接丢到不同的 wg 上了……
必要时调整 rp_fillter 。

如果用多个 wg ,或者其他 vpn ,可以考虑类似 ecmp 的实现,或者分别随机打标签……
单个 wg 不能这么做是因为客户端地址是同一个的话,wg 这种三层 vpn 没办法路由到不同的客户端去。
确实是天天 vpn 回家,然后出国策略什么的都在家里路由器上
不过呢
家里挂了就很难受
分配 fd 开头的私网 v6 然后做 nat/snpt
39 天前
回复了 s82kd92l 创建的主题 宽带症候群 移动最近线路是不是有点炸啊
移动去什么北美
香港,新加坡,日本
它不香吗
北美的话推荐用联通
北京移动也有一批“神秘 ip”是这么处理的
实测只影响家宽和蜂窝网
idc 还是普通路由
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2802 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 65ms · UTC 11:48 · PVG 19:48 · LAX 04:48 · JFK 07:48
Developed with CodeLauncher
♥ Do have faith in what you're doing.