网站首页/网络技术列表/内容

硬件平台我使用的路由器是WNDR37003700vv2设置

网络技术2023-08-17阅读
网络故障(network failure)是指由于硬件的问题、软件的漏洞、病毒的侵入等引起网络无法提供正常服务或降低服务质量的状态。

通过这个日志的介绍,你可以了解到:

考虑到路由器性能、连接稳定性以及配置更新的方便性,我们只在透明代理中添加了少量的Google IP,其他网站还是交给AutoProxy等插件来完成,目前支持的服务包括(但不限于):

好了,废话不多说,下面来介绍一下如何配置。

硬件平台

我使用的路由器是WNDR3700v2,参数如下:

这款机型目前在淘宝上的售价仅为150元左右,非常划算。除了性能强劲之外,这款机型还支持Serial和JTAG调试,真是不可多得的好机子。 CeroWRT项目的实验平台使用的是这款WNDR3700v2。

软件平台

我使用 OpenWRT 12.09(姿态调整)。 Backfire 10.03.1 内置的openssl库好像和-libev不兼容,可能需要手动编译解决相关问题。另外,最新版本的OpenWRT 14.07(Barrier Breaker)已于2014年7月31日发布,但我还没有在新系统上进行测试。

准备工作

OpenWRT的官方源码在国内不稳定,所以运行opkg命令很可能会卡死。为了避免这个问题,可以先用迅雷下载相关的库文件。下载地址是外链网址被屏蔽了,用浏览器打开这个网址,然后根据路由器型号选择对应的平台(比如我的是ar71xx),然后进入generic/packages目录,下载以下文件:

然后我们需要从SourceForge下载-libev和chinadns-c。对于ar71xx平台,下载以下两个文件:

然后我们需要能够将这些文件传输到 OpenWRT 路由器。在Windows下,我们可以使用putty包中提供的pscp工具。下载地址是外链网址被屏蔽了。

接下来,您需要准备一个可用的 帐户。显然,如果没有远程主机的帮助,您将无法继续。你可以在网上找到很多免费和付费的代理服务,你甚至可以搭建自己的服务器。如果成功找到代理服务,请记下密码、服务器端口号和加密方式。另外,使用ping工具获取服务器的IP地址并记下来,后面会用到。

最后,记下您的 ISP 提供的 DNS 服务器地址。 chinadns 运行时,还需要一个国内的(受污染的)DNS。后面会介绍原理。

开始配置

以上准备工作完成后,就可以正式开始配置了。首先准备一个干净的刚刚安装好的OpenWRT路由器(用过没有关系,一般情况下不会有冲突),将6个软件包复制到pscp目录下,打开命令行,输入以下命令:

pscp -scp kmod-ipt-nat-extra_3.3.8-1_ar71xx.ipk root@192.168.1.1:/tmp
pscp -scp iptables-mod-nat-extra_1.4.10-4_ar71xx.ipk root@192.168.1.1:/tmp
pscp -scp zlib_1.2.7-1_ar71xx.ipk root@192.168.1.1:/tmp
pscp -scp libopenssl_1.0.1h-1_ar71xx.ipk root@192.168.1.1:/tmp
pscp -scp -libev_1.6.1-1_ar71xx.ipk root@192.168.1.1:/tmp
pscp -scp ChinaDNS-C_1.1.8-1_ar71xx.ipk root@192.168.1.1:/tmp

完成后,将软件包上传到路由器的/tmp目录。然后用putty打开路由器地址192.168.1.1,运行如下命令:

cd /tmp
opkg install kmod-ipt-nat-extra_3.3.8-1_ar71xx.ipk
opkg install iptables-mod-nat-extra_1.4.10-4_ar71xx.ipk
opkg install zlib_1.2.7-1_ar71xx.ipk
opkg install libopenssl_1.0.1h-1_ar71xx.ipk
opkg install -libev_1.6.1-1_ar71xx.ipk
opkg install ChinaDNS-C_1.1.8-1_ar71xx.ipk

建议严格执行以上命令,以免出现软件包依赖问题。然后执行以下命令编辑防火墙规则(也可以在LuCI Web界面的网络-防火墙-自定义规则下设置):

vi /etc/firewall.user

一般情况下,#开头的注释应该只有3行。在评论下方添加以下内容

iptables -t nat -N 
iptables -t nat -F 
# server
iptables -t nat -A  -d x.x.x.x -j RETURN
# reserved networks
iptables -t nat -A  -d 10.0.0.0/8 -j RETURN
iptables -t nat -A  -d 127.0.0.0/8 -j RETURN
iptables -t nat -A  -d 172.16.0.0/12 -j RETURN
iptables -t nat -A  -d 192.168.0.0/16 -j RETURN
# google
iptables -t nat -A  -p tcp -d 74.125.0.0/16 -j REDIRECT --to-ports 8001
iptables -t nat -A  -p tcp -d 173.194.0.0/16 -j REDIRECT --to-ports 8001
# apply the rules
iptables -t nat -I PREROUTING -j 
# start china-dns
chinadns -p 5353 -s y.y.y.y,8.8.4.4 -l /etc/chinadns_iplist.txt  -c /etc/chinadns_chnroute.txt &
# start -local
ss-local -s server -p port -k password -m aes-256-cfb -l 8000 -u &
# start -redir
ss-redir -s server -p port -k password -m aes-256-cfb -l 8001 -u &

这个脚本有几点需要修改:

脚本完成后,编辑dnsmasq的配置文件:

vi /etc/dnsmasq.conf

在文件末尾添加以下两行(注意用#代替冒号):

no-resolv
server=127.0.0.1#5353

最后,保存文件并重启路由器:

reboot

路由器配置现已完成,但 Windows 可能仍使用旧的 DNS 。运行以下命令刷新 DNS 缓存:

ipconfig /flushdns

如果没有问题,那么您将能够访问 Google 搜索、Google 代码和 Gmail。手机连接WIFI后,即可直接访问Google Play!

原理分析

相信看到这里的读者一定有很多疑问:为什么要使用chinadns,为什么需要修改dnsmasq的配置文件,什么是ss-local和ss-redir等等。以下是这些问题的统一答案。

为了屏蔽谷歌的服务,长城做了很多事情,其中??最重要的两个就是DNS投毒和TCP连接重置。

DNS 协议在设计之初并没有考虑安全性。因此,当主机发送 DNS 请求“IP 地址是什么”时,防火墙可以立即向源主机发送错误的 IP 地址。源主机收到防火墙的响应后,提取了错误的IP地址,因此忽略了后面发回的正确数据包。由于DNS协议已经使用了几十年,今天更新协议相当麻烦(所有服务器和终端都必须统一更新),所以从协议上解决这个问题是不现实的。

但有趣的是,防火墙给出的错误地址仍然是国外地址(位于国外,防火墙返回了另一个错误的国外地址)。想想这样做的目的不是为了给中国服务器造成问题。想想A公司自己的网站带宽并不大。突然有一天,大量奇怪的连接请求被发送,服务器几乎无法处理。但是,正是这种行为使绕过防火墙成为可能。 chinadns本身就是一个DNS转发服务器,它工作时需要一个本地DNS和一个外部DNS(上面的脚本使用了谷歌的DNS服务器8.8.4.4),工作原理如下: ? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????

void recv_request_from_client(request r)
{
    send_to_china_dns(r);
    send_to_foreign_dns(r);
}
void recv_response(response r)
{
    if (in_fake_ip_list(r.target_ip)) {
        drop(r);
        return;
    }
    if (!is_chinese(r.target_ip)) {
        if (is_chinese(r.dns_ip)) {
            drop(r);
            return;
        }
    }
    forward_to_client(r);
}

每当收到请求时,chinadns 将请求同时发送到本地 DNS 和外部 DNS。收到响应时,如果目标IP在假IP地址列表中,则直接丢弃报文,不转发;如果目标IP是国外IP,结果是从国内DNS得到的,那么结果很可能也被污染了,所以报文被丢弃,等待国外DNS解析的结果。

通过设置以上策略,可以解决很多DNS解析问题。但是对于一些网站(比如谷歌搜索),防火墙也会发送一个TCP Reset包。当浏览器收到Reset报文时,直接中断TCP连接,浏览器会给出错误提示。解决这个问题,没有特别好的办法,只能使用代理。我们在 OpenWRT 路由器上设置了一个 代理,让它在 redir 模式下工作。当 Linux 防火墙(iptables)接收到一个特定目的地的 IP 数据包时,它会使用代理来转发它(上述脚本的第 14 和 15 行,端口 8001)。

同时,我们还建立了本地模式的本地Socks服务器,这样就不需要在PC上运行客户端了。您只需要安装相应的插件(例如在火狐下使用修改版的AutoProxy),并将Socks服务器地址设置为192.168.1.1:8000即可。

上述脚本中,只有ss-redir用于透明代理Google的两个B类地址,其他需要手动设置。目前可用的服务有:

AutoProxy 和其他类似软件维护了一个更大的列表,但考虑到性能和稳定性,完整的列表暂时没有添加到防火墙规则中。如果需要,可以手动添加自己的 IP 地址。在浏览器上(如火狐+AutoProxy),可以一键进入全局代理模式,访问结束可以取消,非常方便。但是如果要更新路由器上的规则,就比较麻烦了。这也是为什么路由器上只配置了几条规则,大部分都是由插件来处理的原因。

有些读者可能对 ss-redir 和 ss-local 仍有疑问。为什么必须配置两个后台进程而不是统一?这个问题的内在原理我暂时不是很清楚。目前能知道的是ss-redir需要配合iptables防火墙的REDIRECT规则使用,ss-local作为Socks服务器,配合相关软件设置使用。当火狐的代理端口改成ss-redir的8001后,就不行了。如果你有兴趣,可以研究一下两者工作的内在机制,然后找到确切的原因。


本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/tongxingongju/article-380306-1.html


当今,越来越多的业务应用运行于网络架构之上,保障网络的持续、高效、安全的运行,成为网络管理者面临的巨大挑战。

……

相关阅读