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參數,不然首次免密登陸仍是會被詢問一次是否保存對方主機指紋
相關文章
相關標籤/搜索