linux使用ss代理

好久之前就想有什么方法实现linux上的shell代理,因为有很多时候用shell下载东西的时候奇慢。今天我终于找到了,太不容易了吧

原理:使用shadowsocks代理,代理需要提供服务器,而我们可以找到免费的vpn用,所以这个问题就解决了。第二个问题是shadowsocks使用的是socks5协议,而大多数时候我们使用的是http协议,所以需要proxychains来转换。

安装:

1
pacman -S shadowsocks proxychains-ng

配置shadowsocks

shadowsocks的配置文件在/etc/shadowsocks/下,复制一个作为配置文件

1
cp example.json config.json

然后在这个里面填上免费的vpn服务器信息。地址在:不需要翻墙 需要翻墙

1
2
3
4
5
6
7
8
9
10
11
12
{
"server":"23.160.193.75",
"server_port":2133,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"www.eieee.cn",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false,
"workers": 1,
"prefer_ipv6": false
}

启动

用shadowsocks客户端启动:指定到我们的配置文件,并放到后台运行

1
nohup sslocal -c /etc/shadowsocks/config.json >/dev/null 2>&1 &

还可以不指定配置文件,直接在命令行里面指定

1
sslocal -s server_address -p server_port -l local_port -k password -m encryption_method

使用proxychains

proxychains用来实现协议的转换,并指定需要代理的软件,或者设置为全局代理

编辑proxychains的配置文件:

1
2
3
vim /etc/proxychains.conf
#在最后面添加转换的地址
socks5 127.0.0.1 1080

然后就是使用代理了

1
2
#例如代理firefox浏览器
proxychains firefox &
1
2
#也可以代理shell
proxychains zsh

既然每次都要打开网页去找免费的代理,那么何不写个自动化脚本呢?

建立一个软链接,用户自己的shell放置的位置为/usr/local/bin下面:

1
ln -s /home/jc/Document/script/shell/shadowsocks.sh /usr/local/bin/sslink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/zsh

clear
echo -e -n "\033[32m do you wanna to scartch another new vpn file ? yes or no : \033[0m"
read wanna

realdir=`whereis sslink | awk -F ":" '{print $2}' | xargs ls -l | awk -F ">" '{print $2}' | xargs dirname`
cd $realdir
if [[ $wanna == "yes" ]];then
#curl https://www.youneed.win/free-ss > tmp.txt | sed -n '/^<td/p' | awk -F">" '{print $2}' | awk -F "<" '{print $1}' | sed -n '1,/&nbsp/p' | sed 's/&nbsp;/ /g' | xargs -n6 > account.txt
curl https://www.flywind.ml/free-ss > tmp.txt | sed -n '/^<td/p' | awk -F">" '{print $2}' | awk -F "<" '{print $1}' | sed -n '1,/&nbsp/p' | sed 's/&nbsp;/ /g' | xargs -n6 > account.txt
fi

i=1
j=`cat account.txt | wc -l`
while [[ $j -gt 0 ]]
do
s=`sed -n ''"$i"'p' account.txt | awk '{print $1}'`
p=`sed -n ''"$i"'p' account.txt | awk '{print $2}'`
k=`sed -n ''"$i"'p' account.txt | awk '{print $3}'`
m=`sed -n ''"$i"'p' account.txt | awk '{print $4}'`
c=`sed -n ''"$i"'p' account.txt | awk '{print $6}'`
ss="sslocal -s $s -p $p -k $k -m $m -l 1080 & #$c"
sum[$i]=${ss}
((i++))
((j--))
done

select m in ${sum[*]}
do
for (( k=1;k<${#sum[@]};k++ ))
do
case $m in
${sum[k]})
id=`ps -ef | grep sslocal | grep -v grep | awk '{print $2}'`
if [[ $id -gt 0 ]];then
killall sslocal
echo -e "\033[32m the sslocal process has been killed successfully \033[0m"
fi
echo -e "\033[32m connecting ....................................................................................... \033[0m"
eval $m 2>/dev/null 1>&2 &
;;
esac
done
done
rm tmp.txt

这样每次都只需要运行sslink这个命令就ok了