2019年7月25日
我要上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 ...
命令时,就不需要输入密码了