Ubuntu 安装 shadowsocks Simple-obfs 插件客户端配置

用shadowsocks翻墙,为什么还要用混淆插件

普通用户上网,多数是访问的 http://kige.com 或 https://kige.com 这样的网址,每个人访问了什么页面,有关方面是一清二楚,毫无秘密可言

用了 shadowsocks 加密访问以后,白脸知道我们访问了海外的某个 IP 地址,并不知道我们通地这个 IP 地址在做什么,比如访问了什么页面,页面上有什么,他们是不知道的

有人推测,如果较多的流量访问海外某 IP 不常用端口,可能会被怀疑,你不浏览网页(他们不知道你是在翻墙浏览网页),这是在干啥呢,难道是不是良民?

于是有人就提出一个混淆流量的设想,把 shadowsocks 加密后的流量混淆一下,白脸喜欢在管理后台偷偷观察我们在网上干什么,加密的数据再混淆一下,白脸在后台看到我们只是在普通的上网,有时打开我们经常上的网站看开一下,一个美女也没有,又是一个无趣至极的人!!

Simple-obfs 就是 shadowsocks 的一个混淆流量的插件

Ubuntu 给 shadowsocks-libev 安装 simple-obfs 混淆流量插件

安装环境: Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-34-generic x86_64)

sudo apt-get install simple-obfs

Preparing to unpack .../simple-obfs_0.0.5-2_amd64.deb ...
Unpacking simple-obfs (0.0.5-2) ...
Setting up simple-obfs (0.0.5-2) ...

打印一下命令行选项:

obfs-server --help

-s <server_host>           Host name or IP address of your remote server.
-p <server_port>           Port number of your remote server.
-l <local_port>            Port number of your local server.
-r <addr>:<port>           Forward traffic to this remote server address.
--obfs <http|tls>          Enable obfuscating: HTTP or TLS (Experimental).

[-a <user>]                Run as another user.
[-f <pid_file>]            The file path to store pid.
[-t <timeout>]             Socket timeout in seconds.
[-c <config_file>]         The path to config file.
[-n <number>]              Max number of open files.
[-b <local_address>]       Local address to bind.

[-6]                       Resovle hostname to IPv6 address first.

[-d <addr>]                Name servers for internal DNS resolver.
[--fast-open]              Enable TCP fast open.
                            with Linux kernel > 3.7.0.
[--mptcp]                  Enable Multipath TCP on MPTCP Kernel.

[-v]                       Verbose mode.
[-h, --help]               Print this message.

Linux Ubuntu server Showdosocks-libev 启用 siimple-obfs 混淆插件

kige@ubuntu:~$ cd /etc/shadowsocks-libev
kige@ubuntu:/etc/shadowsocks-libev$ ls
config.json  config-obfs.json

查看一下 config.obfs.json 的默认设置:

cat config.obfs.json

{
    "server":"127.0.0.1",
    "server_port":8388,
    "local_port":1080,
    "password":"veotFuFl",
    "timeout":600,
    "method":"chacha20-ietf-poly1305",
    "mode":"tcp_and_udp",
    "fast_open":true,
    "plugin":"obfs-server",
    "plugin_opts":"obfs=tls;failover=127.0.0.1:8443;fast-open"
}

我们要把 simple-obfs 作为 shadowsocks-libevr 的插件使用,shadowsocks-libev 的默认配置文件是 config.json,所以要把 config.obfs.json 的内容合并到 config.json:

# nobfs means not obfsed
sudo cp config.json config.nobfs.json
sudo cp config.obfs.json config.json
sudo vi config.json
# 修改成类似如下值

{
    "server": ["[::0]", "0.0.0.0"],
    "server_port": 1098,
    "password": "killgfw",
    "timeout": 600,
    "method": "chacha20-ietf-poly1305",
    "mode": "tcp_and_udp",
    "fast_open": true,
    "ipv6_first": true,
    "plugin": "obfs-server",
    "plugin_opts": "obfs=http;fast-open=true"
}

其中 server_port, password, method 可以自定义一下

["[::0]", "0.0.0.0"] 意思是让 simple-obfs 服务端监听本地,优先IPv6

操作系统开启 TCP fast_open 后才能在 config.json | shadowsocks.json 中设置

"fast_open": true

TFO开启成功以后,shadowsocks服务端和客户端数据交换的速度会更快一点,也就是翻墙会更加流畅一些

设置 Linux nginx 反向代理到 obfs-server

假设你的服务端已经安装了 nginx,并有了默认网站 kige.com, /etc/nginx/sites-availabe/kige.com 是你的网站配置文件

先备份一下原来的网站配置文件:

cd /etc/nginx/sites-available
sudo cp kige.com kige.com.nobfs

nobfs means not obfsed

到域名管理面板给网站 kige.com 增加一个子域名,这里是 32.kige.com

ping 32.kige.com

如果正常,ping 子域名可以看到服务端 IP 和响应时间

/etc/nginx/sites-available/kige.com 文件中加入一个新的 server 段代表新建的子域名。为了管理方便,我们不把设置加到既有 server 段中。反向代理主要设置在 / location {}

首先要理解 反向代理 的概念。我们浏览一个网页,一般是通过 nginx 把内容传送到我们的计算机上,这是从服务端 nginx 到我们计算机的数据流动,这种情况可以视为 正向代理,nginx 充当了信息传递的代理人

反向代理时,nginx 不是向外部的我们传递数据,而是向内部的一个程序传递数据,方向是不是反过来了?在这里,nginx 是向 simple-obfs 的服务端 obfs-server 传递数据

下面开始编辑 /etc/nginx/sites-available/kige.com,添加一个 server 段

sudo vi kige.com
# reverse proxy settings in / location field

server {
  listen 80;
  server_name 32.kige.com;
  charset utf-8;
  gzip on;
  keepalive_timeout 120s;
  location / {
    if ($http_upgrade = "") {
      return 301 https://www.kige.com$request_uri;
    }
    proxy_pass http://[::0]:1098;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

下面是 https 版本的加密反向代理(2024-08-19):

server {
	server_name kige.com;
    listen [::]:443 ssl;
    listen 443 ssl;
    location / {
        if ($http_upgrade = "") {
          return 301 https://kige.com$request_uri;
        }
    proxy_pass http://[::1]:1096;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
    ssl_certificate /etc/letsencrypt/live/kige.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kige.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    if ($host ~ ^[^.]+\.kige\.com$) {
        return 301 https://kige.com/;
    }
    listen 80;
    listen [::]:80;
    server_name kige.com;
}

注意,nginx 配置是空格比较敏感的,if ( 中间有个空格

reverse proxy 反向代理用到 nginx 的一个模块,一般 nginx 版本已经自带,用法见下面的链接

相关资源