安装 shadowsocks-libev 服务器端

版本信息

本文测试环境:

  • Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)
  • shadowsocks-libev 2.6.3

安装 shadowsocks-libev 并设置 ss-server 开机自动启动

取出 shadowsocks-libev 源码,并切换到到 v2.6.3 分支:

$ git clone https://github.com/shadowsocks/shadowsocks-libev.git
$ cd shadowsocks-libev
$ git checkout v2.6.3
$ git submodule update --init --recursive

安装依赖:

$ sudo apt install autoconf automake libtool pkg-config libmbedtls-dev libsodium-dev libpcre3-dev libev-dev libudns-dev asciidoc xmlto make

编译并安装:

$ ./autogen.sh && ./configure && make
$ sudo make install

添加配置文件 /usr/local/etc/shadowsocks-libev/config.json:

{
    "server":"a.b.c.d",
    "server_port":8388,
    "local_port":1080,
    "password":"barfoo!",
    "timeout":60,
    "method":"aes-256-cfb"
}

注意修改 “server”:”a.b.c.d” 中的 a.b.c.d. 为你的服务器的外部 IP 地址,修改 password 和 method,其它参数按照需要修改。

设置开机时自动启动 ss-server,在 /etc/rc.local 的 exit 0 之前添加如下代码:

/usr/local/bin/ss-server -u -A -c /usr/local/etc/shadowsocks-libev/config.json > /dev/null 2>&1

配置 iptables 保护服务器 (可选)

由于实际使用中,shadowsocks-libev 客户端的 IP 地址可能是动态变化的,比如某次 PPPoE 拨号后 IP 地址可能就发生了变化。因此我们使用了 DDNS 来跟踪客户端 IP 地址,客户端通过 DDNS 来主动向 name server 上报 IP 地址,shadowsocks-libev 服务器需要在客户端 IP 地址发生变化后及时地修改 iptables 防火墙规则。

下面的防火墙规则中使用了 ipset (可以通过命令 apt install ipset 来安装)来存储客户端的 IP。

添加文件 /usr/local/bin/iptables.sh(注意 chmod +x):

#!/bin/sh
iptables -F

ext_ip="a.b.c.d"

ipset -exist create clients hash:net

# ping: allow ping from IPs in clients only
iptables -A INPUT -p icmp --icmp-type 8 -m set --match-set clients src -d ${ext_ip} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -s ${ext_ip} -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j DROP

# ss-server: allow from IPs in clients only
iptables -A INPUT -p tcp -m set --match-set clients src --dport 8388 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m set --match-set clients dst --sport 8388 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 8388 -j DROP
iptables -A OUTPUT -p tcp --sport 8388 -j DROP

注意修改 ext_ip=”a.b.c.d” 中的 a.b.c.d 修改为你的服务器的外部 IP 地址。
如果你有其它 iptables 规则请自行解决。

添加文件 /usr/local/bin/update-clients-ip.sh(注意 chmod +x),这段脚本通过向 name server 查询文件 /usr/local/etc/clients.txt 中的域名列表的 IP,在 IP 发生变化时更新 ipset:

#!/bin/sh
PATH=$PATH:/bin:/usr/bin

for domain in $(cat "/usr/local/etc/clients.txt"); do
	ip_file="/tmp/update-clients-ip.${domain}"
	ip_file_log="${ip_file}.log"
	ip_file_old="${ip_file}.old"
	ip_file_new="${ip_file}.new"

	mv -f "${ip_file_new}" "${ip_file_old}" 2>/dev/null
	dig +short @ns1.example.net "${domain}" > "${ip_file_new}"
	diff -N "${ip_file_old}" "${ip_file_new}" > /dev/null

	if [ $? -eq 1 ]; then
		echo -n "`date -R` " >> "${ip_file_log}"
		cat "${ip_file_new}" >> "${ip_file_log}"

		[ -r "${ip_file_old}" ] && cat "${ip_file_old}" | xargs -I ip ipset -exist del clients ip
		[ -r "${ip_file_new}" ] && cat "${ip_file_new}" | xargs -I ip ipset -exist add clients ip
	fi
done

注意修改其中 ns1.example.net 为你自己的 name server。

添加文件 /usr/local/etc/clients.txt,文件内容为你的客户端的域名列表:

yourclient1.example.net
yourclient2.example.net

设置开机时自动运行 iptables 相关脚本,在 /etc/rc.local 的 exit 0 之前添加如下代码:

/usr/local/bin/iptables.sh
/usr/local/bin/update-clients-ip.sh

定时运行 update-clients-ip.sh,在 /etc/crontab 里增加:

* *	* * *	root	/usr/local/bin/update-clients-ip.sh

可以使用命令 ipset list clients 来查看 clients 里有哪些 IP 地址。

Advertisements

#crontab, #ddns, #ipset, #iptables, #rc-local, #shadowsocks-libev, #ubuntu