我要上Google

转自:Squid+SSH Tunnel实现加密代理

前言

今天研究了一下如何在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 -C -N -f -L 0.0.0.0:<B的本地端口>:<服务器A的IP>:<A的代理端口> root@<A的主机名或IP>
  • 注意:执行此条命令需要输入服务器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 ...命令时,就不需要输入密码了