模型

存在一个非受限区(比如互联网)和一个受限区(比如路由器后的局域网),受限区中存在一个Server A因某种原因可以被非限制区的Client访问,但Client不一定能被Server A访问到。其次受限区中的域名无法正确地被非限制区的DNS所解析,尽管受限区中的DNS可以正确解析受限区与非限制区的终端,但无法被非限制区的Client访问。模型图示下

我们的目标是从Client访问Server B。

方案

一般而言,如果DNS能正确解析,那么通过Server A配置iptables转发即可,但是模型中Client无从知晓Server B正确的IP,必须要通过Server A代转域名查询请求。

因此建议使用socks5做隧道,privoxy做http协议转socks5协议。

实现

socks5使用shadowsocks-libev的实现。

Client & Server A

执行

sudo apt-get install --no-install-recommends \
gettext build-essential autoconf libtool libpcre3-dev \
asciidoc xmlto libev-dev libc-ares-dev automake \
libmbedtls-dev libsodium-dev

git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
./autogen.sh && ./configure && make
sudo make install

Server A

创建文件/etc/shadowsocks/server.json,下为范例

{
"server":"$IP",
"server_port":$Port,
"password":"$Password",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": true,
"workers": 1
}

创建文件/etc/systemd/system/ssserver.service

[Unit]
Description=Daemon to start Shadowsocks Server
Wants=network-online.target
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks/server.json
User=nobody
[Install]
WantedBy=multi-user.target

执行sudo systemctl enable ssserver

Client

创建文件/etc/shadowsocks/client.json,下为范例

{
"server":"$IP",
"server_port":$Port,
"local_port":$Port,
"password":"$Password",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": true,
"workers": 1
}

创建文件/etc/systemd/system/sslocal.service

[Unit]
Description=Daemon to start Shadowsocks Client
Wants=network-online.target
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ss-local -c /etc/shadowsocks/client.json
User=nobody
[Install]
WantedBy=multi-user.target

执行sudo apt update && sudo apt install privoxy

在文件/etc/privoxy/config末尾追加

forward-socks5 / 127.0.0.1:$Port .
listen-address  127.0.0.1:$Port

最后执行

sudo systemctl enable sslocal
sudo systemctl enable privoxy

用法

在Client通过$Port代理访问Server B即可

留下评论