在Linux 桌面系统下,用shadowsocks + iptables + ss-redir 实现全局代理


为了实现socks5全局代理我研究了很多天,网上的教程都不是给小白看的,很多问题根本没有说指出,作为一个小白,我一定详细的写好这篇文章,让每个人都能配置好全局代理! 
好了,其实首先就是要有一个服务器,网上的有的文章有的根本没提服务端需要的配置(服务端代理也必须也为socks5,因为我之前服务端有https代理,我以为就不需要配置服务端了,这让我走了很多坑)

1.配置服务端

在终端下载 shadowsocks-libev 这个软件,不同系统下载的方法不同,主要就是分两类系统下载 
(ubuntu 类)

sudo apt-get install shadowsocks

或者(centos类)

sudo yum install shadowsocks

下载完成后会有ssservice 这个工具 命令就是

ssservice -c 配置文件

下面我来写一个配置文件 配置文件内容如下(如果大家要复制粘贴的话一定要把注释去掉,否则不能正确执行的)

{
    "server":"xx.xx.xx.xx", //你的服务器的ip地址
    "server_port":80, //客户端访问服务器的端口(这个端口一定是开着的,保证客户端可以访问到服务器的代理),
    "password":"xxxxxxx", //密码 随便设置(不过必须要设置一个密码,否则服务不能运行)
    "method":"rc4-md5",  //这个必填,就写这个rc4-md5就行了
    "local_address":"0.0.0.0",//这个必须为0.0.0.0
    "local_port":1080, //设置1080就可以了
    "fast_open":false //这个没什么用,如果设置true说是可以提高加载速度,不过我感觉也没什么效果,按照其他文章写得都是false,所以我们也设置为false吧
}

这里还要注意最后一个配置项结束后没有逗号,其余每个配置项都要有逗号 
写完这个配置项 把它保存为 shadowsocks.json(其实保存什么样的后缀名都可以读出来,不过我还是习惯于写.json了) 
然后运行命令

ssservice -c shadowsocks.json

如果报错

socket.error: [Errno 98] Address already in use

就说明你的端口(我配置文件中设置的是80,这个看你设置的是多少了)被占用了 
两种解决办法 、 
1.结束掉占用端口的服务 
2.换别的端口 
怎么结束,或者怎么查看自己开启的端口 百度去吧,我这里不多说了

如果没报错 服务端就已经配好了

2.客户端 
下载shadowsocks-libev 
ubuntu类型系统 输入

sudo apt-get install shadowsocks-libev

如果没找到这个软件那就可以下载我的资源点我点我! 
注意:这个软件是deb的如果你是centos系列的那就没办法了,去github搜索shaodowsocks-libev这个项目自己编译安装吧!

centos类型系统 输入

sudo yum install shadowsocks-libev

安装完成后会有ss-redir 
命令就是

ss-redir -c 配置文件

配置文件同理还是以json为后缀名 
配置文件如下(自己新建一个shadowsocks.json文件,如果大家要复制粘贴的话一定要把注释去掉,否则不能正确执行的)

{
    "server":"xxx.xxx.xxx.xxx",  //服务器ip地址
    "server_port":80,  //访问服务器的端口(要跟你服务器上面设置的一样,我设置的是80)
    "timeout":600,  //设置的超时,按照我设置的就可以了
    "password":"xxxxxxx",  //密码要跟你服务器上设置的一样
    "method":"rc4-md5",  //还是跟服务器上配置的一样
    "local_address":"0.0.0.0",  //这个必须为0.0.0.0
    "local_port":1080,  //设置1080就行
    "fast_open":false   //和服务器上配置的一样
}

这个配置完后我们还需要写一些iptables规则,打开命令行,输入如下:

iptables -t nat -N SHADOWSOCKSR
iptables -t nat -A SHADOWSOCKSR -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 100.64.0.0/10 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 240.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKSR -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKSR
iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKSR

(上面的命令要切换到root用户去执行的,因为我发现有的普通用户是没有iptables命令的)

为了方便大家复制粘贴,我在下面简单的说一下这几条的命令的大致含义 
就是把你本机所有产生的流量转发给1080端口去处理,而上面的大多数的命令是忽略局域网产生的流量,就是不转发局域网产生的流量(具体链什么含义去看http://www.linuxidc.com/Linux/2016-09/134832.htm这篇文章,很详细) 
删除上面的命令是

iptables -t nat -F

其实你现在的全局代理就可以用了,在命令行里输入

ss-redir -c shadowsocks.json

这样你的全局代理就生效了

但是这些命令输入完之后,重启后就会失效,而且还需要启动ss-redir服务,所以我们这里做一个脚本 
脚本的功能是: 
1.运行这个脚本会执行iptables这些命令 
2.启动ss-redir这个服务 
3.按回车后,关闭ss-redir 这个服务,并删除所用iptables的规则 
脚本如下:

#!/bin/bash
iptables -t nat -N SHADOWSOCKSR
iptables -t nat -A SHADOWSOCKSR -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 100.64.0.0/10 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKSR -d 240.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKSR -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKSR
iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKSR
ss-redir -c /home/wshuo/shadowsocks.json &
read -p "按回车关闭代理"
killall ss-redir
iptables -t nat -F
echo "已经退出代理"
exit 0

(这个脚本要在 root 用户下执行,因为iptables的命令是root下的) 
把这个脚本保存为 dl.sh 文件 
这样你只需输入./dl.sh 
就能启动全局代理,而你按一下回车就退出全局代理 了,很方便.