模型

存在一个非受限区(比如互联网)和一个受限区(比如路由器后的局域网),受限区中存在一个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即可