Shadowsocks

Shadowsocks

shadowsocks-libev

config

ss-server -s 0.0.0.0 -p 443 -u -m chacha20-ietf-poly1305 -k password --fast-open

参数:

  • --acl ACL_FILE_PATH

Config file

-c config_file_path 参数指定。

{
    "server":"1.2.3.4",
    "server_port":443,
    "local_port":1080,
    "password":"password",
    "timeout":60,
    "method":"chacha20-ietf-poly1305"
}

-u, --fast-open 等参数无法通过配置文件指定。

initscript

initscript 配置文件:/etc/default/shadowsocks-libev

# Defaults for shadowsocks initscript
# sourced by /etc/init.d/shadowsocks-libev
# installed at /etc/default/shadowsocks-libev by the maintainer scripts

#
# This is a POSIX shell fragment
#
# Note: `START', `GROUP' and `MAXFD' options are not recognized by systemd.
# Please change those settings in the corresponding systemd unit file.

# Enable during startup?
START=yes

# Configuration file
CONFFILE="/etc/shadowsocks-libev/config.json"

# Extra command line arguments
DAEMON_ARGS="-u"

# User and group to run the server as
USER=root
GROUP=root

# Number of maximum file descriptors
MAXFD=1024

Tips

"block all requests from X.X.X.X" error

这是auto ban机制,一个IP多次连接失败就会被(永久)ban,只有重启server服务器才行解封。

Fix:

Add your IP to the [white_list] section of the ACL file.

ACL

启动 ss-server 时用 --acl <acl_file> 参数指定 acl 文件路径。

ACL 文件格式:

#[accept_all]
# 除黑名单IP外,允许所有IP连接。(默认模式)

[reject_all]
# 拒绝所有IP 连接 (除了[white_list]白名单里的IP)

[black_list]
# 黑名单 IP

[white_list]
# IP白名单。在启用了 [reject_all] 的模式下,只有这里IP能够连接。
# 另外,白名单里的IP不会因为多次尝试连接失败而被自动封禁。

127.0.0.1
::1
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
fc00::/7

[outbound_block_list]
# 禁止访问列表

(^|\.)\w*adwords\w*\.\w*$

[bypass_all]
# 直连所有IP模式 (适用于 ss-local 的配置)

[proxy_all]
# 代理所有IP模式 (适用于 ss-local 的配置)

[bypass_list]
#直连列表 (适用于 ss-local 的配置)

[proxy_list]
#代理列表 (适用于 ss-local 的配置)
  • black_list / white_list 每一条记录是一个 IP 或 IP段。
  • outbound_block_list / bypass_list / proxy_list 每一条是IP、IP段或用来匹配域名的正则表达式。
  • 参考: acl.c

Docker

mritd/shadowsocks

中继服务器

可以在任意 Linux 机器上简单设置几条 iptables 规则架设 shadowsocks 服务器的中继服务器(Relay server)。

需要中继服务器具有公网IP,并且开启 IPV4 转发 net.ipv4.ip_forward=1

参考 iptables 规则:(具体原理请参考 Netfilter

SS_IP=1.2.3.4
SS_PORT=8080
LOCAL_IP=1.2.3.4 # Relay 服务器本地 IP
LOCAL_PORT=80 # Relay 服务器转发端口
iptables-save | grep -v "__ssrelaylan__" | iptables-restore
iptables -t nat -I PREROUTING 1 -p tcp -d $LOCAL_IP --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT -m comment --comment __ssrelaylan__
iptables -t nat -I PREROUTING 1 -p udp -d $LOCAL_IP --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT -m comment --comment __ssrelaylan__
iptables -t nat -I POSTROUTING 1 -d $SS_IP -p tcp --dport $SS_PORT -j SNAT --to $LOCAL_IP -m comment --comment __ssrelaylan__
iptables -t nat -I POSTROUTING 1 -d $SS_IP -p udp --dport $SS_PORT -j SNAT --to $LOCAL_IP -m comment --comment __ssrelaylan__

使用时在 shadowsocks 客户端的连接配置里使用中继服务器的 IP 和端口信息(LOCAL_IP && LOCAL_PORT)即可。这种情况下 shadowsocks 服务器“看到的”连接请求均显示为来源于中继服务器IP,建议在 shadowsocks 服务器配置里设置 ACL 规则将中继服务器 IP 加入白名单。

家庭宽带路由器作为ss中继

如果中继服务器是动态公网 IP(比如家庭宽带),那么不能直接使用 -d $LOCAL_IP 和 --to $LOCAL_IP,而应该:

  • PREROUTING 里使用 -i 指定 incoming 网卡名。
  • POSTROUTING 里使用 -j MASQUERADE 代替 SNAT。
  • (推荐)在 -t mangle PREROUTING 里对流量打标记(mark),在 -t nat POSTROUTING 里匹配标记。(防止匹配其他家庭网络里访问SS服务器的流量)。

参考配置:

SS_IP=1.2.3.4
SS_PORT=8080
LOCAL_PORT=21
WAN_IF=pppoe-wan # WAN 网卡名

ip rule add fwmark 0x4/0x4 lookup main prio 2

iptables -t mangle -I PREROUTING 1 -i $WAN_IF -p tcp --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t mangle -I PREROUTING 1 -i $WAN_IF -p udp --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -I FORWARD 1 -m mark --mark 0x4/0x4 -j ACCEPT
iptables -t nat -I PREROUTING 1 -i $WAN_IF -p tcp --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t nat -I PREROUTING 1 -i $WAN_IF -p udp --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t nat -I POSTROUTING 1 -m mark --mark 0x4/0x4 -j MASQUERADE

Tips

  • -t nat PREROUTING 里不能仅用 -m mark --mark 匹配作为条件。-j DNAT 要求必须指定协议和端口。(但 POSTROUTING 里的 SNAT / MASQUERADE 无此要求)
  • 如果路由器设置了全局翻墙,必须在路由表里添加中国IP直连规则。
  • 路由器需要配置 DDNS,然后在 ss 客户端里直接使用路由器的公网 IP 绑定的 DDNS 域名连接。

内网访问

上面的适用于家庭路由器上的 shadowsocks 中继 iptables 规则有一个缺点:只能从公网访问。家庭局域网内通过 "路由器公网IP:转发端口" 这个地址是无法转发到远程 ss 服务器上的。

如果需要支持从家庭内网里也能直接通过 "路由器公网IP:转发端口" 访问 ss,还需要在路由器 wan 的 up / down 事件里执行自定义脚本以动态添加/删除 iptables 规则。对于 OpenWrt 路由器,参考脚本:

/etc/hotplug.d/iface/60-ssrelay (脚本文件名可自定义)

#!/bin/sh

if [ "$INTERFACE" != "pppoe-wan" ]
then
        exit
fi

case "$ACTION" in

ifup)
IP=`ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';`
iptables -t mangle -I PREROUTING 1 -i br-lan -p tcp -d $IP --dport 21 -j MARK --set-mark 0x4/0x4 -m comment --comment "__ssrelaylan__"
iptables -t mangle -I PREROUTING 1 -i br-lan -p udp -d $IP --dport 21 -j MARK --set-mark 0x4/0x4 -m comment --comment "__ssrelaylan__"
iptables -t nat -I PREROUTING 1 -i br-lan -p tcp -d $IP --dport 21 -j DNAT --to 1.2.3.3:443 -m comment --comment "__ssrelaylan__"
iptables -t nat -I PREROUTING 1 -i br-lan -p udp -d $IP --dport 21 -j DNAT --to 1.2.3.4:443 -m comment --comment "__ssrelaylan__"
;;

ifdown)
iptables-save | grep -v "__ssrelaylan__" | iptables-restore
;;

esac

说明:

  • br-lan 是路由器 lan 虚拟网卡。
  • pppoe-wan 是路由器 wan 网卡。
  • 1.2.3.4:443 是 ss 服务器的 IP 和端口。
  • 脚本通过 iptables 规则的 comment 在宽带断开连接时批量清除所有旧规则。

其他方式

可以利用 Haproxy 等 TCP 代理软件架设 shadowsocks 的中继服务器。不推荐,安装和配置麻烦,占用资源多,性能上也没有优势。

shadowsocks-windows

特点:在同一端口(默认 1080) 同时提供 Socket5 和 http(s) 代理。

Problems

访问个别站(例如GETCHU)会很卡,但改用同一IP的VPN就正常

Workaround:用 Socket5代理,不要用 http(s)代理。

shadowsocks-win 自动设置的系统代理只能设为 http。如果需要使用 Socket5 模式代理,可以:

  • 安装 Chrome SwitchyOmega 扩展并使用其管理 Chrome 代理设置。
  • 使用 Proxifier 强制任何 Win32 程序使用 Socket5 代理。

Last update: 2019-11-22 02:59:10 UTC