分享自己编译的TProxy模块,for USG

开启UDP转发需要的东西。用USG的3.10.20内核代码编译的,不一定适用ERLite3,但肯定不适用于ER-X。
tproxy内核模块其实edgeos系统自带,在/lib/modules/3.10.20-UBNT/kernel/net/netfilter/nf_tproxy_core.ko

但系统没有自动加载,需要自己modprobe。
需要编译的主要是iptable的module,内有两个ko,一个模块让iptable 支持 -j TPROXY。另外一个是 -j socket的模块,不需要的话可以不装。
tproxy.rar (7.51 KB)

十分感谢楼主 同用USG 正好需要这个东西

@benjaminlei 请问 /root/kernel_3.10.107_UBNT/scripts/gcc-version.sh: line 26: mips64-octeon-linux-gnu-gcc: command not found
请问这个怎么解决,有mips64-octeon-linux-gnu-gcc安装包吗?
我是在***qemu-system-mips64上编译。

soro 发表于 2018-3-11 11:53
@benjaminlei 请问 /root/kernel_3.10.107_UBNT/scripts/gcc-version.sh: line 26: mips64-octeon-linux-g …

编译kernel需要cross compile,host用Debian wheezy +octeon sdk中的 toolchain,sdk在github有下载。

@benjaminlei 也是就是想编译一下模块 TProxy,你编译3.10.20在erl3上安装不上 是版本的问题, 需要3.10.107-UBNT。
交叉编译太难了。

@benjaminlei
@benjaminlei 能否编译一个3.10.107内核(V1.10.0固件)的iptable和socket模块,谢谢。期待你的教程。

我编译的vm删掉了,已经放弃在路由上跑应用了,主要是cpu太弱了,跑一些额外的应用,吞吐量上不去。如果你需要尝试,这里有几个link,你可以看看:
github.com/Cavium-Open-Source-Distributions/OCTEON-SDK
lochnair.net/2016/09/18/cake-support-on-edgerouter-lite/

这个帖子弄明白以后,我要补充的是,在正式开始编译内核前,先用menuconfig,
原帖:
make ARCH=mips CROSS_COMPILE=mips64-octeon-linux-gnu- prepare
make ARCH=mips CROSS_COMPILE=mips64-octeon-linux-gnu- menuconfig <-----------add
make ARCH=mips CROSS_COMPILE=mips64-octeon-linux-gnu- -j2

menuconfig时,先load一下配置。然后去选中iptable的tproxy模块。然后再开始编译。

community.ubnt.com/t5/EdgeMAX/kernel-compilation/td-p/466677
还有这个帖子可以辅助参考,不过ubnt美国cmmunity需要fq。

谢谢指导,编译成功了。附上ERL3的3.10.107内核(V1.10.0固件)的iptable和socket模块TPROXY(3.10.0固件).rar (6.83 KB)

遗憾配置让dns (8.8.8.8) udp 通过这里走,没成功。其他的没试验。

#!/bin/bash 
sudo modprobe  /config/scripts/v2ray/xt_TPROXY-3.10.107-UBNT.ko
sudo iptables -t nat -A PREROUTING -p tcp -m set --match-set CROSS_WALL dst -j REDIRECT --to-port 1080
sudo    ip rule add fwmark 1 table 100
sudo    ip route add local 0.0.0.0/0 dev lo table 100
sudo iptables -t mangle -A PREROUTING -p udp -m set --match-set CROSS_WALL dst -j TPROXY --on-port 1080   --tproxy-mark 1

CROSS_WALL 是配合dnsmasq+ipset产生需要FQ的IPSET,8.8.8.8也包含其中

附上 ER4 3.10.107内核(V1.10.0固件)的iptable和socket模块xt_TPROXY-3.10.107-UBNT-for ER4.rar (3.81 KB)

@benjaminlei 另外请教
ER4的对应octeon-models是什么?
OCTEON_CN3005
OCTEON_CN3005_PASS1
OCTEON_CN3005_PASS1_1
OCTEON_CN3010
OCTEON_CN3010_PASS1
OCTEON_CN3010_PASS1_1
OCTEON_CN3020
OCTEON_CN3020_PASS1
OCTEON_CN3020_PASS1_1
OCTEON_CN31XX
OCTEON_CN31XX_PASS1
OCTEON_CN31XX_PASS1_1
OCTEON_CN36XX
OCTEON_CN36XX_PASS2
OCTEON_CN38XX
OCTEON_CN38XX_PASS2
OCTEON_CN50XX
OCTEON_CN50XX_PASS1
OCTEON_CN52XX
OCTEON_CN52XX_PASS1
OCTEON_CN54XX
OCTEON_CN54XX_PASS1
OCTEON_CN55XX
OCTEON_CN55XX_PASS1
OCTEON_CN56XX
OCTEON_CN56XX_PASS1
OCTEON_CN57XX
OCTEON_CN57XX_PASS1
OCTEON_CN58XX
OCTEON_CN58XX_PASS1
OCTEON_CN62XX
OCTEON_CN63XX
OCTEON_CN63XX_PASS1_0
OCTEON_CN63XX_PASS1_1
OCTEON_CN63XX_PASS1_2
OCTEON_CN63XX_PASS2_0
OCTEON_CN63XX_PASS2_1
OCTEON_CN63XX_PASS2_2
OCTEON_CN66XX
OCTEON_CN66XX_PASS1_0
OCTEON_CN66XX_PASS1_2
OCTEON_CN68XX
OCTEON_CN68XX_PASS1_0
OCTEON_CN68XX_PASS1_1
OCTEON_CN68XX_PASS2_0
OCTEON_CN68XX_PASS2_1
OCTEON_CN68XX_PASS2_2
OCTEON_CN60XX
OCTEON_CN61XX
OCTEON_CN61XX_PASS1_0
OCTEON_CN61XX_PASS1_1
OCTEON_CNF71XX
OCTEON_CNF71XX_PASS1_0
OCTEON_CNF71XX_PASS1_1
OCTEON_CN78XX
OCTEON_CN78XX_PASS1_0
OCTEON_CN78XX_PASS1_1
OCTEON_CN78XX_PASS2_0
OCTEON_CN70XX
OCTEON_CN70XX_PASS1_0
OCTEON_CN70XX_PASS1_1
OCTEON_CN70XX_PASS1_2
OCTEON_CN71XX
OCTEON_CN76XX
OCTEON_CN76XX_PASS1_0
OCTEON_CN76XX_PASS1_1
OCTEON_CN72XX
OCTEON_CN73XX
OCTEON_CN73XX_PASS1_0
OCTEON_CN73XX_PASS1_1
OCTEON_CNF75XX
OCTEON_CNF75XX_PASS1_0

soro 发表于 2018-3-12 17:28
@benjaminlei 另外请教
ER4的对应octeon-models是什么?
OCTEON_CN3005

看频率应该是cn71xx系列,我猜的

@benjaminlei 安装完出现这个错误:@ xt_TPROXY: Unknown symbol nf_tproxy_assign_sock (err 0)

soro@ubnt:~$ sudo dmesg | tail
NET: Registered protocol family 24
tun: Universal TUN/TAP device driver, 1.6
tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
l2tp_core: L2TP core driver, V2.0
l2tp_netlink: L2TP netlink interface
l2tp_ppp: PPPoL2TP kernel driver, V2.0
Initializing XFRM netlink socket
xt_TPROXY: Unknown symbol nf_tproxy_assign_sock (err 0)
NF_TPROXY: Transparent proxy support initialized, version 4.1.0
NF_TPROXY: Copyright (c) 2006-2007 BalaBit IT Ltd.

用的官方自带的tproxy core还是自己编译的?编译时是否同时编译了xt_socket?我上次编译时用的官方自带的tproxy core,同时编译时一块把xt_socket选上了,没这个错误。

[quote=“benjaminlei, post: 13, topic: 47100”]
benjaminlei 发表于 2018-3-12 20:39
用的官方自带的tproxy core还是自己编译的?编译时是否同时编译了xt_socket?我上次编译时用的官方自带的tp …
[/quote]@benjaminlei
用的官方自带的tproxy core还是自己编译是什么意思?
我用make *** modules 生成全部.ko后,copy出xt_TPOROYX.ko和xt_socket.ko使用。

#!/bin/bash 
sudo insmod /config/scripts/v2ray/xt_TPROXY-3.10.107-UBNT.ko
sudo iptables -t nat -A PREROUTING -p tcp -m set --match-set CROSS_WALL dst -j REDIRECT --to-port 1080
sudo    ip rule add fwmark 1 table 100
sudo    ip route add local 0.0.0.0/0 dev lo table 100
sudo iptables -t mangle -A PREROUTING -p udp -m set --match-set CROSS_WALL dst -j TPROXY --on-port 1080   --tproxy-mark 1

CROSS_WALL 是配合dnsmasq产生需要FQ的IP,8.8.8.8也包含其中

soro 发表于 2018-3-12 21:27
@benjaminlei
用的官方自带的tproxy core还是自己编译是什么意思?
我用make *** modules 生成全部.ko后 …

TPROXY由两部分组成,一个是netfilter tproxy core,ubnt firmware 自带但是并没有自动加载,名字好像叫nf_tproxy.ko,在/lib/module/下可以找到,你编译结果也应该有这个ko(依赖项)。另外一个就是xtable的插件了,xt_tproxy.ko 让iptables 支持 -j TPROXY,xt_socket是 -j socket。
你在加载xt_tproxy前,先手动加载nf_tproxy试试,看你日志是先加载xt_tproxy出错后再加载的nf_tproxy。

这个错误解决了 应该把 .ko 复制到/lib/modules/3.10.107-UBNT/kernel/net/netfilter,然后应该用modprobe xt_TPROXY安装。

谢谢,这个问题解决。
但好像不能用,我想让8.8.8.8:53的流量从这里走,但解析的都不正确。

soro 发表于 2018-3-12 22:20
谢谢,这个问题解决。

是的,最好用modprobe,modprobe自动先加载依赖ko。insmod不会自动加载依赖。
你可以test一下fq吞吐量,这颗cpu的极限是25m左右了,油管4k微卡。最后我用ubnt做策略路由,挑出特定流量,从wan2出去,到一台j1900主机处理,流量轻松100m,油管4k秒开。

如何测试udp流量?
这个设置对吗?
sudo ip rule add fwmark 1 table 100
sudo ip route add local 0.0.0.0/0 dev lo table 100
sudo iptables -t mangle -A PREROUTING -p udp -m set --match-set CROSS_WALL dst -j TPROXY --on-port 1080 --tproxy-mark 1

soro 发表于 2018-3-12 22:57
如何测试udp流量?
这个设置对吗?
sudo ip rule add fwmark 1 table 100

看上去没什么问题。chrome访问google系sites默认优先走udp(quic),就算删除tcp相关的iptables rules也能正常访问。这时油管就能测udp的速度。