这段时间经常被一个问题困扰,就是我本地Linux机器无法访问一些网站(原因是众所周知的),导致一些事情只能在服务器上操作。
(图源 :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
:
关闭相应选项后,果然无法通过浏览器访问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
(图源 :pixabay)
困扰我很久的问题,终于完美解决啦,搞定收工。
晚上好呀😀
我轻轻地来了,又轻轻地走了,不带走一丝云彩。
不是轻轻的我来了,悄悄的我走了,挥一挥手中匕首。不留一个活口吗
什么时候改了。
完全就是看不懂,一脸懵。