You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:53:10