乐趣区

SquidSSH-Tunnel实现加密代理

工具和资料

  • QQ 群 – Javascript 高级爬虫 – 作者自建群,欢迎加入!
  • 中国商标网加密接口 – 仅作演示
  • awesome-java-crawler – 作者收集的爬虫相关工具和资料

前言

今天研究了一下如何在 CentOS 上部署 Squid 代理服务器并可加密访问,以前从来没接触过,这里记录一下。
具体需求如下:

  • 有两台 CentOS 服务器,设为 A 和 B
  • 基本要求是在服务器 A 上部署代理服务器,A- B 间建立隧道,达到客户端使用 B 的 IP 作为代理,最终却通过 A 代理上网的目的
  • 进一步要求,A 上的代理仅允许 B 连接,避免被无处不在的扫描器弄到人家的代理池中
  • A- B 间的数据传输应是加密的,即使客户端访问的是普通 HTTP 页面而非 HTTPS 页面

Squid 部署和配置

  • A 服务器上安装 Squid:yum install squid
  • 为了达到绑定 B 的 IP,需要修改配置文件,在 /etc/squid/squid.conf,添加两行:

    acl server_b src <A 的外网 IP>
    ...
    http_access allow server_b
  • 注意!如果不需要 A - B 间的加密隧道,仅仅是绑定到 B 的 IP,那么上面配置中 acl 行后面用 B 的外网 IP 即可,但若使用 SSH 隧道则实际是由本机 SSHD 转发的,因此这里需要设置成 A 的外网 IP,至于为何不能直接用 127.0.0.1,抱歉我也没搞明白(T_T)
  • 启动 Squid:squid
  • 修改配置后重启 Squid: squid -k reconfigure
  • 这时候可以 curl 验证一下本机代理是否生效:curl -x localhost:< 代理端口 > https://httpbin.org/get?showenv=1

SSH Tunnel 配置

  • 在服务器 B 的 shell 下执行:

    ssh -L 0.0.0.0:<B 的本地端口 >:< 服务器 A 的 IP>:<A 的代理端口 > root@<A 的主机名或 IP> -N -f
  • 注意:执行此条命令需要输入服务器 A 的 root 密码
  • 命令成功执行后即可建立 B 到 A 的加密隧道,注意上面的 0.0.0.0 不能省略,否则这个隧道只能从 B 本机访问
  • 如果需要关闭隧道,直接杀掉 ssh 进程即可:

    • 首先用 ps -ef | grep < 本地端口 > 找到进程 PID
    • 然后 kill -9 <PID> 即可关闭隧道
  • 用 curl 验证代理及隧道是否生效:

    • 在任意电脑上执行:curl -x <B 的外网 IP>:<B 的本地端口 > https://httpbin.org/get?showenv=1
    • 在上面 httpbin 的应答中可以看到,虽然指定代理 IP 为 B,但目标站点看到的实际访问 IP 则是 A

至此,已初步达到目的

SSH 免登陆

  • 为了上面的整个流程可以脚本化,还需要实现 B 到 A 的 SSH 免登录
  • 首先在 B 上执行ssh-keygen -t rsa,在后面的交互式界面中不要设定密钥的密码
  • cat /root/.ssh/id_rsa.pub,复制公钥内容
  • 在 A 上编辑/root/.ssh/authorized_keys,把 B 的公钥文本粘贴到最后,确保独占一行,保存
  • 以后在 B 上执行 ssh -L ... 命令时,就不需要输入密码了
退出移动版