shadowsocks-libev 安装及使用(多用户、多IP)

shadowsocks是一套技术和相关工具的总称,常备简称为ss,可以简单总结为:一套基于Sock5代理方式的网络加密传输数据包的技术 = 用Socks5 技术加密的技术。

Sock技术简介

采用sock协议的代理服务器就是 Socks 服务器,是一种通用的代理服务器。

Socks代理与应用层代理、HTTP层代理不通,Socks代理只是简单的传递数据包,而不必关心是何种协议(比如FTP、HTTP和NNTP请求)。所以,Socks代理比其他应用层代理要快的多。

Sock5代理服务器则是把你的网络数据请求通过一条连接你和代理服务器之间的通道,由服务器转发到目的地。你没有加入任何新的网络,只是http/socks数据经过代理服务器的转发送出,并从代理服务器接收回应。你与代理服务器通信过程不会被额外处理,如果你用https,那本身就是加密的。

搭建:

1、参考安装教程:http://totoro.site/index.php/archives/54  ,按照该教程安装时,出现错误,根据错误提示,发现是 解压 mbedtls-2.13.0-gpl.tgz 时格式不对造成的,经过排查,该文件(mbedtls-2.13.0-gpl.tgz)不是一个压缩包,是一个ASCII文件,更改安装脚本中 mbedtls-2.13.0-gpl.tgz 的下载地址: https://down.24kplus.com/linux/mbedtls/mbedtls-2.16.3-gpl.tgz,然后重新执行脚本,安装完成。

2、安装 shadowsocks-libev.sh (网络上该脚本中一个网址不存在,已修改);添加执行权限后 执行便可: ./shadowsocks-libev.sh

3、增加用户:useradd ss3

4、添加子接口:ifconfig eth0:0 2.2.2.2/24 或 ip addr add 2.2.2.2/24 dev eth0 label eth0:0 清除网卡子接口,删除ip别名 ifconfig eth0:1 down  或 ip addr del 2.2.2.2/24 dev eth0 label eth0:0  ;

若是想永久生效,创建:/etc/sysconfig/network-scripts/ifcfg-eth0:0 添加:(文件中仅有下面四行便可)

DEVICE=eth0:0

IPADDR=2.2.2.2

PREFIX=24

ONPARENT=yes

注:使用命令添加后立刻生效,增加配置文件是在系统重启后生效,所以需要使用命令添加并且增加配置文件才可以立即增加且永久生效。

5、使用新建的用户运行:ss-server -a ss3 -c /home/ss3/ss3.json -u &

6、防火墙放行相应端口(tcp放行就可以了,但是网上教程都放行了udp)

iptables -I INPUT -p tcp --dport 14278 -j ACCEPT

或:firewall-cmd --permanent --zone=public --add-port=11126/tcp

7、查看是否成功启动并监听相应端口

ps -aux | grep ss-server

netstat -anlp | grep ss-server

8、若想中断某个ss-server进程,先通过 ps -aux 找到pid,之后通过 kill [pid] 强制中断。


附录:

可以将一下代码复制到Linux的一个脚本中,直接运行,便可安装好shadowsocks-libev

#!/usr/bin/env bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

#===================================================================#

#  System Required:  CentOS 6 or 7                                #

#  Description: Install Shadowsocks-libev server for CentOS 6 or 7 #

#  Author: Teddysun <i@teddysun.com>                              #

#  Thanks: @madeye <https://github.com/madeye>                    #

#  Intro:  https://teddysun.com/357.html                          #

#===================================================================#

# Current folder

cur_dir=`pwd`

libsodium_file="libsodium-1.0.16"

libsodium_url="https://github.com/jedisct1/libsodium/releases/download/1.0.16/libsodium-1.0.16.tar.gz"

mbedtls_file="mbedtls-2.16.3"

mbedtls_url="https://down.24kplus.com/linux/mbedtls/mbedtls-2.16.3-gpl.tgz"

# Stream Ciphers

ciphers=(

aes-256-gcm

aes-192-gcm

aes-128-gcm

aes-256-ctr

aes-192-ctr

aes-128-ctr

aes-256-cfb

aes-192-cfb

aes-128-cfb

camellia-128-cfb

camellia-192-cfb

camellia-256-cfb

xchacha20-ietf-poly1305

chacha20-ietf-poly1305

chacha20-ietf

chacha20

salsa20

rc4-md5

)

# Color

red='\033[0;31m'

green='\033[0;32m'

yellow='\033[0;33m'

plain='\033[0m'

# Make sure only root can run our script

[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1

# Disable selinux

disable_selinux(){

    if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then

        sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

        setenforce 0

    fi

}

get_ip(){

    local IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )

    [ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )

    [ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )

    [ ! -z ${IP} ] && echo ${IP} || echo

}

get_ipv6(){

    local ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com)

    if [ -z ${ipv6} ]; then

        return 1

    else

        return 0

    fi

}

get_char(){

    SAVEDSTTY=`stty -g`

    stty -echo

    stty cbreak

    dd if=/dev/tty bs=1 count=1 2> /dev/null

    stty -raw

    stty echo

    stty $SAVEDSTTY

}

get_latest_version(){

    ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/shadowsocks/shadowsocks-libev/releases/latest | grep 'tag_name' | cut -d\" -f4)

    [ -z ${ver} ] && echo "Error: Get shadowsocks-libev latest version failed" && exit 1

    shadowsocks_libev_ver="shadowsocks-libev-$(echo ${ver} | sed -e 's/^[a-zA-Z]//g')"

    download_link="https://github.com/shadowsocks/shadowsocks-libev/releases/download/${ver}/${shadowsocks_libev_ver}.tar.gz"

    init_script_link="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev"

}

check_installed(){

    if [ "$(command -v "$1")" ]; then

        return 0

    else

        return 1

    fi

}

check_version(){

    check_installed "ss-server"

    if [ $? -eq 0 ]; then

        installed_ver=$(ss-server -h | grep shadowsocks-libev | cut -d' ' -f2)

        get_latest_version

        latest_ver=$(echo ${ver} | sed -e 's/^[a-zA-Z]//g')

        if [ "${latest_ver}" == "${installed_ver}" ]; then

            return 0

        else

            return 1

        fi

    else

        return 2

    fi

}

print_info(){

    clear

    echo "#############################################################"

    echo "# Install Shadowsocks-libev server for CentOS 6 or 7        #"

    echo "# Intro:  https://teddysun.com/357.html                    #"

    echo "# Author: Teddysun <i@teddysun.com>                        #"

    echo "# Github: https://github.com/shadowsocks/shadowsocks-libev  #"

    echo "#############################################################"

    echo

}

# Check system

check_sys(){

    local checkType=$1

    local value=$2

    local release=''

    local systemPackage=''

    if [[ -f /etc/redhat-release ]]; then

        release="centos"

        systemPackage="yum"

    elif grep -Eqi "debian|raspbian" /etc/issue; then

        release="debian"

        systemPackage="apt"

    elif grep -Eqi "ubuntu" /etc/issue; then

        release="ubuntu"

        systemPackage="apt"

    elif grep -Eqi "centos|red hat|redhat" /etc/issue; then

        release="centos"

        systemPackage="yum"

    elif grep -Eqi "debian|raspbian" /proc/version; then

        release="debian"

        systemPackage="apt"

    elif grep -Eqi "ubuntu" /proc/version; then

        release="ubuntu"

        systemPackage="apt"

    elif grep -Eqi "centos|red hat|redhat" /proc/version; then

        release="centos"

        systemPackage="yum"

    fi

    if [[ "${checkType}" == "sysRelease" ]]; then

        if [ "${value}" == "${release}" ]; then

            return 0

        else

            return 1

        fi

    elif [[ "${checkType}" == "packageManager" ]]; then

        if [ "${value}" == "${systemPackage}" ]; then

            return 0

        else

            return 1

        fi

    fi

}

version_gt(){

    test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"

}

check_kernel_version(){

    local kernel_version=$(uname -r | cut -d- -f1)

    if version_gt ${kernel_version} 3.7.0; then

        return 0

    else

        return 1

    fi

}

check_kernel_headers(){

    if check_sys packageManager yum; then

        if rpm -qa | grep -q headers-$(uname -r); then

            return 0

        else

            return 1

        fi

    elif check_sys packageManager apt; then

        if dpkg -s linux-headers-$(uname -r) > /dev/null 2>&1; then

            return 0

        else

            return 1

        fi

    fi

    return 1

}

# Get version

getversion(){

    if [[ -s /etc/redhat-release ]]; then

        grep -oE  "[0-9.]+" /etc/redhat-release

    else

        grep -oE  "[0-9.]+" /etc/issue

    fi

}

# CentOS version

centosversion(){

    if check_sys sysRelease centos; then

        local code=$1

        local version="$(getversion)"

        local main_ver=${version%%.*}

        if [ "$main_ver" == "$code" ]; then

            return 0

        else

            return 1

        fi

    else

        return 1

    fi

}

# Pre-installation settings

pre_install(){

    # Check OS system

    if check_sys sysRelease centos; then

        # Not support CentOS 5

        if centosversion 5; then

            echo -e "[${red}Error${plain}] Not support CentOS 5, please change to CentOS 6 or 7 and try again."

            exit 1

        fi

    else

        echo -e "[${red}Error${plain}] Your OS is not supported to run it, please change OS to CentOS and try again."

        exit 1

    fi

    # Check version

    check_version

    status=$?

    if [ ${status} -eq 0 ]; then

        echo -e "[${green}Info${plain}] Latest version ${green}${shadowsocks_libev_ver}${plain} has already been installed, nothing to do..."

        exit 0

    elif [ ${status} -eq 1 ]; then

        echo -e "Installed version: ${red}${installed_ver}${plain}"

        echo -e "Latest version: ${red}${latest_ver}${plain}"

        echo -e "[${green}Info${plain}] Upgrade shadowsocks libev to latest version..."

        ps -ef | grep -v grep | grep -i "ss-server" > /dev/null 2>&1

        if [ $? -eq 0 ]; then

            /etc/init.d/shadowsocks stop

        fi

    elif [ ${status} -eq 2 ]; then

        print_info

        get_latest_version

        echo -e "[${green}Info${plain}] Latest version: ${green}${shadowsocks_libev_ver}${plain}"

        echo

    fi

    # Set shadowsocks-libev config password

    echo "Please enter password for shadowsocks-libev:"

    read -p "(Default password: teddysun.com):" shadowsockspwd

    [ -z "${shadowsockspwd}" ] && shadowsockspwd="teddysun.com"

    echo

    echo "---------------------------"

    echo "password = ${shadowsockspwd}"

    echo "---------------------------"

    echo

    # Set shadowsocks-libev config port

    while true

    do

    dport=$(shuf -i 9000-19999 -n 1)

    echo -e "Please enter a port for shadowsocks-libev [1-65535]"

    read -p "(Default port: ${dport}):" shadowsocksport

    [ -z "$shadowsocksport" ] && shadowsocksport=${dport}

    expr ${shadowsocksport} + 1 &>/dev/null

    if [ $? -eq 0 ]; then

        if [ ${shadowsocksport} -ge 1 ] && [ ${shadowsocksport} -le 65535 ] && [ ${shadowsocksport:0:1} != 0 ]; then

            echo

            echo "---------------------------"

            echo "port = ${shadowsocksport}"

            echo "---------------------------"

            echo

            break

        fi

    fi

    echo -e "[${red}Error${plain}] Please enter a correct number [1-65535]"

    done

    # Set shadowsocks config stream ciphers

    while true

    do

    echo -e "Please select stream cipher for shadowsocks-libev:"

    for ((i=1;i<=${#ciphers[@]};i++ )); do

        hint="${ciphers[$i-1]}"

        echo -e "${green}${i}${plain}) ${hint}"

    done

    read -p "Which cipher you'd select(Default: ${ciphers[0]}):" pick

    [ -z "$pick" ] && pick=1

    expr ${pick} + 1 &>/dev/null

    if [ $? -ne 0 ]; then

        echo -e "[${red}Error${plain}] Please enter a number"

        continue

    fi

    if [[ "$pick" -lt 1 || "$pick" -gt ${#ciphers[@]} ]]; then

        echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#ciphers[@]}"

        continue

    fi

    shadowsockscipher=${ciphers[$pick-1]}

    echo

    echo "---------------------------"

    echo "cipher = ${shadowsockscipher}"

    echo "---------------------------"

    echo

    break

    done

    echo

    echo "Press any key to start...or press Ctrl+C to cancel"

    char=`get_char`

    #Install necessary dependencies

    echo -e "[${green}Info${plain}] Checking the EPEL repository..."

    if [ ! -f /etc/yum.repos.d/epel.repo ]; then

        yum install -y -q epel-release

    fi

    [ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1

    [ ! "$(command -v yum-config-manager)" ] && yum install -y -q yum-utils

    if [ x"`yum-config-manager epel | grep -w enabled | awk '{print $3}'`" != x"True" ]; then

        yum-config-manager --enable epel

    fi

    echo -e "[${green}Info${plain}] Checking the EPEL repository complete..."

    yum install -y -q unzip openssl openssl-devel gettext gcc autoconf libtool automake make asciidoc xmlto libev-devel pcre pcre-devel git c-ares-devel

}

download() {

    local filename=${1}

    local cur_dir=`pwd`

    if [ -s ${filename} ]; then

        echo -e "[${green}Info${plain}] ${filename} [found]"

    else

        echo -e "[${green}Info${plain}] ${filename} not found, download now..."

        wget --no-check-certificate -cq -t3 -T60 -O ${1} ${2}

        if [ $? -eq 0 ]; then

            echo -e "[${green}Info${plain}] ${filename} download completed..."

        else

            echo -e "[${red}Error${plain}] Failed to download ${filename}, please download it to ${cur_dir} directory manually and try again."

            exit 1

        fi

    fi

}

# Download latest shadowsocks-libev

download_files(){

    cd ${cur_dir}

    download "${shadowsocks_libev_ver}.tar.gz" "${download_link}"

    download "${libsodium_file}.tar.gz" "${libsodium_url}"

    download "${mbedtls_file}-gpl.tgz" "${mbedtls_url}"

    download "/etc/init.d/shadowsocks" "${init_script_link}"

}

install_libsodium() {

    if [ ! -f /usr/lib/libsodium.a ]; then

        cd ${cur_dir}

        tar zxf ${libsodium_file}.tar.gz

        cd ${libsodium_file}

        ./configure --prefix=/usr && make && make install

        if [ $? -ne 0 ]; then

            echo -e "[${red}Error${plain}] ${libsodium_file} install failed."

            exit 1

        fi

    else

        echo -e "[${green}Info${plain}] ${libsodium_file} already installed."

    fi

}

install_mbedtls() {

    if [ ! -f /usr/lib/libmbedtls.a ]; then

        cd ${cur_dir}

        tar xf ${mbedtls_file}-gpl.tgz

        cd ${mbedtls_file}

        make SHARED=1 CFLAGS=-fPIC

        make DESTDIR=/usr install

        if [ $? -ne 0 ]; then

            echo -e "[${red}Error${plain}] ${mbedtls_file} install failed."

            exit 1

        fi

    else

        echo -e "[${green}Info${plain}] ${mbedtls_file} already installed."

    fi

}

# Config shadowsocks

config_shadowsocks(){

    local server_value="\"0.0.0.0\""

    if get_ipv6; then

        server_value="[\"[::0]\",\"0.0.0.0\"]"

    fi

    if check_kernel_version && check_kernel_headers; then

        fast_open="true"

    else

        fast_open="false"

    fi

    if [ ! -d /etc/shadowsocks-libev ]; then

        mkdir -p /etc/shadowsocks-libev

    fi

    cat > /etc/shadowsocks-libev/config.json<<-EOF

{

    "server":${server_value},

    "server_port":${shadowsocksport},

    "password":"${shadowsockspwd}",

    "timeout":300,

    "user":"nobody",

    "method":"${shadowsockscipher}",

    "fast_open":${fast_open},

    "nameserver":"8.8.8.8",

    "mode":"tcp_and_udp"

}

EOF

}

# Firewall set

firewall_set(){

    echo -e "[${green}Info${plain}] firewall set start..."

    if centosversion 6; then

        /etc/init.d/iptables status > /dev/null 2>&1

        if [ $? -eq 0 ]; then

            iptables -L -n | grep -i ${shadowsocksport} > /dev/null 2>&1

            if [ $? -ne 0 ]; then

                iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${shadowsocksport} -j ACCEPT

                iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${shadowsocksport} -j ACCEPT

                /etc/init.d/iptables save

                /etc/init.d/iptables restart

            else

                echo -e "[${green}Info${plain}] port ${shadowsocksport} has been set up."

            fi

        else

            echo -e "[${yellow}Warning${plain}] iptables looks like shutdown or not installed, please manually set it if necessary."

        fi

    elif centosversion 7; then

        systemctl status firewalld > /dev/null 2>&1

        if [ $? -eq 0 ]; then

            firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/tcp

            firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/udp

            firewall-cmd --reload

        else

            echo -e "[${yellow}Warning${plain}] firewalld looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary."

        fi

    fi

    echo -e "[${green}Info${plain}] firewall set completed..."

}

# Install Shadowsocks-libev

install_shadowsocks(){

    install_libsodium

    install_mbedtls

    ldconfig

    cd ${cur_dir}

    tar zxf ${shadowsocks_libev_ver}.tar.gz

    cd ${shadowsocks_libev_ver}

    ./configure --disable-documentation

    make && make install

    if [ $? -eq 0 ]; then

        chmod +x /etc/init.d/shadowsocks

        chkconfig --add shadowsocks

        chkconfig shadowsocks on

        # Start shadowsocks

        /etc/init.d/shadowsocks start

        if [ $? -eq 0 ]; then

            echo -e "[${green}Info${plain}] Shadowsocks-libev start success!"

        else

            echo -e "[${yellow}Warning${plain}] Shadowsocks-libev start failure!"

        fi

    else

        echo

        echo -e "[${red}Error${plain}] Shadowsocks-libev install failed. please visit https://teddysun.com/357.html and contact."

        exit 1

    fi

    cd ${cur_dir}

    rm -rf ${shadowsocks_libev_ver} ${shadowsocks_libev_ver}.tar.gz

    rm -rf ${libsodium_file} ${libsodium_file}.tar.gz

    rm -rf ${mbedtls_file} ${mbedtls_file}-gpl.tgz

    clear

    echo

    echo -e "Congratulations, Shadowsocks-libev server install completed!"

    echo -e "Your Server IP        : \033[41;37m $(get_ip) \033[0m"

    echo -e "Your Server Port      : \033[41;37m ${shadowsocksport} \033[0m"

    echo -e "Your Password        : \033[41;37m ${shadowsockspwd} \033[0m"

    echo -e "Your Encryption Method: \033[41;37m ${shadowsockscipher} \033[0m"

    echo

    echo "Welcome to visit:https://teddysun.com/357.html"

    echo "Enjoy it!"

    echo

}

# Install Shadowsocks-libev

install_shadowsocks_libev(){

    disable_selinux

    pre_install

    download_files

    config_shadowsocks

    firewall_set

    install_shadowsocks

}

# Uninstall Shadowsocks-libev

uninstall_shadowsocks_libev(){

    clear

    print_info

    printf "Are you sure uninstall Shadowsocks-libev? (y/n)"

    printf "\n"

    read -p "(Default: n):" answer

    [ -z ${answer} ] && answer="n"

    if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then

        ps -ef | grep -v grep | grep -i "ss-server" > /dev/null 2>&1

        if [ $? -eq 0 ]; then

            /etc/init.d/shadowsocks stop

        fi

        chkconfig --del shadowsocks

        rm -fr /etc/shadowsocks-libev

        rm -f /usr/local/bin/ss-local

        rm -f /usr/local/bin/ss-tunnel

        rm -f /usr/local/bin/ss-server

        rm -f /usr/local/bin/ss-manager

        rm -f /usr/local/bin/ss-redir

        rm -f /usr/local/bin/ss-nat

        rm -f /usr/local/lib/libshadowsocks-libev.a

        rm -f /usr/local/lib/libshadowsocks-libev.la

        rm -f /usr/local/include/shadowsocks.h

        rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc

        rm -f /usr/local/share/man/man1/ss-local.1

        rm -f /usr/local/share/man/man1/ss-tunnel.1

        rm -f /usr/local/share/man/man1/ss-server.1

        rm -f /usr/local/share/man/man1/ss-manager.1

        rm -f /usr/local/share/man/man1/ss-redir.1

        rm -f /usr/local/share/man/man1/ss-nat.1

        rm -f /usr/local/share/man/man8/shadowsocks-libev.8

        rm -fr /usr/local/share/doc/shadowsocks-libev

        rm -f /etc/init.d/shadowsocks

        echo "Shadowsocks-libev uninstall success!"

    else

        echo

        echo "uninstall cancelled, nothing to do..."

        echo

    fi

}

# Initialization step

action=$1

[ -z $1 ] && action=install

case "$action" in

    install|uninstall)

        ${action}_shadowsocks_libev

        ;;

    *)

        echo "Arguments error! [${action}]"

        echo "Usage: `basename $0` [install|uninstall]"

        ;;

esac


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Google Play应用市场对于应用的targetSdkVersion有了更为严格的要求。从 2018 年...
    申国骏阅读 64,732评论 15 98
  • 《来,我们说说孤独》 1·他们都在写孤独 一个诗人 如果 不说说 内心的孤独 不将孤独 写进诗里 是不是很掉价呢 ...
    听太阳升起阅读 4,406评论 1 7
  • 自幼贫民窟长大的女子,侥幸多念了两本书,枉以为可以与人平起平坐。可是人生从来都是接力赛,我们却天真的当成了百米冲刺...
    Leeanran阅读 5,794评论 1 5
  • 云舒老师,姓甚名谁,男的女的,多大岁数,这些我全然不知。之所以要写写云舒老师,完全是因为他写的文章,如一个巨大的磁...
    数豆者m阅读 2,406评论 6 9
  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 3,254评论 0 5