Squid+SSH Tunnel实现加密代理

996.icu

工具和资料

前言

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

  • 有两台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,添加两行:git

    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下执行:github

    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进程便可:shell

    • 首先用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

SSH免登录

  • 为了上面的整个流程能够脚本化,还须要实现B到A的SSH免登陆
  • 首先在B上执行ssh-keygen -t rsa,在后面的交互式界面中不要设定密钥的密码
  • cat /root/.ssh/id_rsa.pub,复制公钥内容
  • 在A上编辑/root/.ssh/authorized_keys,把B的公钥文本粘贴到最后,确保独占一行,保存
  • 之后在B上执行ssh -L ...命令时,就不须要输入密码了
  • 另外,在首次ssh远程执行命令时应加上-o StrictHostKeyChecking=no参数,不然首次免密登陆仍是会被询问一次是否保存对方主机指纹
相关文章
相关标签/搜索