sophister / 2bugua5

工作、生活的碎碎念
12 stars 3 forks source link

VPN-科学上网 #11

Open sophister opened 6 years ago

sophister commented 6 years ago

前面两篇都被和谐了, 找到了这一篇,https://zzz.buzz/zh/gfw/2017/08/14/install-shadowsocks-server-on-centos-7/ ,为了防止再被和谐,还是把主要内容摘录到下面吧:

安装 Shadowsocks

执行安装 Shadowsocks 的命令之前,我们需要先切换到 root 用户(直接以 root 身份登入;或是以普通用户登入,通过命令 sudo su - 切换为 root 用户),或者使用普通用户,但在每条命令前加上 sudo。

另外,后续的配置也需要以 root 用户的身份进行。

具体安装 shadowsocks-libev 的命令如下:

cd /etc/yum.repos.d/
curl -O https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/repo/epel-7/librehat-shadowsocks-epel-7.repo
yum install -y shadowsocks-libev

安装完成后,会有 ss-local, ss-manager, ss-nat, ss-redir, ss-server, ss-tunnel 命令可用。

其中,作为服务器,我们需要的是 ss-server,不过后文中我们将通过服务文件启动 Shadowsocks,而不会直接与 ss-server 命令打交道。

注,如果安装报类似如下错误:

Error: Package: shadowsocks-libev-3.1.3-1.el7.centos.x86_64 (librehat-shadowsocks)
           Requires: libsodium >= 1.0.4
Error: Package: shadowsocks-libev-3.1.3-1.el7.centos.x86_64 (librehat-shadowsocks)
           Requires: mbedtls

说明系统没有启用 EPEL (Extra Packages for Entreprise Linux)。那么我们需要首先启用 EPEL,再安装 shadowsocks-libev:

yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install -y shadowsocks-libev

添加配置文件

COPR 里的 shadowsocks-libev 默认读取位于 /etc/shadowsocks-libev/config.json 的配置文件,我们可以根据需要参考以下配置文件进行修改:

{
    "server": "0.0.0.0",
    "server_port": 10443,
    "password": "zzz.buzz",
    "method": "aes-256-cfb",
    "mode": "tcp_and_udp"
}

或执行 systemctl edit shadowsocks-libev 命令,并输入以下内容:

[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE

服务端所用的加密方法,推荐以下几种算法:

  1. "chacha20-ietf-poly1305" 具有优秀的安全性,更佳的性能,属于 AEAD 加密算法,少部分客户端(如 iOS Wingy)不支持此算法;
  2. "aes-256-cfb" 具有足够安全性,且被各服务端及客户端广泛支持;
  3. "rc4-md5" 算法快速,且具有一定的安全性,适合运算能力受限的设备如路由器等。

启动 Shadowsocks 服务

有了 Shadowsocks 服务端的配置文件后,我们通过 systemd 启动 Shadowsocks 的服务端服务:

systemctl start shadowsocks-libev

要确认 Shadowsocks 的服务运行状态及最新日志,我们可以执行命令:

systemctl status shadowsocks-libev
sophister commented 6 years ago

vultr 上购买的 centos 7,默认禁用了 80 端口的外部访问,需要额外的打开80端口才行!

firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含义:
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效

# 删除端口
sudo firewall-cmd --remove-port=3306/tcp --permanent --zone=public
# 查看端口开放情况
firewall-cmd --list-all

重启防火墙:systemctl restart firewalld

来自 这篇文章

sophister commented 6 years ago

搭建ngrok内网穿透:

sophister commented 6 years ago

let's encrypt 免费获取泛域名证书

我靠,用这个证书之后,发现 https 偶尔能打开,偶尔不能打开,大部分时间都不能打开!!有人说是 会干扰,还TM时不时的干扰,你大爷的!!

抓包发现,每次 SSL 握手,都在 client hello之后卡住,server端一直 不返回。但是在 server 端抓包,发现 server 在 TCP握手结束后,立即返回了一个 FIN/ACK 的包,关闭掉了连接!但是!client很久之后才会收到这个 FIN/ACK 包。

遇到这个问题的还是很多的,比如

相关抓包工具:

发现问题了!!

当使用 openssl s_client -connect n1.chengjie.me:443 时,可以正常完成 SSL握手;但是本地使用 curl -kv "https://n1.chengjie.me/" 时,始终收不到 server hello,仔细对比 client hello 的内容,发现差了一个 server_name:没有 server_name 时,不会被干扰;有 server_name时,偶尔会被干扰。但是我搞不懂,为什么是偶尔,而不是稳定的断掉,难道不同线路或者不同 GFW机器上,部署的策略还不太一样么?还是说 GFW故意这样偶尔干扰,偶尔恢复,增加我们定位问题的难度呢,不能更坏了简直 :(

image

结合网上说的,看来 GFW 确实会解析 SNI 里的域名,进行干扰啊!!

sophister commented 6 years ago

暴露到公网了,导致很多暴力破解的 ssh 登录攻击,因此,需要 禁止密码登录,使用 ssh public key 登录,参考这篇文章

sophister commented 6 years ago

macOS 下,iTerm下的 bash,设置 http proxy,先安装 polipo将本地的 socks5代理,转换成 http代理,然后再配置 ~/.bash_profile

安装 polipo文章:为终端设置Shadowsocks代理

本地 ~/.bash_profile 配置:

# proxy list
alias proxy='export all_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123'
alias unproxy='unset all_proxy https_proxy'
sophister commented 5 years ago

let's encrypt 续期

使用了 let's encrypt 的通用证书,续期的时候,需要使用 DNS 的方式来校验,命令如下:

./certbot-auto certonly --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --manual-public-ip-logging-ok -d '*.b.ecool.fun'

## 或者用下面这个命令
./certbot-auto certonly --manual -d "xxz.ecool.fun"

接着按命令操作即可