分类 有线网络 下的文章

RouterOS单系统实现透明网关

20231218更新:优化hysteria启动脚本。

自从接触mikrotik公司的RouterOS系统以来,一直都想以routeros单系统实现内外网自动分流、dns防污染的透明网关。
由于routeros是商业公司开发的闭源路由系统,虽然是基于linux内核,但是并不像openwrt一样可以安装任意软件。
所以在v6版本时代尝试过ipsec、ipip、gre隧道等方式穿墙,效果并不是很好,要么会受到墙的干扰,要么运营商qos太厉害,
要么协议本身限制再公网跑不起速度来。

所以引入了openwrt旁路由,routeros导入国内IP地址表,通过rooting mark的方式实现国内外IP地址分流,把国外IP地址转发给openwrt,openwrt通过ssr+或者passwall等使用ss、ssr、trojen、vless、hysteria等穿墙协议实现国外流量送出墙。

由于openwrt自身的复杂、开源软件质量,以及编译时的细节选项的各种问题,导致openwrt并不是十分稳定,且排查较为困难。
一直认为使用openwrt作为旁路由并不完美。后来routeros系统增加了wireguard,选择合适线路的vps后,可以实现勉强能做到单系统的透明网关,但是最近一段时间wireguard被墙阻断越来越严重,更换端口勉强能用几天。
再后来routeros内置了容器功能,极大的增大了发挥空间,虽然是个严重严格的容器功能。

通过以容器方式起mosdns实现了dns防污染、IPv4和IPv6自定义优先级等功能。
最近研究了一些前人的教程方法后,实现了容器内clash、sing-box、hysteria等程序路由功能。

RouterOS容器实现路由方式穿墙的方法,以hysteria这个简单程序为例。
1,通过hub.docker.com远程仓库拉去镜像或者导入tar文件方式创建容器。
以tar文件方式为例
电脑安装docker desktop并启动
命令行

docker pull alpine
docker save -o alpine.tar alipine

如果routeros是arm版的话

docker pull alpine@sha256:30e6d35703c578ee703230b9dc87ada2ba958c1928615ac8a674fcbbcbb0f281
#sha256:30e6d35703c578ee703230b9dc87ada2ba958c1928615ac8a674fcbbcbb0f281可在docker hub的网页上找到

2,然后把tar文件上传到routeros,建议开启smb功能,通过smb新建的文件权限比sftp或者scp要高
3,然后是创建容器,详细参考官方文档
创建完后,修改cmd属性

tail -f /dev/null

然后启动容器
4,通过shell 0 容器编号进入容器字符界面
使用wget命令下载hysteria,并解压
创建hysteria的配置文件,供参考,以服务端配置为准

{
  "insecure": true,
  "protocol": "wechat-video",
  "down_mbps": 330,
  "server": "x.x.x.x:x",
  "tun": {
  "name": "tun0"
  },
  "auth_str": "xxxx",
  "disable_mtu_discovery": false,
  "up_mbps": 110,
  "alpn": "h3",
  "server_name": "wechat.com"
}

5,然后创建tun

apk update
apk add iproute2
ip tuntap add mode tun dev tun0
ip addr add 198.18.0.1/15 dev tun0
ip link set dev tun0 up

6,修改路由,可以通过修改默认路由metric方式
假设 eth0 是原本的网卡,网关地址为 192.168.1.1,x.x.x.x是vps的IP地址

ip route del default
ip route add default via 198.18.0.1 dev tun0 metric 1
ip route add default via 192.168.1.1 dev eth0 metric 10
ip route add 192.168.0.0/16 via 192.168.1.1
ip route add 10.0.0.0/8 via 192.168.1.1
ip route add x.x.x.x via 192.168.1.1

也可以通分解0.0.0.0/0方式添加路由

ip route add 0.0.0.0/1 via 198.18.0.1
ip route add 128.0.0.0/1 via 198.18.0.1
ip route add 192.168.0.0/16 via 192.168.1.1
ip route add 10.0.0.0/8 via 192.168.1.1
ip route add x.x.x.x via 192.168.1.1

7,退出容器,停止容器
修改容器cmd参数

/root/hysteria client --config /root/hk.json

启动容器
8,配置routeros转发国外流量给容器,参考Routeros V7配置策略路由

9,容器内hysteia一键启动脚本start.sh

#!/bin/sh
GW="192.168.1.1"
cp /hysteria/hysteria /bin/
ip route replace 10.0.0.0/8 via $GW
ip route replace 192.168.0.0/16 via $GW
awk -F'"|:' '/"server"/ {cmd="ip route replace "$5" via '$GW'";system(cmd)}' /hysteria/$1
sleep 2&&ip addr add 198.18.0.1 dev tun0&&ip link set dev tun0 up&&ip route replace default via 198.18.0.1 &
exec hysteria client --config /hysteria/$1

在routeros上传hysteria可执行文件、hysteria配置文件和上面启动脚本到/container/etc/hysteria里
routeros新建容器命令

/container/mounts add name="hysteria" src="/container/etc/hysteria" dst="/hysteria"
/container add file=container/tmp/alpine_v3.18.2.tar interface=container-hysteria hostname=hysteria mounts=hysteria root-dir=container/root-dir/hysteria cmd="sh /hysteria/start.sh hk.json" start-on-boot=yes
/container start [find hostname=hysteria]

说明
由于routeros的容器功能细节一直在变动,有时候上一个版本还能使用,更新之后容器就不能启动了,而且日志一点信息都没有,所以采取了最保守的方式手动配置容器内应用的方式。
容器的网卡配置既不在容器内部存储,也不在routeros的veth里存储,似乎在一个容器外部不可见的地方,只能在容器内部操作,删除重建容器使用原来veth发现原有tun、静态路由居然还在。在routeros里修改veth的ip地址,居然不会同步修改容器内IP地址。
7.6版能启动的openwrt容器,新版就不能启动,一点日志都没有。
之前容器内可以写入mount的目录,新版就没有写权限,也没有执行权限,虽然容器内显示有权限。

也研究了tinyserve的bird+clash容器实现ospf动态路由透明网关方式,他使用了s6在容器内看护了几个应用,导致容器内存需求较大,小于4G内存的就别测试了。我使用rb5009,内存只有1gb,遇到routeros内存不足重启的问题。
动态路由这种透明网关方式早在ssr出现之前就有人提出,使用树莓派上跑bird+ss实现,但是我一直觉得一旦穿墙失效,所有数据包都会被运营商和墙捕捉到,为了高可用牺牲安全性不太值得,所以一直没用。

windows单网卡实现802.1x认证的有线网络共享

以下内容仅适合我的特殊网络情况,仅供参考。

公司使用的是标准802.1x有线互联网认证,认证策略是PEAP/EAP-MSCHAPv2(不验证认证服务器证书)。这种认证策略在桌面操作系统支持的比较好,windows、mac、ubuntu都没有问题,但是在品牌路由器上能很好支持的基本没有。以linux为基础的vyos可以使用linux软件间接实现,openwrt同理,routeros声称可以支持,但是认证策略是PEAP时需要CA证书验证服务器身份切不能关闭,所以routeros也不行。

想使用网络共享是为了给手机wifi,笔记本本来是有移动热点功能的,结果intel的ax200无线网卡与iphone等设备有兼容性问题(表现为wifi连接成功, 不能获取IP地址),且只能使用2.4g频段(可以通过连接5gwifi后再共享的方式破解限制)。

中间使用过usb网卡共享网络给路由器,结果usb网卡在windows下稳定性太差,经常使用一段时间后就消失,只能重启恢复。

最终方案是,笔记本电脑网卡开启vlan功能,一根网线两个vlan,一个vlan走802.1x认证,另一个vlan共享网络。

设备:机械革命CODE01笔记本(realtek有线网卡),路由器mikrotik hap ac2(routeros v7.1beta6)

下载并安装Realtek Ethernet Diagnostic Utility,启用网卡vlan功能,创建vlan10和vlan20分别用于802.1x认证和网络共享。启用vlan后会虚拟出两个网卡,分别对应vlan10 和vlan20,在Utility中修改vlan10虚拟网卡的mac地址为物理网卡mac地址(802.1x绑定了mac地址、用户名和密码)。

routeros使用交换芯片的硬vlan,软vlan经过测试有问题(也可能配置有问题)

/interface/ethernet/switch/vlan
/interface/ethernet/switch/port
/interface/bridge/vlan
/interface/vlan
/ip/address/

routeros配置待完善。

联想M920x与英特尔X710-DA4组建万兆迷你服务器

前段时间分享了联想thinkcentre M920x与Intel X710-T4组建万兆迷你服务器,用的网卡是4个万兆电口的X710-T4,由于最近打算更换核心交换机,换成mikrotik的全光口40gbps交换机CRS326-24S+2Q+RM,所以M920x更换了4光口的万兆网卡X710-DA4。
由于联想官方没有支持四光口的网卡自然也不会有对应的挡板,所以对原配的vga挡板做了魔改。

先上成品图,总体还是比较满意,切割挡板的适合稍微有点歪,但是不影响使用。
back
内部如图
inside
原挡板
original
魔改挡板
modified

已经测试一周,目前还是比较稳定,X710-DA4由于没有了phy芯片热量少了很多。

软件系统:
底层系统:esxi
软路由系统:routeros v7,v7系统现在还在beta阶段,详见RouterOS V7 测试(持续更新至正式版发布)
应用操作系统:ubuntu

网络拓扑图待更新

ps:联想tiny系列迷你主机各个型号对比
M720Q主板B360
M920Q主板Q370,单m.2 SSD,支持雷电扩展卡
M920X主板Q370,双m.2 SSD,支持雷电扩展卡,支持标准电压CPU(不带T的65w tdp),支持AMD RX560独立显卡
P330主板Q370,双m.2 SSD,支持雷电扩展卡,支持标准电压CPU(不带T的65w tdp,支持vPro CPU),支持NVIDIA P620/P1000独立显卡

40Gbps交换机CRS326-24S+2Q+RM开箱及拆解

mikrotik 2019年底发布了他家最高带宽交换机CRS326-24S+2Q+RM,24个10gbps的sfp+口,2个40gbps的qsfp+口
45度照
正面
背面
内部
此交换机配置了三个4cm的三线高转速风速,短期观察有四档温度调节,停转,电压6v低速3k转,9v中速4k转,12v高速6k转,噪音较大,这里更换了猫扇NF-A4x20 PWM,主板风扇接口是4口,而且手上没有NF-A4x20 FLX,所以就直接用了pwm的,短暂测试没有发现问题,系统也可以看到转速。
风扇
风扇
同时购入了两个sfp+转万兆电口模块S+RJ10
万兆电口模块
预计此交换机将替代现在的xs716t成为我的核心交换机

群晖FS1018升级4万兆网络

最近看各位up主纷纷升级了万兆,并且mikrotik新出了40gbps的交换机,我也升级一下我的全固态nas。
我的synology全固态nas FS1018原本用的网卡是x710-da2,这次升级成为xl710-qda2,intel 的40gbps网卡,100gbps的话就需要mellanox的了,intel目前还没有,而且mellanox便宜的二手卡大部分是InfiniBand网卡而不是以太网卡。
群晖FS1018使用的是两张pcie x4转接的12个sata,xl710-qda2使用的是pcie-3.0 x8的接口,按接口来说足够4000MB/s了,但是由于群晖买软件送硬件的特性,FS1018配备的这个奔腾D1508比较孱弱,不知道是否能跑满,由于交换机还没到所以速度测试后面补上。
xl710-qda2使用的是国产寨卡(大厂保修3年),模块也是intel的,是原装还是山寨不清楚
第一次接触40g光纤,使用的mpo接口,以太网卡使用8芯,由于历史原因网速大部分成品都是12芯的,12芯兼容8芯,这里使用的也是12芯。在10g网络以下光纤一般使用双芯lc接口,家用宽带使用单芯sc接口,而mop接口单排8或12芯,更有双排24芯,具体请自行搜索。
下面上图
网卡x710-da2和xl710-qda2
xl710-qda2芯片
xl710-qda2上机
intel 40g模块
模块光纤接口
模块上机
mpo接口光纤

群晖的兼容性列表里没有xl710-qda2,但是按经验intel的驱动兼容自家大部分产品,换之前还稍微有点担心,下图是群晖正确识别
群晖识别xl710-qda2
以下是ssh登陆群晖看到的dmesg内容

[ 58.168571] Intel(R) 10GbE PCI Express Linux Network Driver - version 5.1.3
[ 58.176352] Copyright(c) 1999 - 2017 Intel Corporation.
[ 58.189592] i40e: Intel(R) 40-10 Gigabit Ethernet Connection Network Driver - version 2.3.6
[ 58.198928] i40e: Copyright(c) 2013 - 2017 Intel Corporation.
[ 58.218788] i40e 0000:01:00.0: fw 6.0.48442 api 1.7 nvm 6.01 0x80003492 0.0.0
[ 58.459081] i40e 0000:01:00.0: MAC address: 68:91:d0:xx:xx:xx
[ 58.470715] i40e 0000:01:00.0: PCI-Express: Speed 8.0GT/s Width x8
[ 58.478036] i40e 0000:01:00.0: User requested queue count/HW max RSS count: 0/64
[ 58.486401] i40e 0000:01:00.0: Features: PF-id[0] VFs: 64 VSIs: 66 QP: 4 RSS FD_ATR FD_SB NTUPLE CloudF VxLAN NVGRE PTP VEPA
[ 58.511205] i40e 0000:01:00.1: fw 6.0.48442 api 1.7 nvm 6.01 0x80003492 0.0.0
[ 58.751255] i40e 0000:01:00.1: MAC address: 68:91:d0:xx:xx:xx
[ 58.762888] i40e 0000:01:00.1: PCI-Express: Speed 8.0GT/s Width x8
[ 58.770209] i40e 0000:01:00.1: User requested queue count/HW max RSS count: 0/64
[ 58.778572] i40e 0000:01:00.1: Features: PF-id[1] VFs: 64 VSIs: 66 QP: 4 RSS FD_ATR FD_SB NTUPLE CloudF VxLAN NVGRE PTP VEPA