如何通过OpenVPN隧道实现Python Sentry日志正常上报sentry.io?
可行配置方案
首先明确故障逻辑:服务器1默认路由全部指向OpenVPN隧道,流量发到服务器2后,服务器2未对隧道来源的流量做转发放行和源地址转换,导致流量无法正常出公网、回程包路由不通,最终Sentry上报失败。以下方案按需选择即可。
方案1:开启服务器2的隧道流量公网转发(最省事,一劳永逸)
配置完成后服务器1所有经隧道发往服务器2的流量都能正常访问公网,Sentry SDK不需要做任何额外修改。
- 开启服务器2的内核IP转发
编辑配置文件/etc/sysctl.conf,添加或修改参数:
保存退出后执行net.ipv4.ip_forward = 1sysctl -p加载配置,立即生效。 - 配置防火墙源地址转换(SNAT)
先确认两个实际配置值:- OpenVPN分配的隧道内网网段(常见为
10.8.0.0/24,以你服务端实际配置为准) - 服务器2可访问公网的网卡名称(执行
ip a即可查看,常见名如eth0、ens33)
执行iptables规则添加地址转换策略:
示例:如果隧道网段是10.8.0.0/24,公网网卡为eth0,规则就写为iptables -t nat -A POSTROUTING -s <替换为你的隧道网段> -o <替换为公网网卡名> -j MASQUERADEiptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE - OpenVPN分配的隧道内网网段(常见为
- 放行转发链路(如果服务器2防火墙默认拦截FORWARD流量才需要做)
执行命令添加转发白名单:iptables -A FORWARD -s <替换为你的隧道网段> -j ACCEPT - 持久化防火墙规则,避免服务器重启后配置丢失:Debian/Ubuntu系统安装
iptables-persistent组件后执行netfilter-persistent save即可;CentOS/RHEL系统直接执行service iptables save。 - 连通性验证:在服务器1上执行
curl -I https://sentry.io,能返回200、301类的HTTP响应码就代表链路通了,Sentry可以正常上报。
方案2:配置正向代理仅转发Sentry流量(适合不想开放服务器1全量公网访问的场景)
如果不希望服务器1的其他业务流量走服务器2出公网,只放行Sentry上报流量,可以用正向代理的方式实现。
- 在服务器2上部署正向代理服务,生产环境推荐用Squid,安装完成后只放通OpenVPN隧道网段的访问权限,监听服务器2的隧道内网IP即可,默认代理端口为3128。如果是临时测试,也可以在服务器2上用Python快速起一个临时代理:
# 临时测试用,生产环境不推荐 pip install proxy.py proxy --hostname <服务器2的隧道内网IP> --port 3128 - 给Sentry配置代理,两种方式选一个就行:
- 系统全局代理:在服务器1上添加环境变量
export HTTPS_PROXY=http://<服务器2隧道内网IP>:3128,把变量写到服务启动脚本或者/etc/profile里永久生效,所有支持系统代理的程序都会自动走该链路。 - Sentry SDK单独配置:初始化Sentry客户端的时候直接传入代理参数,不影响其他业务流量,Python SDK示例:
import sentry_sdk sentry_sdk.init( dsn="替换为你自己的Sentry DSN", http_proxy="http://<服务器2隧道内网IP>:3128", https_proxy="http://<服务器2隧道内网IP>:3128", )
- 系统全局代理:在服务器1上添加环境变量
- 连通性验证:在服务器1上执行
curl -I -x http://<服务器2隧道内网IP>:3128 https://sentry.io,返回正常HTTP响应码即配置生效。
方案3:配置静态路由单独放行sentry.io网段
如果不想做全量转发也不想搭代理,可以在服务器1上查询sentry.io解析出来的所有IP段,给这些IP单独配置静态路由走OpenVPN隧道到服务器2,同时在服务器2上针对这些源目IP做转发放行即可。这种方式维护成本高,sentry.io的IP变更后需要同步修改路由,一般不推荐使用。
内容的提问来源于stack exchange,提问作者Cruise5
相关产品推荐
相关产品推荐

