草庐IT

SSH隧道动态转发端口实现SOCKS代理 + HTTP代理(Privoxy)

noobiee 2024-03-13 原文

一、文章概要

  • 实现效果:ssh连接远程服务器进行网络转发,本地服务连接网络代理
  • 环境:windows11/10
  • 需要工具:MobaXterm(ssh隧道端口转发),Privoxy(socks转http代理),一个云服务器

 二、步骤

1. 用SSH从本地计算机连接远程主机

多种方法选一种即可: 

  1. 命令行:ssh -C -N -D LOCAL_ADDRESS:LOCAL_PORT USER@REMOTE_ADDRESS
  2. Putty客户端
  3. MobaXteam中的MobaSSHTunnel
MobaSSHTunnel

2. Privoxy安装和配置

1. 官网下载压缩包版本 http://www.privoxy.org/

2. 修改配置文件:

  • 通过listen-address指定HTTP代理的监听地址和端口。默认privoxy的配置文件会带有这一项。

其格式为:listen-address  [ADDRESS]:[PORT] 

默认值是:listen-address  127.0.0.1:8118

  • 通过forward-socks5指定转发到socks代理

默认privoxy的配置文件不会配置这一项。

forward-socks5支持的格式比较复杂,但是这里只需要简单的写成如下内容就可以了:

forward-socks5 / [SOCKS_ADDRESS]:[SOCKS_PORT] .

其中“/”所在的位置是一个URL模式,与之匹配的URL都会转发到这个项目指定的socks代理。“/”这个值表示把所有请求都转发到socks5代理上去

例如:forward-socks5 / 127.0.0.1:9150 .

!注意

listen-address指定http代理监听地址只允许本地访问该端口,允许局域网(LAN)访问需要设置为:listen-address  0.0.0.0:8118

三、测试与使用

1. 浏览器

Chrome + Switchyomega:支持socks5代理

2. 命令行(Powershell)

curl -Uri www.google.com -proxy http://127.0.0.1:8118

windows中的curl命令其实是包装的Invoke-WebRequest

3. python

使用urllib3库进行测试

http代理测试代码:

import urllib3
import json

proxy_addr = 'http://127.0.0.1:8118'
print(f'代理地址:{proxy_addr}')

proxy = urllib3.ProxyManager(proxy_addr)
resp = proxy.request('GET', 'https://httpbin.org/ip')
print(resp.data.decode('utf-8'))

socks代理测试代码

from urllib3.contrib.socks import SOCKSProxyManager
import json

proxy_addr = 'socks5://127.0.0.1:80'
print(f'SOCKS5代理地址:{proxy_addr}')

proxy = SOCKSProxyManager(proxy_addr)
resp = proxy.request('GET', 'https://httpbin.org/ip')
print(resp.data.decode('utf-8'))

url = 'https://www.google.com'
resp = proxy.request('GET', url)
print(f'返回状态码:{resp.status}')

四、遇到的坑

1. ping不通但是浏览器能连上?

简言之,就是ping走的是ICMP协议,在网络层(第三层),而ssr用的是socks代理是传输层 (第四层),上层协议无法对下层协议起作用,因此ping不通,但是通过http(超文本传输协议,应用层协议,在比socks代理层数更高)却可以访问。

大部分都不支持socks代理,而支持http代理

2. ssh隧道开启socks代理,其他代理隧道开启什么代理?

HTTPS代理隧道开启https、WebSocket隧道开启ws、ICMP隧道

References

建立和使用代理服务器 -doc文档

Privoxy教程使用详解_privoxy是什么东西_ZhaoYingChao88的博客-CSDN博客

有关SSH隧道动态转发端口实现SOCKS代理 + HTTP代理(Privoxy)的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  3. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  6. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  7. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  8. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  9. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  10. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

随机推荐