在Docker容器中运行sstp-client时出现Segmentation fault问题求助
解决SSTP VPN容器Segmentation fault问题
我需要访问只能通过SSTP VPN连接的MariaDB,因此计划在docker-compose中创建额外容器并与应用容器共享网络。编写了如下Dockerfile和启动脚本,但运行时出现Segmentation fault错误,无法排查原因。
我的配置文件
Dockerfile
FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y \ software-properties-common \ iproute2 \ iputils-ping \ curl \ ca-certificates \ ppp # 添加PPA并安装sstp-client RUN add-apt-repository -y ppa:eivnaes/network-manager-sstp && \ apt update && \ apt install -y sstp-client # 复制证书和脚本 COPY CA_divan.by.crt /etc/CA_divan.by.crt COPY start-vpn.sh /start-vpn.sh RUN chmod +x /start-vpn.sh CMD ["/start-vpn.sh"]
start-vpn.sh
#!/bin/bash set -e : "${VPN_SERVER:?VPN_SERVER is required}" : "${VPN_USER:?VPN_USER is required}" : "${VPN_PASS:?VPN_PASS is required}" : "${VPN_CERT_PATH:?VPN_CERT_PATH is required}" /usr/sbin/sstpc \ --log-level 3 \ --cert-warn \ --user "${VPN_USER}" \ --password "${VPN_PASS}" \ --ca-cert "${VPN_CERT_PATH}" \ "${VPN_SERVER}" \ usepeerdns require-mschap-v2 noauth defaultroute refuse-eap noccp \ name sstp-vpn \ ipparam sstp-vpn \ & sleep 10 echo "VPN connected. Checking IP:" curl https://ipinfo.io tail -f /dev/null
报错信息
/start-vpn.sh: line 22: 7 Segmentation fault (core dumped) /usr/sbin/sstpc --log-level 3 --cert-warn --user "${VPN_USER}" --password "${VPN_PASS}" --ca-cert "${VPN_CERT_PATH}" "${VPN_SERVER}" usepeerdns require-mschap-v2 noauth defaultroute refuse-eap noccp name sstp-vpn ipparam sstp-vpn
排查与修复方案
1. 容器权限不足(最可能原因)
sstpc需要创建PPP网络设备,默认Docker容器没有权限,必须添加权限:
- 在docker-compose中配置
cap_add: NET_ADMIN并映射/dev/ppp设备 - 直接运行容器时加参数:
docker run --cap-add=NET_ADMIN --device=/dev/ppp ...
2. PPA版本兼容性问题
Ubuntu 22.04的第三方PPA中的sstp-client可能存在兼容性bug,建议换成官方源版本:
- 改用Debian Bookworm基础镜像(官方源自带sstp-client,无需添加PPA)
- 或者在Ubuntu中移除PPA,用
apt install sstp-client安装官方版本
3. 证书格式验证
确认CA证书是PEM格式,sstpc无法识别DER等其他格式:
- 用命令验证:
openssl x509 -in CA_divan.by.crt -text - 如果不是PEM格式,转换:
openssl x509 -inform der -in CA_divan.by.crt -out CA_divan.by.pem
4. 启动脚本优化
避免后台运行sstpc,改用前台执行并通过exec传递信号,提升容器稳定性:
- 移除
&和sleep 10、tail -f /dev/null,换成exec /usr/sbin/sstpc ...
5. 增加调试日志
将--log-level调到5(最高级别),或者用strace跟踪系统调用,定位崩溃点:
- 修改启动参数:
--log-level 5 - 用strace调试:
strace /usr/sbin/sstpc [你的参数]
修改后的示例配置
优化后的Dockerfile(Debian基础镜像)
FROM debian:bookworm ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y \ iproute2 \ iputils-ping \ curl \ ca-certificates \ ppp \ sstp-client COPY CA_divan.by.crt /etc/CA_divan.by.crt COPY start-vpn.sh /start-vpn.sh RUN chmod +x /start-vpn.sh CMD ["/start-vpn.sh"]
优化后的start-vpn.sh
#!/bin/bash set -e : "${VPN_SERVER:?VPN_SERVER is required}" : "${VPN_USER:?VPN_USER is required}" : "${VPN_PASS:?VPN_PASS is required}" : "${VPN_CERT_PATH:?VPN_CERT_PATH is required}" # 用exec前台运行,确保容器能接收信号 exec /usr/sbin/sstpc \ --log-level 5 \ --cert-warn \ --user "${VPN_USER}" \ --password "${VPN_PASS}" \ --ca-cert "${VPN_CERT_PATH}" \ "${VPN_SERVER}" \ usepeerdns require-mschap-v2 noauth defaultroute refuse-eap noccp \ name sstp-vpn \ ipparam sstp-vpn
docker-compose.yml配置
version: '3.8' services: sstp-vpn: build: . environment: - VPN_SERVER=你的VPN服务器地址 - VPN_USER=你的VPN用户名 - VPN_PASS=你的VPN密码 - VPN_CERT_PATH=/etc/CA_divan.by.crt cap_add: - NET_ADMIN devices: - /dev/ppp:/dev/ppp networks: - app-network # 你的应用容器 app: image: 你的应用镜像 networks: - app-network networks: app-network: driver: bridge
内容的提问来源于stack exchange,提问作者OrderNick
相关产品推荐
相关产品推荐

