|
|
本帖最后由 hengdm 于 2025-11-14 16:28 编辑
想用“师夷长技以制夷”A做旁路由,费老大劲天配置了macvlan容器,结果HTTPS死活无法连接,最终还是没法用。
小米固件在br-lan接口上处理 “非本机MAC(macvlan虚拟的子MAC)→WAN的TCP流量”时,有硬件/固件bug。也可能是MTK芯片的多MAC转发硬件bug。具体表现是:
- macvlan容器里,Ping、DNS、HTTP 80正常;TCP 443三次握手成功(nc -vz显示open);随后立刻被RST。SSL/TLS握手全部失败。
- 容器发出SYN→对端回SYN+ACK→容器ACK →接着的数据包在MTK/NAT层被丢或reset。不是对端reset而是本地路由器这条转发路径直接触发RST。
有兴趣可搜索:macvlan passthrough ARP/NAT bug on MTK BE7000 router
既然已经浪费了我大把青春和很多ChatGPT电费。 就记一下配置macvlan容器的方法吧,无HTTPS需求情况下还是可以用的。
ssh到路由器终端(即宿主机)执行:
- # 开启网卡promisc混杂模式
- ip link set br-lan promisc on
- # 新增接口macvlan0,分配IP并启用
- ip link add macvlan0 link br-lan type macvlan mode bridge
- ip addr add 192.168.42.2/24 dev macvlan0
- ip link set macvlan0 up
- # 允许 macvlan0 出口流量
- iptables -I INPUT -i macvlan0 -j ACCEPT
- iptables -I FORWARD -i macvlan0 -o pppoe-wan -j ACCEPT
- iptables -I FORWARD -i pppoe-wan -o macvlan0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- # 为docker创建macvlan类型网络
- docker network create -d macvlan --subnet=192.168.42.0/24 --gateway=192.168.42.1 --opt parent=br-lan macvlan
- # 创建运行“师夷长技以制夷”a容器
- docker run -itd \
- --name “师夷长技以制夷”a \
- --network macvlan \
- --ip=192.168.42.64 \
- -v /mnt/usb-xxxxx/docker/“师夷长技以制夷”a:/etc/“师夷长技以制夷”a \
- --restart unless-stopped \
- --cap-add=NET_ADMIN \
- --entrypoint sh \
- ghcr.io/“师夷长技以制夷”a/“师夷长技以制夷”a \
- sh -c "ip route del default 2>/dev/null; ip route add default via 192.168.42.2 dev eth0; sysctl -w net.ipv4.ip_forward=1; /usr/bin/“师夷长技以制夷”a"
- # 加路由,使宿主机到容器的通信全部经由macvlan0
- ip route add 192.168.42.64/32 dev macvlan0
复制代码
这样容器就能跑了。
还需要做持久化,不然路由器重启容器就没网了。小米路由器不支持/etc/rc.local持久化(重启清空),但脚本如下。有兴趣的请参考SSH持久化的方法,懒得搞了。
- #!/bin/sh
- # Put your custom commands here that should be executed once
- # the system init finished. By default this file does nothing.
- # Enable promiscuous mode on br-lan (required for macvlan to receive frames)
- ip link set br-lan promisc on
- # Create macvlan0 on br-lan (acts as upstream gateway for the container)
- ip link add macvlan0 link br-lan type macvlan mode bridge 2>/dev/null || true
- ip addr add 192.168.42.2/24 dev macvlan0 2>/dev/null || true
- ip link set macvlan0 up
- # Add return route so host knows 192.168.42.64 is reachable via macvlan0
- ip route add 192.168.42.64/32 dev macvlan0 2>/dev/null || true
- # Allow traffic from container to WAN
- iptables -I INPUT -i macvlan0 -j ACCEPT
- iptables -I FORWARD -i macvlan0 -o pppoe-wan -j ACCEPT
- # Allow return traffic from WAN back to container
- iptables -I FORWARD -i pppoe-wan -o macvlan0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- exit 0
复制代码
|
|