工具和资料
- 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 ...
命令时,就不需要输入密码了