sock5代理及隧道

1 引出

 

https://www.cnblogs.com/du-better/p/6519502.html

java 使用代理发邮件

java发送邮件功能支持代理,但是不支持http代理,支持sock代理(支持SOCKS V4或V5协议)并且连接代理不需要用户名和密码

使用的是JDK版本需要1.5或者更高,javaMail包必须是1.4.5或者更新,可以用mail.smtp.socks.host和mail.smtp.socks.port

复制代码
复制代码
public Properties getProperties() {
        Properties props = new Properties();
        props.setProperty("proxySet", "true");
        props.setProperty("mail.smtp.socks.host","代理IP");
        props.setProperty("mail.smtp.socks.port","代理端口");

        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.163.com");
        return props;
    }
复制代码
复制代码

 

如果JavaMail包很旧(1.4.5之前的),这种方法不建议使用。

复制代码
复制代码
public Properties getProerties() {
        Properties props = System.getProperties();
        props.setProperty("proxySet", "true");
        props.setProperty("socksProxyHost","代理IP");
        props.setProperty("socksProxyPort","代理端口");

        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.163.com");
        return props;
    }
复制代码
复制代码

这样也可以实现通过代理发邮件,但是必须使用System.getProperties(),这是系统级属性,会将TCP套接字指向SOCKS代理,例如数据库连接。

 实现发邮件功能:

复制代码
复制代码
public void sendMessage(String msg) throws Exception {

        Properties props = getPro();

        // 获得邮件会话对象
        Session session = Session.getInstance(props, new SmtpAuthenticator(
                "邮件用户名", "邮件密码"));
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress("test1@163.com"));// 发件人
        // 一个人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("test2@163.com"));// 收件人

        mimeMessage.setSubject("认证接口欠费或异常");
        mimeMessage.setSentDate(new Date());// 发送日期
        Multipart mp = new MimeMultipart("related");// 发送HTML格式的邮箱
        BodyPart bodyPart = new MimeBodyPart();// 正文
        bodyPart.setDataHandler(new DataHandler(msg, "text/html;charset=GBK"));// 网页格式
        mp.addBodyPart(bodyPart);
        mimeMessage.setContent(mp);// 设置邮件内容对象
        Transport.send(mimeMessage);// 发送邮件
    }
复制代码
复制代码

SmtpAuthenticator.java

复制代码
复制代码
class SmtpAuthenticator extends Authenticator {
        String username = null;
        String password = null;

        // SMTP身份验证
        public SmtpAuthenticator(String username, String password) {
            this.username = username;
            this.password = password;
        }

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(this.username, this.password);
        }
    }
复制代码
复制代码

 

 

下面是官方文档解释:

问:如何将JavaMail配置为通过我的代理服务器工作? 
A: JavaMail当前不支持通过Web代理服务器访问邮件服务器。 使用代理服务器的主要原因之一是允许来自公司网络的HTTP请求通过公司防火墙。 防火墙通常会阻止对Internet的大多数访问,但将允许来自代理服务器的请求通过。 此外,公司网络内的邮件服务器将对电子邮件执行类似的功能,通过SMTP接受邮件并将其转发到Internet上的最终目的地,并接受传入邮件并将其发送到相应的内部邮件服务器。

如果您的代理服务器支持SOCKS V4或V5协议( http://www.socks.nec.com/aboutsocks.html,RFC1928 )并允许匿名连接,并且您使用的是JDK 1.5或更高版本和JavaMail 1.4.5或较新的,您可以通过设置com.sun.mail.smtp软件包的javadocs中所述的“mail.smtp.socks.host”属性,在每个会话,每个协议的基础上配置SOCKS代理。 类似的属性存在于“imap”和“pop3”协议。

如果您使用的是旧版本的JDK或JavaMail,则可以让Java运行时将所有TCP套接字连接指向SOCKS服务器。 有关socksProxyHostsocksProxyPort属性的最新文档,请参阅网络属性指南 。 这些是系统级属性,而不是JavaMail会话属性。 它们可以在调用应用程序时从命令行进行设置,例如:java -DsocksProxyHost=myproxy ... 此工具可用于将SMTP,IMAP和POP3通信从JavaMail指向SOCKS代理服务器。 请注意,设置这些属性会将所有 TCP套接字指向SOCKS代理,这可能会对应用程序的其他方面产生负面影响。

没有这样的SOCKS服务器,如果要使用JavaMail间接访问防火墙外的邮件服务器,您可以使用诸如Corkscrew之类的程序或通过HTTP代理服务器连接 TCP 连接 。 JavaMail不支持通过HTTP代理Web服务器的直接访问

 

  

 

 

 

 

2 使用socks 5 代理作为系统代理(2025年1月)

1 )腾讯云东京

浏览器一塌糊涂(https透明代理也是),curl偶尔成功

 

 不勾选后,确实传递到代理的是ip

 而safiri和chrome使用mac代理时,后端永远是域名,所以系统代理默认就托管dns到代理了,结合https透明代理也有问题,这样看东京那个服务器有问题

 

2 )阿里云杭州

三大浏览器都可

优酷不行,意味着优酷里面有协议没支持socks

所以还是要VPN,专门建立通道,连接直达对方

 

https://www.cnblogs.com/cc11001100/p/9949729.html

 

在客户端访问域名的时候,涉及到一个问题,这个域名是应该是客户端解析完告诉代理服务器ip还是应该把域名交给代理服务器去解析?

一般客户端的默认行为是域名在客户端解析,然后再将解析出来的ip拿给代理服务器去处理,但是对于一些网站来说通过ip访问是不成功的,比如google的dns解析,国内机器解析到的ip可能已经被污染,笔者实验发现对于在阿里云服务器访问google解析到的ip 74.86.151.162:443,通过ip访问是不能成功的,而在微软云机器上解析到的ip 172.217.161.164:443,通过ip可以访问成功,将域名交给代理服务器,代理服务器在美国,解析到的ip是能够访问成功的,所以在使用socks5的时候最好能够指明域名是在本地解析还是在代理服务器解析:

默认是在本地解析完将ip传给代理服务器:

1
curl --socks5 "23.225.xxx.xxx:10086" https://www.google.com

image

通过socks5-hostname指定域名交给代理服务器解析

1
curl --socks5-hostname "23.225.xxx.xxx:10086" "https://www.google.com"

image 

curl中关于这部分的说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--socks5-hostname <host[:port]>
       Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If the port number is not specified, it is assumed at port 1080. (Added in 7.18.0)
 
       This option overrides any previous use of -x, --proxy, as they are mutually exclusive.
 
       Since 7.21.7, this option is superfluous since you can specify a socks5 hostname proxy with -x, --proxy using a socks5h:// protocol prefix.
 
       If this option is used several times, the last one will be used. (This option was previously wrongly documented and used as --socks without the number appended.)
 
--socks5 <host[:port]>
       Use the specified SOCKS5 proxy - but resolve the host name locally. If the port number is not specified, it is assumed at port 1080.
 
       This option overrides any previous use of -x, --proxy, as they are mutually exclusive.
 
       Since 7.21.7, this option is superfluous since you can specify a socks5 proxy with -x, --proxy using a socks5:// protocol prefix.
 
       If this option is used several times, the last one will be used. (This option was previously wrongly documented and used as --socks without the number appended.)
 
       This option (as well as --socks4) does not work with IPV6, FTPS or LDAP.

Chrome浏览器的SwitchyOmega的socks5代理是会将域名传给代理服务器解析。

 

 https://blog.csdn.net/penetrate/article/details/52353613

linux上运行了socks5的代理客户端之后,发现我的iphone在局域网的详细信息里竟然无法设置socks代理,只有http代理,而我的代理客户端又不支持http代理,所以找了下iphone上设置socks代理的方法,记录如下:

HTTP Prxoy有3种模式: 关闭Off/手动Manual/自动Auto

用自动配置文件,就可以支持socks代理

 

  1.  
    function FindProxyForURL(url, host)
  2.  
    {
  3.  
    return "SOCKS proxy_host:proxy_port";
  4.  
    }


将上面的proxy_host和proxy_port换成socks服务器实际的IP地址和端口 
然后保存为 proxy.pac 
放到 http://zhiwei.li/proxy.pac 
在 iPhone设备中,添加自动配置 URL 为上面的地址,就可以使用socks代理了。 

 

 

https://www.zhihu.com/tardis/bd/ans/3374886575

下载Proxifier

 

 

https://blog.csdn.net/logocool/article/details/139295444

socks5 如何让dns不被污染

问题
发现firefox浏览器代理设置成socks5后,查看ip是成功了,但是谷歌等海外的还是无法正常访问。

原因
主要原因是socks5连接虽然是成功了,但是dns还是走国内的,国内的dns解析都被污染了导致没法正常访问

解决
把设置里的 使用SOCKS v5 时代理DNS查询

既然是dns被污染了,dns 的ip是设置在我们电脑,为什么这个勾选上就知道走socks5服务器的dns呢?

翻了下sokcs5的协议有个 AdreesType 为0x03的类型,实际上就是用来请求域名的。 所以实际不是把 dns的请求包发给Socks5服务器,而是发了个特殊的命令。

我们抓包看下socks5的连接请求

DNS代理请求后面会带了域名

 对比下没有DNS代理的包,  看后面跟着是IP +端口, 由于dns污染返回的是错的ip。  socks5去访问这个 错的ip当然是不通了

 

https://yr7ywq.smartapps.baidu.com/?_chatQuery=windows%2Bsocket5代理&searchid=8246449664258517682&_chatParams=%7B%22agent_id%22%3A%22c816%22%2C%22chat_no_login%22%3Atrue%2C%22content_build_id%22%3A%221342df2%22%2C%22from%22%3A%22q2c%22%2C%22token%22%3A%22YN3Ckf9%2F0q5prgS9HHUq8IOtfzF7SNNWmrnCmjLyN1CnkSGrIi1tMmrsbA0bg8%2BrW5lY%2B%2F3aWmeC8RCKphFPws12gdwMh5aNEP9E43wr3ntDL8Dyr5Minuw%3D%22%7D&tplname=ai_agent_distribute&srcid=1599&lid=8246449664258517682&order=3&_swebScene=3711000610001000

常用的Windows Socket5代理软件或工具

  1. ‌Goproxy‌:
  • 一个由Golang实现的高性能HTTP、HTTPS、WebSocket、TCP、SOCKS5代理服务器,支持多种功能和跨平台运行。
  1. ‌Dante‌:
  • 一个免费的SOCKS代理服务器,提供安全性和TCP/IP终止、资源控制、日志记录和身份验证等功能。
  1. ‌Gost‌:
  • 一个用Go语言实现的安全隧道,支持多端口监听、可设置转发代理,同时支持包括SOCKS5在内的多种代理协议。
  1. ‌Hysteria‌:
  • 一个功能丰富的代理加速工具,专为恶劣网络环境进行优化,基于修改版的QUIC协议。
  1. ‌WARP‌:
  • Cloudflare推出的一款服务,可以用来保护使用者隐私,基于WireGuard协议,可以额外提供SOCKS5代理支持。

 

 

 

 

3 隧道(20250218)

3.1 https://blog.csdn.net/2401_86436868/article/details/142168849

TUN/TAP 是操作系统内核中的虚拟网络设备,由软件进行实现,向操作系统和应用程序提供与硬件网络设备完全相同的功能。其中 TAP 是以太网设备(二层设备),操作和封装以太网数据帧,TUN 则是网络层设备(三层设备),操作和封装网络层数据帧。

当应用程序发出报文后,报文将通过操作系统协议栈处理,到达网络设备,硬件网络设备将收到的报文转化为电信号发出,而虚拟网络设备(TUN/TAP)不具备实际的物理功能,报文需要上层应用进行处理

3.2 https://blog.csdn.net/Lid_23/article/details/132110210

TUN/TAP是一对虚拟网络设备接口,用于在用户空间程序和内核之间进行数据传输。TUN代表"网络隧道",而TAP代表"以太网适配器"。

TUN/TAP是一对虚拟网络设备接口,它们是Linux内核中的一部分。TUN设备被用于处理IP协议数据包,而TAP设备则处理以太网帧。使用TUN/TAP接口,用户空间程序可以像操作物理网络设备一样操作这些虚拟设备,从而实现对网络数据包的捕获、修改和注入等操作。TUN/TAP设备的实现基于Linux内核的网络栈,并通过设备文件的形式暴露给用户空间

3.3 https://blog.csdn.net/weixin_30270889/article/details/99323785

若要实现在 Linux 下的代理程序,方法有很多,比如看着 RFC 1928 来实现一个 socks5 代理并自行设置程序经过 socks5 代理等方式,下文是使用 Linux 提供的 tun/tap 设备来实现 UDP 代理隧道的大体思路和过程讲解。

tun / tap 是由 Linux (可能还有其他 *NIX 系统提供支持)提供的,可以用来实现用户态的网络路由等处理的虚拟网络接口。也就是说,它们允许用户态的程序直接管理这个网络接口,而不是让内核协议栈来处理网络包

TUN 和 TAP 分别是虚拟的三层和二层网络设备,也就是说,我们可以从 TUN 拿到的就是 IP 层的网络数据包了,而 TAP 则是二层网络包,比如以太网包。因为我只打算对 IP 层的包进行处理

TUN 设备可以由程序创建和销毁(这种情况下即便程序没有主动的销毁创建的 TUN 设备,程序退出时 TUN 设备也会自行销毁),也可以使用 cli 工具创建和销毁,比如 ip tuntap ,tunctl ,或是 openvpn --mktun。在我们用程序实现之前,我们先使用 ip tuntap 来创建一个 TUN 设备来进行简易的测试。

建立一个 tun 设备(网络接口),然后设置路由表把数据包路由到 tun 设备里

由于 tun 设备需要我们编写用户态的程序来操作数据包,所以需要写个东西来处理包数据的 IO 。tun 是三层设备,故能拿到的都是三层( IP 层)的包了。

当开始处理包时,我们就可以在 wireshark 或其他类似软件中看到流经该 tun 的网络包了。

 

作为最简单的实践,我们可以写一个无脑的程序去伪装远程端响应我们网络设备中出现的 ICMP 包,首先本地拦截 123.123.123.123 到我们的 TUN 网络设备,然后我们在 ping 的时候,就可以从 TUN 中 read 到 ICMP 包了,那么接下来,我们只需要互换 IP 包的源地址和目的地址,并修改 ICMP 包中的标志位为 ECHO_REPLY ,(别忘了重算包的checksum)然后写回 TUN 设备,就可以让 ping 程序认为远程端服务器正确的做了响应了。

那么服务端怎么把客户端发来的包写到网卡中,又怎么把远程端服务器返回的数据包捕获到程序中呢?

为了让我们的数据包发出去后远程端返回的数据包依然能回到我们的代理隧道服务端程序所处的服务器上,我们自然要对数据包进行一次 sNAT。而假如我们把源地址改成了服务器的 IP,返回的数据包就会进入服务器的默认网络接口。一旦数据包进入由内核控制的网络接口,内核协议栈就会处理 SYN 包并自动做出响应,如果我们隧道中的 TCP 数据包发出去,结果远程端服务器与我们的服务器建立的连接,这就很糟糕了,于是我们需要让我们的数据包不经过协议栈处理而由我们控制。

我们能控制什么?当然是 TUN 设备啦!还记得我们可以给 TUN 设备指定网络地址吗?我们可以在服务端也建立一个 TUN 设备,并指定一个内网网络地址(我假设指定的是192.168.61.123),我们把要发的数据包写入该 TUN ,数据包就发出去了。接下来呢?我们当然是写一条 iptables 规则来把数据包导到我们的 TUN 设备了。大概是这样的:

GitHub: BLumia/udptun

 

3.4 https://blog.nsfocus.net/linux-tun-tap/

在linux的tcp/ip协议栈中tap/tun设备所处的地位以及这种技术的使用和实验讲解。本文只讨论以太网的物理网卡,并且以linux 3.x内核的一个UDP包的发送过程作为示例

 

3.5 https://www.zhihu.com/tardis/bd/art/601733049?source_id=1001

Tap(网络接口层)

与 Tun 原理和用途类似,只不过 Tap 工作在网络接口层,Tun 处理 IP 报文,而 Tap 处理以太帧。

 

3.6 https://www.zhihu.com/question/580303670?utm_id=0

我们知道不管是SOCKS还是HTTP代理,都是应用层的代理。所以即使是在系统设置了全局代理,总有一些程序倔强,不按系统设置走代理。于是就有了TUN/TAP这类虚拟网卡。

虽然数据在内核和用户态之间来来回回,但对现在的电脑硬件来讲,也不算什么,至少日常看看视频上网都没问题。 

TUN/TAP在windows上的实现

Tap Windows Adapter V9

openvpn默认的虚拟网卡,支持二层和三层转发,效率不如wintun。

Wintun

WireGuard默认的虚拟网卡,仅仅支持三层转发,本次实验采用wintun。

 

posted on   silyvin  阅读(67)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2019-10-10 ymm (yet)
2017-10-10 spring-data-redis序列化实践笔记
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示