v4-to-v6 ss 傻瓜教程

媷资本主义羊毛!

前言

1
本篇教程需要一张信用卡

又到一年开学季,在家用习惯了包月包年50M100M带宽的无限畅爽,来到五道口体育学院一个月20G+分档收费(据说现在改成25G+¥2/G了?)的ipv4流量简直不够用啊,然而学校的ipv6流量免费用,这让我有了一个大胆的想法(其实这个想法在明光村电脑专修学院的时候就有了,只不过形势没那么严峻而已,小破邮的筒子们你们知足吧,至少在网费这件事上你们甩我们一个五道口了)——将ipv4流量代理到ipv6,那岂不是美滋滋?

“翻♂墙”这个词是很敏感的,尤其我本科学校的前校长正是GFW之父——方老师,但是读书人不叫“翻♂墙”,叫“代♂理”!

闲扯淡了这么多,接下来谈正事。

如何在清华大学(以及其他有校园网的环境下)实现ipv4免流呢?下图是我画的一个示例图(手残晚期大家凑合着看吧)IMG_3227

假设我需要在清华校园网内上b站,正常情况下计算机跟b站服务器之间是走ipv4的,学校也就会因此计入我们的流量。跟着本博文介绍的方法一路走下去,你的计算机跟b站服务器的通信走的是绿色这条线,云服务器(本博文以亚马逊AWS EC2为例)与b站的流量是正常的ipv4,而云服务器跟校园网内的电脑之间的流量走的是ipv6。

既能翻♂墙,还能免♂流。


开始工作

你需要:

  • 一张信用卡 —— 用于注册AWS EC2
  • 确定你有ipv6访问权限

关于第一点不用多说,如果没有的话找父母借吧(滑稽

关于第二点,一般校园网环境都能访问ipv6,如果你不确定,可以尝试访问byrbt,如果出现了byrbt的登录/注册页面(当然,或者首页)那说明你能访问ipv6。如果只有ipv4访问权限,但想科学♂上网,也可以照着本篇博文一部分来做。


申请云主机

本博文以亚马逊AWS为例,类似的有google cloud、vultr等。

访问这个网页以注册一个亚马逊aws账号,它大概长这样aws

我们来做一下数学题,一天24小时,一个月最长31天,也就是说一个月最长24*31=744小时,aws每个月750小时免费时间,也就是说一直免费(滑稽

实际上,aws是按照每个实例所运行时长总和这样计时的,也就是说运行一个实例的话是免费的,如果你账号内运行着2个或更多个实例的话,在750/n个小时内是免费的,超过的部分会计费。

由于我事先已经注册过了,在这里无法提供截图。注册时会让你填写联系人、地址等信息,这些都需要用英文填写。之后要填写信用卡信息及验证,验证时会扣$1的费用,会返还(也不知道是不是,估计返还的时候都忘了这回事了)。接下来是验证手机,一定要填一个有效的手机号,填好了之后会有电话打入,请耐心听完英语,别以为是骗子就挂掉了,电话里会告诉你验证码,输入验证码之后验证完成。

注册完成后跳转到控制台,注意右上角的区域选择,大概随便一个区域都可以科学♂上网吧,我这里随便选了个区域。console

我们需要的是EC2,在AWS服务搜索框搜EC2,点击进入EC2控制台ec2

它长这样,点击“启动实例”ec2console

选择AMI,为了更好地媷资本主义羊毛,我们注意选择免费套餐ami

具体系统大家可以自行选择,本博文以Ubuntu Server 16.04 LTS (HVM), SSD Volume Type - ami-10547475这个映像为例。点击“选择”后跳转到实例类型选择,选默(mian)认(fei)的就可以。t2micro

后面的设置基本上选默认的就行,到“配置安全组”步骤,你可以创建一个新安全组,并指定流量类型、协议、端口范围、来源等等,安全组在下面会再提到。securitygroup

选完了之后就可以审核并启动了,审核的时候要求提供密钥对,这里新建一个密钥对,命名好之后浏览器会下载一个对应名字的.pem文件,保存好这个文件,以后ssh登录时需要用到这个文件。

审核启动后,可以到实例页面看到刚刚创建的实例了,它大概长这样。描述里提供了公有DNS、IP等信息,当实例状态处于running,且状态检查是“2/2 的检查已通过”时,你就可以ssh登录这个实例了。instance

这时先编辑一下安全组,实例面板最右边有该实例正在使用的安全组,点击查看该安全组,这里可以编辑入站和出站流量,为了图方便,我的入站和出站流量选择了全部流量全部协议全部端口任何来源。(比较容易被攻击,但是就是懒得弄了)sg

(我的本机是mac,所以接下来的shell代码都是unix shell,windows请自行修改)这时启动终端,定位到刚刚下载的.pem文件所在目录,将.pem文件设置为r–模式,并以该文件作为身份文件登录实例,登录实例时用”ubuntu”作为用户。

1
2
3
cd Downloads/
chmod 400 xxx.pem
ssh -i "xxx.pem" ubuntu@address.to.instance

到这里你已经可以连接到实例了。

如果你只有ipv4访问,那么你可以跳过下一节。


让实例可以访问ipv6

进入vpc控制台页面进行编辑。vpcconsole

  1. 将 IPv6 CIDR 块与您的 VPC 和子网关联

    1. 将 IPv6 CIDR 块与 VPC 关联
      1. 选择您的VPC,并记下VPC ID
      2. 选择一个VPC后点击操作,选择编辑CIDR
      3. 选择添加 IPV6 CIDR。添加完毕后选择关闭
    2. 将 IPv6 CIDR 块与子网关联
      1. 选择子网
      2. 选择上一步编辑的VPC对应的子网,点击子网操作,选择编辑 IPV6 CIDR
      3. 选择添加 IPv6 CIDR。为子网指定十六进制对 (例如,00、11) 并通过选择对勾图标来确认该条目,完成后点击关闭
      4. 对VPC中的其他子网重复上述步骤。
  2. 查看网关ID

    1. 在导航窗格中,选择Internet 网关
    2. 记下附加在第一步编辑的VPC的网关的ID
  3. 更新路由表

    1. 在导航窗格中,选择路由表并选择与私有子网关联的路由表。
    2. 路由选项卡中,选择编辑,为Destination(中文翻译问题,第一个“目标”)指定 ::/0,为Target(第二个“目标”)选择上一步记下的Internet 网关 ID,然后点击保存
  4. 更新安全组规则

    1. 在导航窗格中,选择安全组,并选择VPC对应的 Web 服务器安全组。
    2. 与前文提到的安全组类似,编辑入站、出站规则,注意源和目标的地址要包括你的IPV6地址(::/0)。
  5. 更改实例

    1. 回到EC2控制台页面
    2. (将前面创建的实例终止,点击实例,选择对应实例,点击操作实例状态终止,稍等片刻,待实例状态显示terminated即可)
    3. 启动实例,重复上文提到的操作,直到配置实例步骤,在网络选项,选择前面编辑的VPC。在子网选项,选择一个子网。在自动分配公有 IP自动分配 IPv6 IP选项,选择带有“启用”的选项。
    4. 其他选择默认即可。
  6. 为实例分配 IPv6 地址

    1. 返回EC2控制台页面,在导航窗格中选择实例
    2. 选择刚才创建的实例,然后选择操作联网管理IP地址
    3. IPV6地址下,选择分配新IP,可以输入子网范围内的特定 IPv6 地址,也可以保留默认的 Auto-Assign 值,让 Amazon 选择一个地址。
    4. 选择是,请更新
  7. (可选) 在实例中配置 IPv6

    如果经过上述步骤,实例仍无法访问IPV6,可以进行以下步骤。

    1. 使用实例的公有 IPv4 地址连接到您的实例。

    2. 查看 /etc/network/interfaces.d/50-cloud-init.cfg 文件的内容:

      1
      cat /etc/network/interfaces.d/50-cloud-init.cfg
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # This file is generated from information provided by
      # the datasource. Changes to it will not persist across an instance.
      # To disable cloud-init's network configuration capabilities, write a file
      # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
      # network: {config: disabled}
      auto lo
      iface lo inet loopback
      auto eth0
      iface eth0 inet dhcp

      确认已配置回环网络设备 lo,记下网络接口的名称。在此示例中,网络接口名称为eth0;根据实例类型,此名称可能不同。

    3. 创建文件 /etc/network/interfaces.d/60-default-with-ipv6.cfg 并添加以下行。如果需要,将 eth0替换为在上一步中检索到的网络接口的名称。

      1
      iface eth0 inet6 dhcp
    4. 重启实例,或者通过运行以下命令重新启动网络接口。如果需要,将 eth0 替换为在第一步中检索到的网络接口的名称。

      1
      sudo ifdown eth0 ; sudo ifup eth0
    5. 重新连接到实例,并使用 ifconfig 命令验证网络接口上是否配置了 IPv6 地址。

    其他系统可参考这个页面

    至此,你的实例应该能访问ipv6地址了。你可以登录实例然后输入以下指令验证:

    1
    ping6 ipv6.google.com

    在这个地方也会显示你实例的ipv6地址ipv6


搭建shadowsocks服务器

以ubuntu为例,用ssh连接到实例之后,安装pip、shadowsocks以及必要组件。

1
2
3
4
5
ubuntu@ip-xx-xx-xx-xx:~$ sudo -s
root@ip-xx-xx-xx-xx:~# apt-get install update
root@ip-xx-xx-xx-xx:~# apt-get -y install python3-pip
root@ip-xx-xx-xx-xx:~# pip3 install shadowsocks
root@ip-xx-xx-xx-xx:~# apt-get -y install python-m2crypto

安装完成后可以执行ssserver -h以验证shadowsocks是否安装成功,若成功则会出现如下提示:

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
root@ip-xx-xx-xx-xx:~# ssserver -h
usage: ssserver [OPTION]...
A fast tunnel proxy that helps you bypass firewalls.
You can supply configurations via either config file or command line arguments.
Proxy options:
-c CONFIG path to config file
-s SERVER_ADDR server address, default: 0.0.0.0
-p SERVER_PORT server port, default: 8388
-k PASSWORD password
-m METHOD encryption method, default: aes-256-cfb
-t TIMEOUT timeout in seconds, default: 300
--fast-open use TCP_FASTOPEN, requires Linux 3.7+
--workers WORKERS number of workers, available on Unix/Linux
--forbidden-ip IPLIST comma seperated IP list forbidden to connect
--manager-address ADDR optional server manager UDP address, see wiki
General options:
-h, --help show this help message and exit
-d start/stop/restart daemon mode
--pid-file PID_FILE pid file for daemon mode
--log-file LOG_FILE log file for daemon mode
--user USER username to run as
-v, -vv verbose mode
-q, -qq quiet mode, only show warnings/errors
--version show version information
Online help: <https://github.com/shadowsocks/shadowsocks>

如果没有ssserver命令的话,可以执行which ssserver指令查找:

1
2
root@ip-xx-xx-xx-xx:~# which ssserver
/usr/local/bin/ssserver

只需要把/usr/local/bin加入到/etc/profile文件中即可。

创建shadowsocks目录,并创建ss配置文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@ip-xx-xx-xx-xx:~# mkdir /etc/shadowsocks
root@ip-xx-xx-xx-xx:~# vim /etc/shadowsocks/config.json
{
"server":"::",
"server_port": 8388,
"password":"yourpsw",
"method":"aes-256-cfb",
"local_address":"127.0.0.1",
"local_port":1080,
"timeout":300,
"fast_open":true,
"workders":1
}

其中”server”项填”::”是为了让ss同时监听ipv4和ipv6流量,”server_port”项填入你希望的外部端口。编辑完成后按esc,输入:wq退出。

执行ssserver -c /etc/shadowsocks/config.json -d start启动ss,其中-d参数是使ss在后台进程中运行。

启动后执行netstat -tunlp指令查看:

1
2
3
4
5
6
7
8
9
10
root@ip-xx-xx-xx-xx:~# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1270/sshd
tcp6 0 0 :::8388 :::* LISTEN 9421/python3
tcp6 0 0 :::22 :::* LISTEN 1270/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 1547/dhclient
udp 0 0 0.0.0.0:42836 0.0.0.0:* 9421/python3
udp6 0 0 fe80::8aa:e7ff:fe67:546 :::* 1620/dhclient
udp6 0 0 :::8388 :::* 9421/python3

其中两个端口号为8388的就是我这个实例启动的ss进程了。


客户端连接ss服务

ss服务器搭建完毕后,我们需要一个客户端以连接ss服务器。

客户端:

  1. Windows - release
  2. MacOS - release
  3. iOS - release
  4. Android - release

以MacOS的ShadowsocksX-NG为例,下载安装后,点击软件图标→服务器→服务器设置setting

点击左下角的“+”,在地址栏填入实例的ipv6地址(如果没有ipv6访问权限的话,填入实例的ipv4地址或者ipv4 dns也可以科学♂上网)及ss端口号,加密方法填ss配置文件config.json里设置的method项,这里用的是aes-256-cfb,填入密码点击确定即可。serversetting

然后点击软件图标,选择全局模式! 选择全局模式! 选择全局模式!一定要选择全局模式,然后选择打开 Shadowsocks即可。global


后记

注意:

  1. 要先在登录页面登录之后再打开shadowsocks服务,不然无法联网(至少在清华是这样的,不知道其他学校是否需要先登录校园网)。经测试,不登录才是正确的打开方式。。。。
  2. 关于代理方式,如果不嫌麻烦的话可以选择手动模式,然后用socks5代理到localhost:1086,否则一定要选全局模式,如果选择自动模式的话,访问没有被GFW墙的网站(如b站)将不走代理,也就是说走正常的ipv4(第一张图的蓝色线),我在开始的时候忘记选全局模式,测试的时候流量蹭蹭的就没了T_Tnet
  3. 占了小便宜,就得有一定的限制,这个限制就是网速会比较慢,毕竟是国外的云服务器,开国内的网站做不到秒开,而且部分网站也刷不出来。另外,使用全局模式时不登录校园网的话将无法登录qq、微信等应用,解决方法是登录校园网后ss客户端选择手动模式然后用socks5代理到localhost:1086。
  4. 亚马逊AWS的免费期限是一年,一年之后你要是不把实例删除干净的话,它是自动续费的。如果你只是想体验一下,不想续费的话,最好的办法还是按时删除实例。但是我这个人记性经常不好,一年时间大概早就把这件事忘得一干二净了,所以我还写了个程序,运行在实例上,在一年后差不多要续费的时候提醒我删除实例,如果你也想要这个提醒的话,可以参考这里:BillingReminder