标签:privoxy

Linux服务器中代理的使用

Linux服务器中代理的使用

本文不提供任何流量代理资源抑或获取代理资源的方法,以下所述仅为解决一个异常问题的技术方案。

起因

是因为博客中想加入Goole Analytics,一搜WordPress插件库正好有个插件专门做这个,毕竟使用插件才是WordPress的风格嘛(其实就是懒了)(但是插件应该能保持文件间的低耦合性,功能也较为丰富,也是真的方便)。然而之后使用谷歌账户授权给该APP时却一直出错无法完成,错误信息是一个curl.php文件中访问了一个无法访问的ipv6地址,神秘的

** * 2404:6800:4012::200d * **

错误日志如下:

Last Error: 2017-12-18 16:14:49: Deconf_IO_Exception: Failed to connect to 2404:6800:4012::200d: Network is unreachable in /home/www/blog.darkray.cn/wp-content/plugins/google-analytics-dashboard-for-wp/tools/src/Deconf/IO/Curl.php:126
Stack trace:

0 /home/www/blog.darkray.cn/wp-content/plugins/google-analytics-dashboard-for-wp/tools/src/Deconf/IO/Abstract.php(136): Deconf_IO_Curl->executeRequest(Object(Deconf_Http_Request))

1 /home/www/blog.darkray.cn/wp-content/plugins/google-analytics-dashboard-for-wp/tools/src/Deconf/Auth/OAuth2.php(112): Deconf_IO_Abstract->makeRequest(Object(Deconf_Http_Request))

2 /home/www/blog.darkray.cn/wp-content/plugins/google-analytics-dashboard-for-wp/tools/src/Deconf/Client.php(128): Deconf_Auth_OAuth2->authenticate(‘4/AABwnP1NCe1pS…’, false)

3 /home/www/blog.darkray.cn/wp-content/plugins/google-analytics-dashboard-for-wp/admin/settings.php(1126): Deconf_Client->authenticate(‘4/AABwnP1NCe1pS…’)

4 /home/www/blog.darkray.cn/wp-includes/class-wp-hook.php(286): GADWP_Settings::general_settings(”)

5 /home/www/blog.darkray.cn/wp-includes/class-wp-hook.php(310): WP_Hook->apply_filters(”, Array)

6 /home/www/blog.darkray.cn/wp-includes/plugin.php(453): WP_Hook->do_action(Array)

7 /home/www/blog.darkray.cn/wp-admin/admin.php(224): do_action(‘toplevel_page_g…’)

8 {main}

看插件的评论,一色的外国友人表示“很好” “很赞”,没有问题反馈,大概就知道了问题出在哪儿了。接下来的若干小时便在处理如何让服务器“走向世界”这件事上了。因此本文还是以此为题比较合适。

服务器托管于腾讯云上,途中还不抱希望地提交了工单,也许奇迹发生会得到暂时的海外线路。

没有这种奇迹。不过工程师两点多的一通电话着实惊到了我。夜班辛苦。

需求

首先如同文首声明,本文没有代理资源,而你需要一个以解决该问题。

  • 一条代理渠道 一个稳定可访问的海外服务器 => 一条代理渠道;
  • 因为该插件访问地址大概率是HTTPS的,此处HTTP代理难以满足需求;
  • 本文使用shadowsocks代理实现,它本质上是SOCKS5代理,实现于OSI模型会话层,因此对上层协议不敏感。连接稳定,性能良好。但其连接安全性不佳,不适用于保密要求高的场景。

请咨询相关技术人员获取更多帮助。

环境

  • CentOS 7
  • 腾讯云单核1M带宽
  • Nginx + PHP7 + WordPress + Google Analytics for WP

方案

绕了若干圈不知从何说起。其实说起来又很简单,不过是修改插件源码+使用ss代理。

首先腾讯工程师和自己都测了,log中的那个ipv6地址是不存在的。但搜索和一些google.com的地址相似。自行大致确认被DNS污染了。(腾讯云的工单就结束掉了)

Shadowsocks

网络上能找到的大多都在介绍Windows如何使用代理,其次是教学如何搭建代理服务器,少有如何Linux使用代理。

  1. 安装shadowsocks(python版本此处足矣),需要先安装pip,可以通过安装python一并获得

– pip的安装教程很多;
pip install shadowsocks 即可。

  1. 包中分成几个部分,其中用的最多的是ssserver,其次有一个sslocal,是客户端。

  2. 编辑一个json配置文件可以省去之后在终端中手书n条参数。示例如下:

{
"server": "xxx.xxx.xxx.xxx",
"server_port":12919,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"xxxxxxxxx",
"timeout":300,
"method":"xxx",
"fast_open": false,
"workers": 1
}

以上配置替换xxx为拥有的代理资源的对应配置后即可保存使用。JSON不支持注释,故在此注释:

  • server: 远程代理服务器ipv4地址(ipv6支持未知);
  • server_port: 远程代理服务器端口;
  • local_address: 本地代理端口,python版本无法做到全局代理,将监听本地地址的端口(local_port)并通过SOCKS5转发接受到的所有流量;
  • local_port: 见local_address;
  • password: 代理服务器密码,该密码似乎也被用于加密通讯流量。固定的约定密码不具有前向安全性以及对于一些购买公用代理服务器资源的人来说……根本没有安全性可言;
  • timeout: 连接超时,建议不要更改;
  • method: 加密方法,如rc4-md5,与代理服务器配置保持一致;
  • fast_open: 一种用于加速TCP连接提高效率的新(协议?提案?proposal?),大意是在TCP三次握手中加入数据传输。未尝试开启,且仅插件本身的连接对效率要求并不是很大,较新版本Linux中可以尝试开启;
  • workers: 猜测是指工作线程数?没有注意到更详细的解释,就不要随意更改了。
  1. 之后使用sslocal命令运行,命令的详细帮助可以sslocal -h。网上大多数是使用nohup,但个人觉得命令中已经提供了后台运行指令,就使用自带参数方法较好。
sslocal -c 上一步配置文件路径 --pid-file 指定pid-file保存位置 --log-file 指定日志文件保存位置 -d start

Google Analytics for WP 插件修改

先把插件修好。

error_log很清楚了,插件目录下Curl.php出错了。该文件处在Google Analytics插件目录下,应该是该插件专用的一个工具,不影响WordPress其他模块,因此直接暴力修改源文件。

但为了之后的方便,代理配置我们将写在全局环境变量中,以便未来随时更改本地代理地址或有一天不再需要代理的时候关了它。

打开Curl.php——你可以直接在服务器使用Vi(m)编辑也可以下载到本地编辑后上传覆盖——定位至约120行处有如下代码:

$this->client->getLogger()->debug(
'cURL request',
array(
'url' => $request->getUrl(),
'method' => $request->getRequestMethod(),
'headers' => $requestHeaders,
'body' => $request->getPostBody()
)
);
// 本注释在源文件中不存在,是为了提示下一步代码的插入位置而添加
$response = curl_exec($curl);
if ($response === false) {
$error = curl_error($curl);
$code = curl_errno($curl);
$map = $this->client->getClassConfig('Deconf_IO_Exception', 'retry_map');

$this->client->getLogger()->error('cURL ' . $error);
throw new Deconf_IO_Exception($error, $code, null, $map);
}

在两个代码块中上示注释位置插入以下代码

// Read proxy settings from env
$curl_proxy = getenv('php_curl_proxy');
if (isset($curl_proxy)) {
curl_setopt($curl, CURLOPT_PROXY, $curl_proxy);
curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
}

上述代码片段设定了代理类型为SOCKS5,shadowsocks以外的代理方案请自行修改

保存/替换/覆盖。注意之后使用list检查文件权限,与同目录下其他文件权限保持一致。如果这难倒了你,请在该目录下执行以下命令sudo chmod 777 Curl.php

接下来须添加环境变量。编辑/etc/profile文件,在末尾添加以下代码:

export php_curl_proxy=‘127.0.0.1:1080’

修改后保存,然后重启php服务

service php-fpm restart

检查该插件,应该已经可以正常使用。

终端中curl命令的代理

curl命令自带代理参数,普通代理参数为-x。

网络有若干教程介绍使用Privoxy搭建http/https代理,再次监听本地端口8118并转发至shadowsocks代理1080端口。雷同的教程中有些命令有误需要修改,并且若只是偶尔使用的话,并无再次进行本地代理的必要。以下是curl内置的代理参数

curl --socks5-hostname 127.0.0.1:1080 www.google.com

命令中网站仅作示例参考

其中参数必须如此写是因为–socks5选项的域名解析似乎仍是在本地完成的,遇到如此例所示存在DNS污染,选项–socks5或-s或-x会因得不到正确的ip地址而无法正确获得内容。

正因为设置系统默认环境变量 ALL_PROXYhttp_proxyhttps_proxy 没有指明DNS的解析位置,此处需要一劳永逸的代理设置则需要Privoxy,它提供了DNS解析位置的配置。在配置文件(./configure时我加了prefix选项,我的配置文件在/usr/local/privoxy/etc/config)中搜索forward-socks5,在大约1336行处删除注释,改成如下配置即可

# To chain Privoxy and Tor, both running on the same system, you
# would use something like:
#
forward-socks5 / 127.0.0.1:1080 .
#
# Note that if you got Tor through one of the bundles, you may
# have to change the port from 9050 to 9150 (or even another
# one). For details, please check the documentation on the Tor
# website.

网上一些博文表示要使用forward-socks5t选项,但我认为socks5选项更佳,t似乎是为Tor做了一些调整,而socks5选项明确表示了DNS解析是在远程代理服务器发起的。

保存配置后执行

privoxy 配置文件位置

便已启动Privoxy,默认运行在8118端口。你可以直接curl -x 127.0.0.1:8118 www.google.com测试是否成功代理。

也可以在环境变量中添加变量http_proxy和https_proxy,之后直接curl www.google.com便可。

永久为所有用户添加环境变量必须在/etc/profile文件末尾以export命令添加(如修改Google Analytics for WP插件最后编辑/etc/profile时所做的那样),否则当前shell中export的环境变量在shell结束后将一同销毁。


后台进程太多,可以考虑使用supervisor管理一下。