每天进步一点点:在Linux命令行设置代理,Socks5与Socks5h的区别

这段时间经常被一个问题困扰,就是我本地Linux机器无法访问一些网站(原因是众所周知的),导致一些事情只能在服务器上操作。

image.png
(图源 :pixabay)

于是我想了一个办法,就是用一台树莓派做了个代理,然后在本地机器上设置通过代理访问网络,这样貌似可以解决问题。

Linux 命令行下设置代理

先来说如何在Linux命令行下设置代理,好像相关的工具有很多,比如说connect-proxy以及proxychains等。不过我有洁癖,不喜欢在系统中随随便便装一些软件包。

那么是否有不用安装软件,就可以在Linux命令行下通过代理访问网络呢?答案是有的。

比如说,使用类似如下命令:

curl -x socks5://ip:port https://baidu.com

其中ip、port是我socks5代理对应的信息。

<html>
<head><title>302 Found</title>head>
<body bgcolor="white">
<center><h1>302 Found</h1>center>
<hr><center>bfe/1.0.8.18</center>
</body>
</html>

上述请求会返回如上内容(亦即重定向请求),说明我代理是生效着的。

然而有些工具并没有类似curl中的-x这样的代理选项,那要如何让其通过代理访问网络呢?

答案是,我们只需在命令行下执行如下命令即可:

export http_proxy=socks5://ip:port
export https_proxy=$http_proxy

这样,命令行中的所有http以及https流量都会通过代理访问,比如上述的curl指令就可以省却其中的-x选项。

上述命令在终端断开后即会失效,每次开启终端都要重新设置一下,我们可以将其加入.bashrc中,这样每次登录就会自动生效啦。

Socks5与Socks5h的区别

搞明白了在命令行下设置代理,显然是一件让人无比开心的事情,然而,当我测试如下指令时,我就开心不起来了:

curl google.com

这个并没有任何返回信息,这是为啥呢?我百思不得其解。使用如下指令,同样没有响应:

curl -x socks5://ip:port https://google.com

但是在浏览器中设置代理,却可以正常访问Google,这是为啥呢?

我苦思冥想,浏览器中使用socks5代理,和命令行下使用scoks5代理,会有什么差异会导致一个能访问,一个不能访问呢?

思前想后,我想到唯一的差异,大概就是浏览器中除了代理,我还设置了DNS over HTTPS:
image.png

关闭相应选项后,果然无法通过浏览器访问Google啦,那么如何在命令行中也启用DNS over HTTPS呢?最终我发现,原来Sock5代理可以设置DNS走本地还是远程。

SOCKS5 with remote DNS (proxy_url='socks5h://...)
SOCKS5 with local DNS (proxy_url='socks5://...)

这条指令应该是工作的(socks5h):

curl -x socks5h://ip:port https://google.com

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE>HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY>HTML>

上述指令果然成功地返回如上内容(301重定向)。

接下来,我们把命令行中设置代理的指令,修改成使用远程DNS,亦即:

export http_proxy=socks5h://ip:port
export https_proxy=$http_proxy

image.png
(图源 :pixabay)

困扰我很久的问题,终于完美解决啦,搞定收工。

相关链接

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center