如何配置使K3S内置Traefik仅可通过Wireguard VPN访问?
解决方案:让K3S内置Traefik仅通过Wireguard访问
以下是三个可行的方案,针对你遇到的K3S iptables冲突、Traefik监听配置问题给出具体操作:
方案1:修改Traefik配置,仅监听Wireguard接口IP
K3S内置的Traefik通过Helm部署,可通过自定义values.yaml限制其监听的IP地址:
- 先获取Wireguard接口的IP(假设接口名为
wg0):
得到类似ip addr show wg0 | grep "inet " | awk '{print $2}' | cut -d'/' -f110.0.0.1的IP地址。 - 创建自定义配置文件
traefik-custom-values.yaml:
把entryPoints: web: address: "10.0.0.1:80" websecure: address: "10.0.0.1:443" ports: web: hostPort: 80 hostIP: 10.0.0.1 websecure: hostPort: 443 hostIP: 10.0.0.110.0.0.1替换为你的Wireguard实际IP。 - 升级Traefik的Helm实例:
操作完成后,Traefik只会在Wireguard的IP上监听80/443端口,公网IP不会有监听,自然只能通过VPN访问。kubectl -n kube-system upgrade --install traefik traefik/traefik -f traefik-custom-values.yaml
方案2:直接添加iptables规则,限制Traefik端口的访问来源
由于K3S会自动管理iptables,UFW规则容易冲突,直接操作iptables更可靠:
- 假设你的Wireguard子网是
10.0.0.0/24,执行以下规则:# 允许Wireguard子网访问Traefik的80和443端口 iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 443 -j ACCEPT # 拒绝所有其他来源访问这两个端口 iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -p tcp --dport 443 -j DROP - 保存iptables规则,避免重启后失效(以Debian/Ubuntu为例):
这样即使Traefik监听公网IP,外部流量也会被iptables拦截,只有VPN内的机器能访问。iptables-save > /etc/iptables/rules.v4
方案3:将Traefik改为ClusterIP,通过Wireguard接口的反向代理访问
- 修改Traefik的Service类型为ClusterIP,取消公网监听:
kubectl -n kube-system patch service traefik -p '{"spec":{"type":"ClusterIP"}}' - 在主机上安装Nginx(或其他反向代理),创建配置文件
/etc/nginx/sites-available/traefik-proxy:server { listen 10.0.0.1:80; server_name your-domain.local; # 可选,用VPN内的域名 location / { proxy_pass http://traefik.kube-system.svc.cluster.local:80; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } } - 启用配置并重启Nginx:
此时只有VPN内的机器访问ln -s /etc/nginx/sites-available/traefik-proxy /etc/nginx/sites-enabled/ systemctl restart nginx10.0.0.1:80时,会被转发到Traefik,公网无法触及。
内容的提问来源于stack exchange,提问作者Buttercreme
相关产品推荐
相关产品推荐

