标签归档:UA

Nginx反爬虫: 限制可疑User Agent抓取网站

一、概述

网站反爬虫的原因

  • 不遵守规范的爬虫会影响网站的正常使用
  • 网站上的数据是公司的重要资产
  • 爬虫对网站的爬取会造成网站统计数据的污染

常见反爬虫手段

1. 根据 IP 访问频率封禁 IP

2. 设置账号登陆时长,账号访问过多封禁 设置账号的登录限制,只有登录才能展现内容 设置账号登录的时长,时间一到则自动退出

3. 弹出数字验证码和图片确认验证码 爬虫访问次数过多,弹出验证码要求输入

4. 对 API 接口的限制 每天限制一个登录账户后端 api 接口的调用次数 对后台 api 返回信息进行加密处理

二、nginx反爬设置

站点配置文件

因为user-agent带有Bytespider爬虫标记,这可以通过Nginx规则来限定流氓爬虫的访问,直接返回403错误。 修改对应站点配置文件(注意是在server里面)

添加红色部分

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  index index.html index.htm index.nginx-debian.html;

  server_name _;

  location / {
    try_files $uri $uri/ =404;
  }
  #forbidden Scrapy
  if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
    return 403;
  }

  #forbidden UA
  if ($http_user_agent ~ "Bytespider|FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|python-requests|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {

    return 403;
  }
  #forbidden not GET|HEAD|POST method access
  if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
  }
}

附录:UA收集

FeedDemon             内容采集
BOT/0.1 (BOT for JCE) sql注入
CrawlDaddy            sql注入
Java                  内容采集
Jullo                 内容采集
Feedly                内容采集
UniversalFeedParser   内容采集
ApacheBench           cc攻击器
Swiftbot              无用爬虫
YandexBot             无用爬虫
AhrefsBot             无用爬虫
YisouSpider           无用爬虫(已被UC神马搜索收购,此蜘蛛可以放开!)
jikeSpider            无用爬虫
MJ12bot               无用爬虫
ZmEu phpmyadmin       漏洞扫描
WinHttp               采集cc攻击
EasouSpider           无用爬虫
HttpClient            tcp攻击
Microsoft URL Control 扫描
YYSpider              无用爬虫
jaunty                wordpress爆破扫描器
oBot                  无用爬虫
Python-urllib         内容采集
Python-requests       内容采集
Indy Library          扫描
FlightDeckReports Bot 无用爬虫
Linguee Bot           无用爬虫
使用python验证

python验证

使用requests模块

import requests
# 最基本的不带参数的get请求
r = requests.get('http://192.168.28.229')
print(r.content)

使用urllib模块

import urllib.request
response = urllib.request.urlopen('http://192.168.28.229/')
print(response.read().decode('utf-8'))

返回403就表示起作用了。

b'<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body>\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'

三、整站防护设置

示意图

第一层

robots.txt

robots是网站跟爬虫间的协议,用简单直接的txt格式文本方式告诉对应的爬虫被允许的权限,也就是说robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。

注意:它只是做了协议规定,是否允许将爬取的数据收录,不影响网页访问。

备注:对于手动写爬虫技术人员而言,一般都是直接忽略掉的。

如果不允许所有的爬虫蜘蛛访问,内容如下:

User-agent: *
Disallow: /

第二层

useragent特征拦截

因为user-agent带有Bytespider爬虫标记,这可以通过Nginx规则来限定流氓爬虫的访问,直接返回403错误。

具体操作,请查看上面的nginx配置。

备注:这样可以防止一部分爬虫访问,以及初级爬虫人员。

第三层

JS发送鼠标点击事件

有些网站,你从浏览器可以打开正常的页面,而在requests里面却被要求输入验证码或者是重定向到其他的页面。 原理:当点击登录时,触发js加密代码,复杂的加密算法参数+时间戳+sig值,后台进行 参数+时间的限制。验证成功后,才可以登录。

备注:爬虫高手需要模拟浏览器行为,加载js代码以及图片识别,才能正常登陆。

第四层

后台接口限制

1. 根据 IP 访问频率封禁 IP(注意:频率要控制好,否则容易误伤。) 2. 设置账号登陆时长,账号访问过多封禁。     设置账号的登录限制,只有登录才能展现内容 设置账号登录的时长,时间一到则自动退出 3.弹出数字验证码和图片确认验证码     爬虫访问次数过多,前端弹出验证码要求输入 4.对 API 接口的限制     每天的登录账户,请求后端 api 接口时,做调用次数限制。对后台 api 返回信息进行加密处理

通过这4层设置,就可以有效的保护数据的安全了

电信、连通要求限制电脑数量联网解决办法

原文且维护更新地址:在厦大宿舍安装路由器

前言

厦大一些宿舍要求用一个客户端联网,所以不能装路由器;17 年暑假我找到了获得真实的 PPPoE 用户名的方法,于是可以绕过绕过这个客户端联网,也可以安装路由器。除此以外,有时用客户端联网会出现一些奇怪的问题(我见过几例,网页打不开或者客户端报错什么的),也可以用这个办法,不用客户端联网直接拨号解决。下面会介绍这个方法。

2018 年七夕前后,学校开始检测时间戳和 UA 来判断一个账号是否共享给了多台设备使用(不论是安装路由器还是在电脑上开热点)。如果检测到就会禁止账号联网半个小时(认证日志显示“检测到代理”);随后我也找到了绕过检查的办法。下面也会介绍这个方法。

如果在阅读的过程中有问题,可以 QQ 联系(897331845)。如果是小白寻求帮助,请在联系我之前确认自己的网线没问题也插对了,确认自己的密码没有弄错,不要因为这些问题浪费大家的时间。如果是来交朋友的,那么非常欢迎。

为了避免被查水表,我还需要多说几句废话:

  1. 对于任何硬、软件的损坏,本人不赔偿,也不保证协助处理,哪怕这样的后果是因教程中的错误造成的;你需要自担风险。出现问题时,我应该会尽力协助,但我不是专业技术人员,没有能力也没有义务保证教程内容万无一失。尽管我还没有遇到过把路由器弄坏的例子,但读者也需要做好损失一台价值几十元或者几百元的路由器的心理准备。另外,本教程中的内容会使你的路由器失去保修。
  2. 对于因为安装路由器而可能造成的事故,我不负责。请设置足够复杂的管理员密码,并妥善保存;如果发生了安全事故(资金被盗、个人信息泄露等),与本人无关。
  3. 厦大宿舍明令禁止安装路由器,相关文件点击这里可以查看。我没有怂恿或建议任何同学安装路由器,安装路由器的行为完全是安装者的个人意志导致的,本人仅仅是作为技术交流的发起者而存在。请仅仅以学习研究为目的鼓捣路由器,并在安装好路由器之后 24 小时内再将之拆除;如果您喜欢上网,请按照学校指明的方式连接到互联网。如果学校根据校规等文件追究责任,与我无关。
  4. 不允许将此技术用于任何商业行为,我本人也保证不会用来赚钱,而会将研究结果无偿地公布出来,只为造福同学的同时顺便装逼
  5. 不要发表不文明的言论。虽然我也觉得学校这样做很不厚道,但说脏话还是不好的。鼓励积极地传播这篇文章,以及义务地帮助身边有需要的同学。

简单地安装路由器(绕过客户端联网)

非常简单:

  1. 确认自己在“厦门大学宽带认证客户端”(就是电脑联网时需要使用的那个软件)中填写的那个学号,以及选择的是电信还是移动。如果忘掉了,先把正确的试出来。

  2. 将学号按照下面的规则转换(实质上是 ASCII 码加四),在前面加上{SRUN2},在后面加上@cmcc(移动)或@ctnet(电信),得到用户名。

转换前 0 1 2 3 4 5 6 7 8 9
转换后 4 5 6 7 8 9 :(英文冒号) ;(英文分号) < =

例如,小明的学号为19720192203456,移动,则用户名为{SRUN2}5=;645=664789:@cmcc

  1. 用户名对应的密码就是“厦门大学宽带认证客户端”中填写的密码。

  2. 如果目标是解决网络问题,在电脑创建 PPPoE 拨号(不会就去百度),把用户名密码填进去,直接拨号就可以了;如果目标是装路由器,将这个用户名和密码按正常的方法填入路由器,按通常方法设置就可以了。有的奇葩路由器用户名不能包含大括号,那就换一台。

我最先找到的办法是在系统日志里找用户名;后来经过别人提醒,才发现用户名有这样的规律。


配置防止共享检测

学校的共享检测并不十分严格,并不总是可以检测到装或者没装路由器;是否被查到看人品,有的人可能几天才会被查到一次。如果要装路由器,建议先不用配置防止共享检测,如果接下来总是被封掉的话,再来配置。

下面的内容中,我假设读者已经熟悉了通常情况下安装路由器的方法。你要是完完全全的小白,那这个不适合你,找你身边会的人或者我帮你做吧。

安装 OpenWrt

这一节的目标是:得到一台安装好 OpenWrt 的路由器。

“OpenWrt”(Linux 的一个发行版)是一个安装在路由器上的操作系统。OpenWrt 对路由器的性能要求较高,所以只有一部分中高端的路由器可以安装。淘宝或者咸鱼上可以很容易找到已经安装好 OpenWrt 的路由器售卖,最便宜大概五十块钱就可以买到;也可以自己买一台路由器,自己动手安装 OpenWrt。

OpenWrt 的官网是 openwrt.org,打开比较慢需要耐心等待。在这里直接搜索你的路由器的型号,一般来说就可以找到一个详细的页面,上面会详细地说明这个型号是否支持安装 OpenWrt 以及在哪里下载、怎样安装等。也可以直接百度或者谷歌,常常也可以找到详尽的中文教程。不同型号的路由器,安装方法不尽相同;任何版本的 OpenWrt 都是可以用来绕开检测的,并且安装方法没有区别;推荐安装官方最新稳定版。当然了,如果无论如何也找不到相关的资料,那说明这个路由器不能安装 OpenWrt。

路由器的型号(Model)在路由器背面就可以看到。有时,同一个型号中还会分几个不同的硬件版本。

有的路由器会注明“基于 OpenWrt 深度定制”,不要买,除非你有办法刷回原版 OpenWrt。有的路由器会注明安装了“明月永在”或其它非官方版本的 OpenWrt,也可以买,但因为无法拿到这个系统的 SDK,所以在接下来的步骤中要么受限制、要么还需要自己再刷回官方版本;具体情况后面会说明。

“LEDE”和 OpenWrt 几乎一样,可以当作 OpenWrt 来用。

在很多情况下,安装 OpenWrt 只需要在管理页面中使用“系统更新”或“固件升级”功能,就可以将 OpenWrt 安装好(使用文件名以factory.xxx结尾的那个文件,勾选“不保留配置”)。

安装好 OpenWrt 后,建议等系统完全启动后,马上再断电重启一遍。

由于这一步没有统一的方法,虽然比较麻烦,但无法更详细地写下去了。

配置上网

现在,你已经有了一台安装好 OpenWrt 的路由器。这一节的目标是,让你的 OpenWrt 可以上网,以及配置好无线。

方法和配置大多路由器差不多,只不过 OpenWrt 没有面向新手的一目了然的指引,而需要在繁多的设置中找出需要修改的那部分。

  1. 进入管理页面。如果是刚刷入的 OpenWrt 没有root账户密码,登入后按照提醒设置一个即可;如果已经有了密码,也可以修改:点击 Go to password configuration 按钮或 System -> Administrator(管理权)。

    如果你不知道路由器的管理页面地址,可以接好路由器后打开命令提示符,输入ipconfig并回车,寻找“默认网关”一项。新安装的 OpenWrt 管理页面地址一般是192.168.1.1

    • Password(密码):填写你想好的管理员密码。
    • Confirmation(确认密码):再填一遍。

    点击 Save & Apply(保存并应用)。

  2. 点击 Network(网络)-> Interfaces(接口),点击“WAN”对应的 Edit 按钮。

    • Protocol(通信协议):改选为PPPoE,然后点击出现的 Switch Protocol(切换协议)按钮。
    • PAP/CHAP username(PAP/CHAP 用户名):填入之前由学号转换得到的用户名。
    • PAP/CHAP password(PAP/CHAP 密码):填入对应的密码。

    点击 Save & Apply(保存并应用)。这时,路由器本身和有线网已经可以上网了。

  3. 点击 Network -> Wireless(无线)。如果提示 Disabled(已禁用)就点击 Enable(启用)。可能只有一个 2.4G 的,也可能有一个 2.4G 的、一个 5G 的。点 2.4G 的“编辑”。

    • ESSID:填 WiFi 的名字。

    点击 Wireless Security(无线安全)。

    • Encryption(加密):改选为WPA2-PSK
    • Key(密码):填 WiFi 密码。

    点击 Save & Apply(保存并应用)。

    如果还有一个 5G 的,就一样地配置,只是 Channel(信道)需要选择147或更高。

    这时,WiFi 就可以正常联网啦。

配置防检测

接下来的步骤必须联网才行,进行之前先确认已经可以使用路由器的网络打开百度。另外,如果你现在是在手机上看我的这篇文章,强烈建议你接下来改用电脑看,可以方便地复制粘贴一些代码;如果你非要手动打代码,注意不要打错,一个空格都不要错。

防检测分为两个部分:同步局域网内电脑的时间,以及修改 HTTP 头的 UA。

同步时间

NTP 就是用来同步两台电脑上的时钟的协议。接下来先启用 OpenWrt 自带的 NTP 服务器,然后将局域网内所有时钟校正的请求都发给路由器上的 NTP 服务器(也就是说,无视局域网内的电脑原本想要和哪台服务器同步时间,而强制将路由器上的时钟作为标准),这样局域网内所有的电脑上的时间都会变得一致。

只需要在管理页面中修改几个设置就可以了。

  • 配置 NTP 服务。点击 System -> System。

    • 勾选 Enable NTP client(启用 NTP 客户端)和 Provide NTP server(作为 NTP 服务器提供服务)。
    • NTP server candidates(候选 NTP 服务器)四个框框分别填写time.xmu.edu.cncn.pool.ntp.orgpool.ntp.orgtime.apple.com

    点击 Save & Apply 按钮。

  • 配置防火墙转发。点击 Network -> Firewall(防火墙),然后点击 Custom Rules 标签,在大框框里另起一行,添加下面的代码:

    iptables -t nat -N ntp_force_local
    iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
    iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1 

    第六行最后的192.168.1.1需要修改为你的路由器的管理页面地址。例如,你的管理页面地址是192.168.10.1,那么这一行代码需要修改为:

    iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.10.1 

    然后点击 Restart Firewall(重启防火墙)。

  • 确认效果。在 Windows 电脑上,打开控制面板,在右上角查看方式处选择小图标,然后点击“日期和时间”。点击 Internet 时间 -> 更改设置,点几次“立即更新”,直到提示“时钟在 xxx 与 xxx 同步成功”。这时,暂时地拔掉墙上接口与路由器之间的网线(断开了外网的连接),再点一次“立即更新”,应该仍然提示成功。

修改 HTTP 头的 UA

UA 中包含了操作系统版本等信息,而 HTTP 协议没有对这些信息加密,因此别人可以从这里看到这个数据包发自 Windows 电脑还是安卓手机等等。接下来把所有 HTTP 头中的 UA 都改得一样。

有两种方法来修改 UA,二选一即可。另外,修改 UA 还会导致其它的异常状况,稍等我会说明如何设置例外。

使用 Privoxy 修改 UA

不推荐。这个方法很简单,但是会导致 HTTP 协议的内容传输缓慢(比如 QQ 发送图片会特别慢,有的下载也会特别慢)。但是我还是把它列出来吧,因为确实很容易配置。

接下来,会安装好 Privoxy 并正确配置,然后将所有 HTTP 流量转发给 Privoxy 代理,并在 Privoxy 中替换 UA。

  • 安装 Privoxy。进入路由器管理页面,点击 System -> Software(软件包)。

    • 点击 Update lists(刷新列表)按钮,等待几分钟。如果提示好几条“Signature check passed”那么这一步执行成功;如果卡死了,几分钟后再进入这个页面,看到了很长很长的软件列表,那也是成功了。要是老不成功,可能是晚上网络太差了,白天上网人少的时候试试。
    • 在 Filter(过滤器)中填写luci-app-privoxy,点击 Find package(查找软件包)按钮。点击下方“luci-app-privoxy”对应的 Install(安装)按钮。如果提示好几条“Configuring xxxx”,那么就是执行成功了;如果卡死后再进入管理页面,看到有一个 Services(服务)菜单,菜单里有 Privoxy WEB proxy(Privoxy 网络代理),那也是成功了。
  • 配置 Privoxy 设置。点击 Services -> Privoxy WEB proxy。

    • Files and Directories(文件和目录):Action Files 删除到只剩一个框,填入match-all.action。Filter files 和 Trust files 均留空。
    • Access Control(访问控制):Listen addresses 填写0.0.0.0:8118,Permit access 填写192.168.0.0/16。Enable action file editor 勾选。
    • Miscellaneous(杂项):Accept intercepted requests 勾选。
    • Logging(日志):全部取消勾选。

    点击 Save & Apply。

  • 配置防火墙转发。点击 Network -> Firewall(防火墙),然后点击 Custom Rules 标签,在大框框里另起一行,添加下面的代码:

    iptables -t nat -N http_ua_drop
    iptables -t nat -I PREROUTING -p tcp --dport 80 -j http_ua_drop
    iptables -t nat -A http_ua_drop -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A http_ua_drop -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A http_ua_drop -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A http_ua_drop -p tcp -j REDIRECT --to-port 8118 

点击 Restart Firewall(重启防火墙)按钮。

  • 使用 Privoxy 替换 UA。在路由器的局域网中打开http://config.privoxy.org/edit-actions-list?f=0,点击 Edit 按钮。Action 那一列中,hide-user-agent 改选为 Enable(绿色),在右侧 User Agent string to send 框中填写Privoxy/1.0;其它全部选择为 No Change (紫色)。点击 Submit 按钮。

使用 XMURP-UA 修改 UA

接下来需要下载我写好的代码,在 Linux 下将它编译后上传到路由器,然后安装好。但是大部分人并不熟悉 Linux 或者懒得装 Linux,所以你可以把你的路由器的型号、硬件版本、OpenWrt 版本发给我(QQ:897331845),我编译好软件包后发给你,然后你按照下面的方法安装:

  • 在电脑上安装 WInSCP。在官网下载,使用默认选项安装好就行了。

  • 打开 WinSCP,文件协议选择“SCP”,主机名填写管理页面地址,端口号填写 22(默认应该就是),用户名填写 root,密码填写你的管理员密码,点“登录”连接到路由器。如果出现警告,继续就可以了。

  • WinSCP 窗口右半边展示的就是路由器上的文件了;双击第一行的 .. 是返回上一层目录。把我发给你的文件(kmod-xmurp-ua-xxxx.ipk)复制到路由器的根目录(最上层目录)的 tmp 文件夹下,不要改名。

  • 然后点击靠近左上角的一个黑方块(鼠标指上去会提示“打开终端”),打开“控制台”,输入以下命令并点击“执行”:

    opkg install /tmp/*.ipk 

    执行完就可以关掉 WinSCP 了。

  • 浏览器打开路由器管理页面,选择 System(系统)->Kernel Log(内核日志),在最后几行看到有类似这样的句子:

    [xxxx.xxxx] xmurp-ua: Started.
    [xxxx.xxxx] xmurp-ua: nf_register_hook returnd 0. 

    这说明模块已经被成功加载。

  • 对于较新的 OpenWrt,在 Network -> Firewall(防火墙)中,可能有流量分载(offloading)的开关。如果有,不要勾选。如果确实需要启用流量分载(大概就是 nat 加速,具体我也不熟悉),可以在防火墙的自定义规则中加入:

    iptables -t filter -I FORWARD -p tcp ! --dport 80 -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw 

如果你执意要自己编译,那么下面是步骤。

  • 在电脑上安装一个 64 位的 Linux 系统。安装成虚拟机或双系统都可以。推荐使用 Win10 的 Ubuntu 子系统(WSL)。

  • 安装编译依赖项。

    sudo apt-get update && sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk subversion mercurial ccache tar ssh 
  • 下载 SDK。

    不同路由器、不同系统版本,SDK 都是不同的。官方 OpenWrt 的 SDK 和固件放在同一个目录下;删掉 OpenWrt 固件下载链接最后的文件名,将剩余的部分复制到浏览器地址栏,回车,拉到最下面,就可以看到 SDK 的下载地址了。比如,WNDR4300 的固件下载地址为:

    http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/openwrt-18.06.1-ar71xx-nand-wndr4300-ubi-factory.img 

    打开网站:

    http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/ 

    就可以找到对应 SDK 的下载地址。

    下载好 SDK 后,放到用户目录下,解压 SDK 并进入。

    cd ~ && tar xvf *.tar.xz && cd openwrt-sdk* 

    如果使用 WSL,可以将 SDK 放到 C 盘根目录,然后使用命令 cd ~ && cp /mnt/c/*.tar.xz . 将它复制到 WSL 中

  • 下载 xmurp-ua 的源代码,并编译。

    git clone https://github.com/CHN-beta/xmurp-ua.git package/xmurp-ua make package/xmurp-ua/compile V=sc 

    如果弹出来一个菜单,按左右键选择 Exit,回车;然后选择 Save,回车;即可继续。

    如果编译失败(使用 LEDE 的 SDK 时),可能需要在编译时增加一些参数,参考这篇文章;也可能是我的代码有误(没有适配你的路由器内核),请反馈给我。

  • 将编译好的软件包上传到路由器,安装。

    逐行执行:

    scp bin/targets/*/*/packages/*.ipk root@192.168.1.1:/tmp ssh root@192.168.1.1 "opkg install /tmp/*.ipk" 

    其中的 192.168.1.1 换成你自己的管理页面地址。

    如果提示是否继续,输入 yes 即可。还会提示输入密码,输入路由器的管理员密码即可。如果使用 WSL,也可以复制出来到 Windows,再上传到路由器、安装。

确认效果

打开 ua.chn.moe,网页上应该显示 Privoxy/1.0(如果使用 Privoxy 修改 UA)或 XMURP/1.0(如果使用 XMURP-UA 修改 UA)。

对于使用 XMURP-UA 修改的情况,如果没有专门设置例外,并且确实没有修改成功的话,考虑是否是 mark 冲突了;也就是说,别的模块设置了 mark 的第九位,导致我的模块将这些流量当成例外而放行(具体看下文)。如果出现这样的情况,可以在内核日志中找到这样的句子:

[xxxx.xxxx] xmurp-ua: Mark matched. Note that all packages with the mark will be ACCEPT without modify.
[xxxx.xxxx] xmurp-ua: If the mark is not set manually, it maybe a conflict there. Find out which app is using the desired bit and let it use others, or modify and recompile me. 

解决方法也是如上所述。

设置例外

修改 UA 后会导致一些异常,比如 WeGame 和腾讯游戏下载器无法下载,“校友邦”无法登陆,还有人反馈 GTA5(好像是叫这个名字)不能玩。建议给自己局域网内的电脑都设置例外。

对于使用 XMURP-UA 修改的情况,只需要在防火墙自定义规则中,另起一行,加上下面的代码(其中的 01:23:45:67:89:AB 替换为自己电脑的 MAC 地址),点击“重启防火墙”,那么来自这台电脑的 HTTP 头 UA 就不会被修改;将命令删除或者在前面加一个#,点击“重启防火墙”,就可以恢复。

iptables -t mangle -A PREROUTING -p tcp --dport 80 -m mac --mac-source 01:23:45:67:89:AB -j MARK --set-xmark 0x100/0x100 

对于 Windows 系统,在命令提示符中输入 ipconfig -all 并回车,“物理地址”一项就是 MAC 地址。

如果需要临时将所有的流量都设置为例外:

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x100/0x100 

如果你稍稍了解 iptables 命令,就可以看明白我在干什么;如果不了解,也可以照葫芦画瓢。

对于使用 privoxy 修改的情况,则是在防火墙自定义规则中增加类似于下面的内容:

iptables -t nat -I http_ua_drop -m mac --mac-source 01:23:45:67:89:AB -j RETURN 

使用 SRUN3 拨号

学校给的客户端其实是使用 SRUN3 拨号而不是 SRUN2,只是 SRUN3 在普通路由器上无法实现,SRUN2 在厦大恰好也可以拨通,就用它了。对于 OpenWrt,稍稍修改拨号脚本后就可以使用 SRUN3 拨号。最近,用 SRUN2 拨号经常会掉线几分钟,SRUN3 就没问题,不确定是学校故意搞的鬼还是巧合。

下面是用 SRUN3 拨号的步骤:

  • 修改拨号脚本。WinSCP 连接到路由器后,打开文件 /lib/netifd/proto/ppp.sh,这个文件就是拨号的脚本了。搜索 username 关键字,可以找到这样一句:

     {username:+user "username" password "password"} \
      ``` 把它修改成: ```bash {username:+user "(echo -e username)" password "$password"} \ 

    保存,关闭 WinSCP。

    (上面的内容排版有问题,是 gitbook 的 bug,你们知道我想表达什么就行了。)

  • 打开管理页面,点击 Network(网络)-> Interfaces(接口),点击“WAN”对应的 Edit 按钮。用户名中的 {SRUN2} 需要修改成 {SRUN3}\r\n。举例来说,小明原来的用户名是:

    {SRUN2}5=;645=664789:@cmcc 

    那么,他需要改成:

    {SRUN3}\r\n5=;645=664789:@cmcc 

    保存并应用,等待几分钟,就可以正常使用了。


使用 WinSCP 快速配置防共享检测

我忽然觉得这部分太沙雕了,就删了。

参考资料

更新记录

  • 2018.9.15:修正修改 UA 中的一些错误。
  • 2018.9.15:补充使用 LEDE 的 SDK 时可能出现的一些问题。
  • 2018.9.16:确认不需要修改 IPID。
  • 2018.9.16:改正关于 HWNAT 的说法。
  • 2018.9.18:确认不需要做 NTP 服务。
  • 2018.9.20:在仅仅修改 UA 的情况下,学校今天中午封掉了我的路由器。赶紧又加载了 NTP 服务和改 IPID/TTL 的内容。看接下来会怎样。
  • 2018.10.3:优化 privoxy 配置文件。
  • 2018.10.4:将近两个星期过去了。这次确认,不改 IPID 和 TTL,只改 HTTP 的 UA 和 NTP 服务已经足够防止封杀。
  • 2018.10.10:整理了一下这篇文章,准备写那篇面向小白的了。
  • 2018.10.19(20454):再次整理了一下文章,完成了给小白看的版本。
  • 2018.10.22(20505):更改了使用 shadowsocks 翻墙的内容(实际上服务器并没有开 UDP 转发支持,而且我错误地配置了 mwan3,才导致的不稳定)。
  • 2018.10.24(20534):改正了教程里的两个小错误。如果之前照着教程走不成功的,可以再试一次。因为自己的疏忽给大家造了麻烦,我深表歉意。另外,学校封路由器,大家生气归生气,但是作为一个高素质的厦大学子,不要说脏话。
  • 2018.11.16(20853):发现一些路由器 sysupgrade 和 factory 固件都是.bin后缀,把这一点改正了。还有的人说升级 OpenWRT 之后路由器就开不了机了,虽然我觉得应该是他操作的问题,但还是加上了不升级的操作方法。另外,应该有人根本不介意路由器偶尔掉线,那这样的话,其实不需要这样复杂地配置。
  • 2018.12.15(20C63):解决了 HTTP 下载卡顿的问题。另外把额外配置的那一个部分删掉了,寒假专门写一篇文章吧。
  • 2018.12.15(20C64):对操作过程中可能出现的正常的卡死作了说明。补充了用 Privoxy 改 UA 可能导致的一些问题。
  • 2018.12.22(20D55):重写了改 UA 时的代码。
  • 2018.12.22(20D61):发现 UA 不是 GET 特有的字段,其它情况貌似基本是 POST 了(剩下的请求类型貌似不常用)。出这样的错误,显然就是专业计算机和非专业爱好者的区别吧。
  • 2018.12.24(20E13):删掉了改 IP 头的部分,改 UA 的代码也放到了 GitHub。不过这样看起来,这篇文章的主要内容反而不占主要的字数了。
  • 2018.12.25(20E24):把整个文章重新整理了一下,把新的方法写了进去。另外,Merry Christmas!
  • 2019.1.8(20G24):代码适配新内核、修复 BUG。
  • 2019.2.6(21233):把两篇文章合并了(放弃了教会所有小白的念头),删掉了很多废话。
  • 2019.2.8(21245):稍稍补充。
  • 2019.3.17(22403):博客搬家的过程中哪里被我搞坏了,就复制粘贴到了这里。这是我新博客第一篇不水的文章。
  • 2019.3.29(22552):发现原来查看 UA 的网站挂掉了,就自己做了个简易的。
  • 2019.4.17(22834):把语言改生动活泼了一些,以及一些其它的小修改。
  • 2019.7.6(23261):确认学校不再检测共享。不知道是彻底放弃了阻止网络共享的计划,还是计划在这个暑假再搞个更厉害的。如果是前者那当然好,如果是后者我奉陪到底。
  • 2019.9.16(30013):学校又开始查了。我感到兴奋。
  • 2019.9.20(30052):发现 xmurp-ua 和 luci-app-shadowsocks 以及 offloading 冲突,所以修改了 mark 位置,增加了关于 offloading 的说明。
  • 2019.10.10(30355):源代码中完善了点。增加了 mark 冲突的检查。增加使用了 SRUN3 拨号的方案。