#
BGP
2026-04-02
用Tailscale打IP Tunnel
== exit node 不要用本文的方法
起因
搞了ASN后最近没有怎么折腾BGP了,昨天晚上突然起兴把手上的服务器都拉tailscale组网了,我一想,那顺便给在几台支持BGP Session的机子附近的机子都打个tunnel走自己的IP出吧。
又因为Tailscale是使用WireGuard实现的,而WG又是标准的Tunnel用的协议,所以我尝试直接用Tailscale组好的网播。
受到了亿些些阻力,不过最后也算成功解决了,所以写篇博文记一下。
Go!
预备
- 在支持BGP Session的机子上配置好BGP Session。
- 在两端机子上装好tailscale并打通
- 在服务器上开启转发和UDP GRO
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off开始
- 在子服务器上建虚拟网卡+绑IP
ip link add dev dummy0 type dummy
ip link set dummy0 up
ip -6 addr add 你的IP dev dummy0因为tailscale自己做了很多安全策略(不允许节点直接宣告::/0)导致直接播很难通,所以最后我们发现要使用全球单播欺骗+策略路由才可以解决问题。
所以我们要在BGP节点上用tailscale宣告2000::/3,再在子节点上正常宣告才可以通。
在BGP节点进行:
tailscale up --reset
tailscale up --advertise-routes=2000::/3 --snat-subnet-routes=false --accept-routes
ip6tables -I FORWARD -i tailscale0 -o eth0 -j ACCEPT
ip6tables -I FORWARD -i eth0 -o tailscale0 -j ACCEPT
ip6tables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu在子节点进行:
tailscale up --reset
tailscale up --advertise-routes=你的IP --accept-routes
# 1. 确保去往 Tailscale 其他机器的内网流量,正常走隧道
ip -6 rule add to fd7a::/16 pref 5210 table 52
# 2. 告诉系统:凡是带着你 Anycast 身份的数据包,走隧道去主节点!
ip -6 rule add from 你的IP pref 5211 table 52
# 3. 【核心魔法】:除上述两类之外的所有普通上网流量,强制查找系统的原生 main 表,直接走物理网卡出海,无视 Tailscale 的劫持!
ip -6 rule add pref 5212 table main
# 最后可以顺便给你原来的ip改一下生命周期
ip -6 addr change 原IP dev eth0 preferred_lft 0 相关推荐
- 暂无相关推荐,看看别的吧。
0 评论