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

一、文章概要

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

 二、步骤

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

多种方法: 

  1. 命令行:ssh -C -N -D LOCAL_ADDRESS:LOCAL_PORT USER@REMOTE_ADDRESS
  2. Putty
  3. MobaXteam中的MobaSSHTunnel
SSH隧道动态转发端口实现SOCKS代理 + HTTP代理_第1张图片 MobaSSHTunnel

2. Privoxy安装

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

修改配置文件:

  • 通过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 .

三、测试

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,服务器,运维)