在AWS EC2上搭建VPN服务

Page content

在AWS EC2上搭建VPN服务主要有3种比较便捷的方式:一是搭建L2TP/IPSec VPN;二是安装Shadowsocks;三是安装v2ray

用AWS相对其他VPS的好处是支持弹性IP,即使IP被封了,后台重新申请一个弹性公网IP绑定到对应的实例,可以很方便的更换IP。但AWS相对价格略贵。

搭建L2TP VPN

下载脚本

ubuntu

wget https://git.io/vpnsetup -O vpnsetup.sh && sudo sh vpnsetup.sh

centos

wget https://git.io/vpnsetup-centos -O vpnsetup.sh && sudo sh vpnsetup.sh

修改配置

YOUR_IPSEC_PSK='lockshell.com'
YOUR_USERNAME='lockshell'
YOUR_PASSWORD='1234567'

启动服务

sudo sh vpnsetup.sh

开放AWS端口

现在 vpn 服务还不能直接访问,需要将 vpn 服务端口对外网开放。vpn 服务使用到的端口有 500/4500/50/51/1701,通过配置AWS安全组可以开放这些端口。

客户端访问

Mac

  • 打开系统偏好设置 → 网络
  • 点 + 添加网络,接口选 vpn,vpn 类型选 IPSec 上的 L2TP,服务名称随意
  • 选中刚刚创建的网络,将上面生成的 vpn 凭证填入,服务器地址填 Server Ip,账户名称填 Username,点开鉴定设置,密码填 Password,共享的秘钥填 IPsec PSK
  • 点击 连接 即可

iOS

  • 设置 → 通用 → vpn
  • 添加 vpn 配置 → 类型选择 L2TP → 填入上述 vpn 凭证即可

更详细的说明,请参考:配置 IPsec/L2TP VPN 客户端

添加更多用户

直接编辑/etc/ppp/chap-secrets文件,新增用户即可,无需重启服务。

sudo vim /etc/ppp/chap-secrets

例子如下:

"user1" l2tpd "password1" *
"user2" l2tpd "password2" *
"user3" l2tpd "password3" *

搭建Shadowsocks VPN

shadowsocks可以指一种SOCKS5的加密传输协议,也可以指基于这种加密协议的各种数据传输包。shadowsocks正常工作需要服务器端和客户端两端合作实现。

  • 首先,客户端(本机)通过ss(shadowsocks)对正常的访问请求进行SOCK5加密,将加密后的访问请求传输给ss服务器端。
  • 服务器端接收到客户端的加密请求后,解密得到原始的访问请求,根据请求内容访问指定的网站(例如Google,YouTube,Facebook,instagram等),得到网站的返回结果后,再利用SOCKS5加密并返回给客户端。
  • 客户端通过ss解密后得到正常的访问结果,于是就可以实现你直接访问该网站的“假象”。

安装shadowsocks

# 更新apt-get
sudo apt-get update

# 安装python包管理工具
sudo apt-get install python-setuptools
sudo apt-get install python-pip

# 安装shadowsocks
sudo pip install shadowsocks

修改配置

vim /etc/shadowsocks/ss.json
{
    "server":"0.0.0.0",
    "server_port":9000, //ss连接服务器的端口
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"123456", // 设置ss连接时的密码
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open":false,
    "workers": 1
}

可配置多个端口和密码给不同的用户使用。

{
	"server":"0.0.0.0",
	"local_address":"127.0.0.1",
	"local_port":1080,
	"port_password":{
		"9000":"123456",
		"9001":"456",
		"9002":"789",
	},
	"timeout":300,
	"method":"aes-128-gcm",
	"fast_open": false
}

启动shadowsocks

  • 启动:sudo /usr/local/bin/ssserver -c /etc/shadowsocks/ss.json -d start
  • 停止:sudo /usr/local/bin/ssserver -c /etc/shadowsocks/ss.json -d stop
  • 重启:sudo /usr/local/bin/ssserver -c /etc/shadowsocks/ss.json -d restart

客户端访问

Shadowsocks客户端可从Github上下载,shadowsocks-android,或者Shadowsocks官网下载。

本地设备通过Shadowsocks客户端连接VPN服务器,即可实现翻墙。添加服务器,地址即为AmazonEC2的公网IP,端口为配置文件中设置的9000,密码为配置中的123456。

搭建v2ray VPN

v2ray的安装配置比前两种略复杂一些,但理论上来讲更安全可靠。还可以加一层Nginx用https代理,这样请求更安全。

安装v2ray

bash <(curl -L -s https://install.direct/go.sh) # 直接使用脚本
service v2ray start # 启动
vim /etc/v2ray/config.json # 修改配置文件

此脚本会自动安装以下文件:

  • /usr/bin/v2ray/v2ray:V2Ray 程序;
  • /usr/bin/v2ray/v2ctl:V2Ray 工具;
  • /etc/v2ray/config.json:配置文件;
  • /usr/bin/v2ray/geoip.dat:IP 数据文件
  • /usr/bin/v2ray/geosite.dat:域名数据文件 此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

运行脚本位于系统的以下位置:

  • /etc/systemd/system/v2ray.service: Systemd
  • /etc/init.d/v2ray: SysV

脚本运行完成后,你需要:

  • 编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
  • 运行 service v2ray start 来启动 V2Ray 进程;

之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。

配置v2ray

{
  "log" : {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "warning"
  },
  "inbound": {
    "port": 8080, //(此端口与nginx配置相关)
    "listen": "127.0.0.1",
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "zhangsan", //你的UUID, 此ID需与客户端保持一致
          "level": 1,
          "alterId": 64 //此ID也需与客户端保持一致
        }
      ]
    },
   "streamSettings":{
      "network": "ws",
      "wsSettings": {
           "path": "/v2ray" //与nginx配置相关
      }
   }
  },
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  },
  "outboundDetour": [
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    }
  ],
  "routing": {
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "blocked"
        }
      ]
    }
  }
}

配置Nginx

server {
    # SSL configuration
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    ssl_certificate /ssl.pem; #你的ssl证书, 如果第一次,可能还需要自签一下,
    ssl_certificate_key /ssl.key; #你的ssl key
 
    root /var/www/html;
 
    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;
 
    server_name test.v2ray.com; # 你的服务器域名
 
    location /ray { #/ray 路径需要和v2ray服务器端,客户端保持一致
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8081; #此IP地址和端口需要和v2ray服务器保持一致,
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
}

配置SSL

关于域名SSL证书,使用certbot自动签一个let’s encrypt证书就行了。很简单,参考链接: https://certbot.eff.org/

成功后, 在crontab 中添加一条任务计划每三个月执行一次,因为let’s encrypt证书三个月过期:

0 0 15 */3 * /root/certbot/certbot-auto renew  # 在3,6,9,12月份的15号零点零分执行更新

配置v2ray客户端

{
  "log": {
    "loglevel": "warning"
  },
  "inbound": {
    "port": 1080,
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "auth": "noauth",
      "udp": false
    }
  },
  "inboundDetour": [
    {
        "port": 8123,
        "listen": "127.0.0.1",
        "protocol": "http",
        "settings": {}
    }
  ],
  "outbound": {
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "test.v2ray.com", // 服务器地址,请修改为你自己的服务器 ip 或域名
        "port": 443,  // 服务器端口
        "users": [{
            "id": "zhangsan", //你的UUID, 此ID需与服务端保持一致
            "level": 1,
            "alterId": 64,  //此ID也需与客户端保持一致
            "security": "aes-128-gcm"
        }]
      }]
    },
    "streamSettings":{
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
            "serverName": "test.v2ray.com" //此域名是你服务器的域名
        },
        "wsSettings": {
            "path": "/ray" //与服务器配置及nginx配置相关
        }
    },
    "tag": "forgin"
  },
  "outboundDetour": [
    {
        "protocol": "freedom",
        "settings": {},
        "tag": "direct"
    }
  ],
  "routing": { //此路由配置是自动分流, 国内IP和网站直连
    "strategy": "rules",
    "settings": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
            {
                "type": "chinaip",
                "outboundTag": "direct"
            },
            {
                "type": "chinasites",
                "outboundTag": "direct"
            },
            {
                "type": "field",
                "ip": [
                    "0.0.0.0/8",
                    "10.0.0.0/8",
                    "100.64.0.0/10",
                    "127.0.0.0/8",
                    "169.254.0.0/16",
                    "172.16.0.0/12",
                    "192.0.0.0/24",
                    "192.0.2.0/24",
                    "192.168.0.0/16",
                    "198.18.0.0/15",
                    "198.51.100.0/24",
                    "203.0.113.0/24",
                    "::1/128",
                    "fc00::/7",
                    "fe80::/10"
                ],
                "outboundTag": "direct"
            }
        ]
    }
  },
  "policy": {
    "levels": {
      "0": {"uplinkOnly": 0}
    }
  }
}

填上你设置的对应数据,如服务器ip、端口、UUID(服务端和客户端必须一致),加密方式一般为aes-128-gcm,协议为ws,伪装域名留空,路径为/ray,开启tls和不安全传输,设置完保存。

右键V2RayN的系统栏小图标,点击启用Http代理,Http代理模式选择第二个PAC模式,最后再打开V2RayN软件面板,在检查更新里选择更新PAC。

本文由 络壳 原创或整理,转载请注明出处