Skip to content

Instantly share code, notes, and snippets.

@thanhluu
Created July 1, 2025 14:47
Show Gist options
  • Select an option

  • Save thanhluu/2b11cfd24e6ad753d80ea3bd375815ce to your computer and use it in GitHub Desktop.

Select an option

Save thanhluu/2b11cfd24e6ad753d80ea3bd375815ce to your computer and use it in GitHub Desktop.
#!/bin/bash
# SoftEther VPN Server Auto Installation Script - NO SYSTEM UPGRADE
# Headless 100% - No Interaction Required - FASTER VERSION
set -e # Exit on any error
# Configuration variables
VPN_USER="vpn"
VPN_PASS="vpn"
ADMIN_PASS="vpnevo123"
SERVER_IP=$(curl -s ifconfig.me || curl -s ipinfo.io/ip || hostname -I | awk '{print $1}')
VPN_PORT="1194"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Logging function
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
}
warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
# Check if running as root
check_root() {
if [[ $EUID -ne 0 ]]; then
error "This script must be run as root"
exit 1
fi
}
# Detect OS
detect_os() {
if [[ -f /etc/os-release ]]; then
. /etc/os-release
OS=$NAME
VER=$VERSION_ID
else
error "Cannot detect OS version"
exit 1
fi
log "Detected OS: $OS $VER"
}
# Update package list only (không upgrade packages)
update_package_list() {
log "Updating package list only (không upgrade system)..."
if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
warning "⚠️ System packages NOT upgraded - using existing versions"
elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]]; then
yum makecache
warning "⚠️ System packages NOT upgraded - using existing versions"
else
warning "Unsupported OS, continuing anyway..."
fi
}
# Install dependencies (với existing packages)
install_dependencies() {
log "Installing required dependencies..."
if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then
# Try to install, but don't fail if versions are incompatible
apt-get install -y --no-upgrade \
build-essential \
cmake \
libiconv-hook-dev \
libssl-dev \
zlib1g-dev \
libreadline-dev \
libncurses5-dev \
wget \
unzip \
curl \
net-tools \
expect 2>/dev/null || {
warning "Some packages may be outdated, but continuing..."
}
elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]]; then
yum install -y \
gcc \
gcc-c++ \
make \
cmake \
openssl-devel \
zlib-devel \
readline-devel \
ncurses-devel \
wget \
unzip \
curl \
net-tools \
expect 2>/dev/null || {
warning "Some packages may be outdated, but continuing..."
}
fi
}
# Download and compile SoftEther VPN
download_compile_softether() {
log "Downloading SoftEther VPN Server..."
cd /opt
# Download latest stable version
DOWNLOAD_URL="https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.34-9745-beta/softether-vpnserver-v4.34-9745-beta-2020.04.05-linux-x64-64bit.tar.gz"
wget -O softether-vpnserver.tar.gz "$DOWNLOAD_URL"
log "Extracting SoftEther VPN Server..."
tar -xzf softether-vpnserver.tar.gz
cd vpnserver
log "Compiling SoftEther VPN Server với existing tools..."
# Check if we have minimum required tools
if ! command -v gcc &> /dev/null; then
error "GCC compiler not found. Please install build-essential first."
exit 1
fi
if ! command -v make &> /dev/null; then
error "Make not found. Please install make first."
exit 1
fi
# Create expect script to handle license agreement
cat > /tmp/license_accept.exp << 'EOF'
#!/usr/bin/expect -f
spawn make
expect "Please choose one of above number:" { send "1\r" }
expect "Please choose one of above number:" { send "1\r" }
expect "Please choose one of above number:" { send "1\r" }
expect eof
EOF
chmod +x /tmp/license_accept.exp
# Try compilation with error handling
if ! /tmp/license_accept.exp; then
error "Compilation failed. This might be due to outdated system packages."
error "Consider running the full version with system upgrade."
exit 1
fi
# Set permissions
chmod 600 *
chmod 700 vpnserver
chmod 700 vpncmd
log "SoftEther VPN Server compiled successfully với existing system!"
}
# Start VPN Server
start_vpn_server() {
log "Starting SoftEther VPN Server..."
cd /opt/vpnserver
./vpnserver start
sleep 3
}
# Configure VPN Server
configure_vpn_server() {
log "Configuring VPN Server..."
cd /opt/vpnserver
# Create configuration script
cat > /tmp/vpn_setup.txt << EOF
1
ServerPasswordSet $ADMIN_PASS
HubCreate DEFAULT /PASSWORD:
Hub DEFAULT
UserCreate $VPN_USER /GROUP: /REALNAME:"VPN User" /NOTE:"Auto-created VPN user"
UserPasswordSet $VPN_USER /PASSWORD:$VPN_PASS
SecureNatEnable
OpenVpnEnable yes /PORTS:$VPN_PORT
OpenVpnMakeConfig openvpn_config.zip
exit
EOF
# Apply configuration
./vpncmd < /tmp/vpn_setup.txt
log "VPN Server configured successfully"
}
# Generate OpenVPN config
generate_ovpn_config() {
log "Generating OpenVPN configuration file..."
cd /opt/vpnserver
# Extract config files
unzip -o openvpn_config.zip
# Find the remote access config file
OVPN_FILE=$(ls *_openvpn_remote_access_l3.ovpn | head -1)
if [[ -z "$OVPN_FILE" ]]; then
error "OpenVPN config file not found"
exit 1
fi
# Create final config file
cp "$OVPN_FILE" vpn_config.ovpn
# Replace server address with actual IP
sed -i "s/remote .* $VPN_PORT/remote $SERVER_IP $VPN_PORT/" vpn_config.ovpn
# Copy to easily accessible location
cp vpn_config.ovpn /root/vpn_config.ovpn
cp vpn_config.ovpn /tmp/vpn_config.ovpn
log "OpenVPN config file created at: /root/vpn_config.ovpn"
}
# Create systemd service
create_systemd_service() {
log "Creating systemd service..."
cat > /etc/systemd/system/softether-vpnserver.service << EOF
[Unit]
Description=SoftEther VPN Server
After=network.target
[Service]
Type=forking
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
ExecReload=/bin/kill -HUP \$MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable softether-vpnserver
log "Systemd service created and enabled"
}
# Configure firewall (basic)
configure_firewall() {
log "Configuring firewall (basic rules)..."
# UFW (Ubuntu/Debian)
if command -v ufw &> /dev/null; then
ufw allow $VPN_PORT/udp 2>/dev/null || true
ufw allow 443/tcp 2>/dev/null || true
ufw allow 5555/tcp 2>/dev/null || true
# Don't force enable UFW if not already enabled
fi
# Firewall-cmd (CentOS/RHEL)
if command -v firewall-cmd &> /dev/null; then
firewall-cmd --permanent --add-port=$VPN_PORT/udp 2>/dev/null || true
firewall-cmd --permanent --add-port=443/tcp 2>/dev/null || true
firewall-cmd --permanent --add-port=5555/tcp 2>/dev/null || true
firewall-cmd --reload 2>/dev/null || true
fi
# IPTables fallback (basic rules)
if command -v iptables &> /dev/null; then
iptables -I INPUT -p udp --dport $VPN_PORT -j ACCEPT 2>/dev/null || true
iptables -I INPUT -p tcp --dport 443 -j ACCEPT 2>/dev/null || true
iptables -I INPUT -p tcp --dport 5555 -j ACCEPT 2>/dev/null || true
fi
warning "⚠️ Basic firewall rules applied. You may need to configure manually."
}
# Check installation
check_installation() {
log "Verifying installation..."
# Check if VPN server is running
if pgrep -f vpnserver > /dev/null; then
info "✓ VPN Server is running"
else
error "✗ VPN Server is not running"
return 1
fi
# Check if port is listening
if netstat -tulpn | grep ":$VPN_PORT " > /dev/null; then
info "✓ Port $VPN_PORT is listening"
else
error "✗ Port $VPN_PORT is not listening"
return 1
fi
# Check config file
if [[ -f /root/vpn_config.ovpn ]]; then
info "✓ OpenVPN config file created"
else
error "✗ OpenVPN config file not found"
return 1
fi
}
# Display final information
show_final_info() {
echo ""
echo "=================================================================="
echo -e "${GREEN}🚀 SoftEther VPN Server Installation Complete! (NO UPGRADE)${NC}"
echo "=================================================================="
echo ""
echo -e "${YELLOW}⚠️ THÔNG BÁO QUAN TRỌNG:${NC}"
echo -e "${YELLOW} System KHÔNG được upgrade để cài nhanh hơn${NC}"
echo -e "${YELLOW} Khuyến nghị chạy system update sau khi test VPN OK${NC}"
echo ""
echo -e "${BLUE}Server Information:${NC}"
echo " Server IP: $SERVER_IP"
echo " OpenVPN Port: $VPN_PORT (UDP)"
echo " Admin Password: $ADMIN_PASS"
echo ""
echo -e "${BLUE}VPN User Credentials:${NC}"
echo " Username: $VPN_USER"
echo " Password: $VPN_PASS"
echo ""
echo -e "${BLUE}Configuration Files:${NC}"
echo " OpenVPN Config: /root/vpn_config.ovpn"
echo " Backup Config: /tmp/vpn_config.ovpn"
echo ""
echo -e "${BLUE}Management URLs:${NC}"
echo " Web Admin: https://$SERVER_IP:5555/"
echo " VPN Server: $SERVER_IP:443"
echo ""
echo -e "${BLUE}Service Management:${NC}"
echo " Start: systemctl start softether-vpnserver"
echo " Stop: systemctl stop softether-vpnserver"
echo " Status: systemctl status softether-vpnserver"
echo ""
echo -e "${YELLOW}Security Recommendations:${NC}"
echo "1. 🔄 Chạy system update sau khi test VPN: apt update && apt upgrade"
echo "2. 🔒 Thay đổi password mặc định"
echo "3. 🛡️ Cấu hình firewall chi tiết hơn nếu cần"
echo "4. 📊 Monitor system security updates định kỳ"
echo ""
echo -e "${BLUE}Next Steps:${NC}"
echo "1. Download /root/vpn_config.ovpn to your client device"
echo "2. Import the .ovpn file into your OpenVPN client"
echo "3. Connect using username: $VPN_USER, password: $VPN_PASS"
echo ""
echo "=================================================================="
}
# Cleanup function
cleanup() {
log "Cleaning up temporary files..."
rm -f /tmp/license_accept.exp
rm -f /tmp/vpn_setup.txt
rm -f /opt/softether-vpnserver.tar.gz
}
# Main installation function
main() {
echo "=================================================================="
echo -e "${GREEN}SoftEther VPN Server Auto Installer - FAST VERSION${NC}"
echo -e "${BLUE}Headless Installation - No System Upgrade${NC}"
echo -e "${YELLOW}⚠️ SYSTEM SẼ KHÔNG ĐƯỢC UPGRADE ĐỂ CÀI NHANH HỠN${NC}"
echo "=================================================================="
echo ""
check_root
detect_os
update_package_list
install_dependencies
download_compile_softether
start_vpn_server
configure_vpn_server
generate_ovpn_config
create_systemd_service
configure_firewall
if check_installation; then
cleanup
show_final_info
log "Installation completed successfully! (without system upgrade)"
exit 0
else
error "Installation verification failed!"
exit 1
fi
}
# Run main function
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment