标签: ERL

在彻底失去知情权之前再挣扎一把___花了一个周末把V2ray搞清楚了

为了保持自己那么一点点信息权力。

为了在彻底失去知情权之前再挣扎一把,这个周末,我花了2天,把现在当红的V2ray给折腾了一遍。

总的来说,v2ray在综合能力上确实要比ss或者ssr来得强大不少,毕竟本体就结合了多入口,多出口,DNS,路由选择,多种协议以及加密通信支持乃至于load balance.

但是同样的,功能的复杂以及自由度的提升,一样也造成了配置文件的复杂化,所以就没有那么即开即用化,友好程度明显降低。不过主要的难度还是集中在服务器端或者中转代理的配置上,用户端相对来说,在一些图形化client的帮助下,一般用户还是不难去掌握使用的。

我这次主要是为了让这v2ray能在我的ERL3上能顺利运转起来做透明路由(原先的SS花式断,基本废了。原因大家都理解),所以跟一般的客户端配置略有差异。不过能理解就行,毕竟逻辑跟原理是一样的。

首先值得高兴的是,ERL3在升级到2.0.x版本的固件后,后台的Debian内核也升级到了9.x…所以,习惯于用shadowscoks-libev 版本的同学,可以直接用APT安装了。并且,v2ray的官方go.sh安装脚本可以无障碍的直接在CLI下运行,完全不需要担心兼容性问题。

VPS端就不阐述一起必然需要的准备了,相信大部分DIY的留学生应该还是很熟悉这套操作的。

简单的来说,vps服务器端跟本地透明代理端,运行的东西完全一样。v2ray的官方文档也写的很清楚,v2ray本身并没有服务器端跟客户端的区别。所以除了配置文件的不同,2者其实是完全一样的东西哦。

所以我们要做的就是:

  1. 安装v2ray
  2. 写v2ray的配置文件
  3. 运行

听上去跟把大象放进冰箱一样的简单呢。

一切的关键都在配置文件里,很清楚了吧。

v2ray使用的是非常常见的JSON格式的配置文件。粗略的项目如下:

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "reverse": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

简单的说就是这些模块的组合就能让v2ray工作起来。

其中我们一定需要理解的是,inbound, outbound以及routing。log最好能明白因为排错会很方便。 dns看需要,我个人更喜欢用gfw+ipset的分流,并且用ubound做DNS over Tls的解析。。所以dns我完成没涉及。但是据说很不错。至少看着能解决投毒的问题,所以也是值得研究的。

至于具体的inbound, outbound有哪些参数啥的,我个人推荐直接查下官方文档然后找几个配置example理解一下。应该还是不难理解的。

然后我们从逻辑上大概理解下v2ray是怎么工作的。

从本质上来说,v2ray,跟ss和ssr他们没有根本的区别。都是一样的代理转发工具。虽然v2ray更大更强更威猛,但是说到底他还是个二道贩子。主要的功能就是为了把从inbound进来的东西从outbound转发出去。就这么简单。

到了这里,有一点就很清晰了,就是client端的outbound的配置,需要跟server端inbound的配置相对应,这样双方才能平等交流互信互惠,一切都遵循和平共处五项原则。

我们来看个配置文件的实例,抄自白话版v2ray教程:

{
  "inbounds": [
    {
      "port": 16823, // 服务器监听端口
      "protocol": "vmess",    // 主传入协议
      "settings": {
        "clients": [
          {
            "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,客户端与服务器必须相同
            "alterId": 64
          }
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",  // 主传出协议
      "settings": {}
    }
  ]
}

这里其实就2个模块,一个inbound用来解决输入,一个outbound用来解决输出。至于中间的vmess, 这个是v2ray私有的通信协议,但是应该已经可识别特征,因为我在tcp模式下不管加不加伪装都被灭过不止一次端口。剩下的端口啊, id啥的。。都是一个作用。就是匹配握手。

所以把大的部分拆开了,还是不难去理解的。

那么v2ray就那么简单?显然不是啊。

为啥它牛呢,因为你现在看到的只是前面的部分,后面经过简单计算推导的结果还没出来啊。

因为v2ray的特征是模块化,并且本身就已经携带了如vmess, mKCP, shadowsocks, Mux,并且支持websocket, HTTPS, HTTP/2等多种协议,所以其本身的自由度非常巨大。即使不考虑商用多用户多服务器等大规模管理,我们依然面对了非常巨大的选择空间,从协议上,是选择shadowsocks还是vess. 通信的标准上使用tcp还是mKCP, KCP用静态还是动态端口。websocket是否需要加tls等等一系列的可供选择的配置。

一般而言,我们常见的是直接从客户端转发到海外VPS端的方式,这样是最直接最容易实现的,只要vps配置完,自己设备上有个v2ray能用的client端,GUI填一些简单参数就很容易搞定。

然而其次,就是我折腾了2天的网关/路由器透明代理。这种方式,对大多数用户其实跟第一种差不多,因为现在梅林啊,老毛子,LEDE等各种固件都集成了各种插件,这些插件用起来也不用自己写配置文件,GUI填下就好了。

我只是因为穷,买不起那些好用的,才只能手工自己写,踩了无数坑之后才搞定了。所以说,有钱就是可以为所欲为啊,哈哈哈。

v2ray还有一种链式代理的工作方式,是类似多重代理的方式。很玄妙。暂时我还没用到所以没有深入研究。

这样可能产生的配置组合就很多。现在比较常见的配置组合是,mKCP动态端口直连;websocket+tls+webproxy;以及号称最牛的组合:websocket+tls+webproxy+CDN的组合。

鉴于太长不适合阅读,我会在下一篇介绍下websocket+tls+webproxy+CDN的配置的一些细节以及我踩的坑。希望能我自己下次别再踩一遍。

记在ERL-3存储再次大破以后

  1. 台电的U盘是真的次,1年9个月以后读写错误,系统大灭。
  2. mkeosing这个Github上的脚本非常赞….最大的好处是,你可以定制给EdgeOS划分的数据分区的大小,可以根据自己U盘大小来而不是原先系统指定的2G. 而且简单易用,比进内置的引导系统再用工具直接重做来得更加容易直接。 https://github.com/sowbug/mkeosimg
  3. 狗东的服务不错。新买的U盘是迅速送到了。同时挂掉的台电U盘因为还在保,JD提供了售后服务。给了2个选择,原价的7折退钱或者换个同品牌的一样容量的。毫无悬念的退了钱,舒服。
  4. ERL-3,或者说EdgeOS在越来越多的人的研究跟贡献下正在越来越好用。比如之前IPTV我能找到的资料并不多。现在基本上就可以找到很多可以参考的。随便找找就发现了ER-4做的单线VLAN直通到交换口解决IPTV AB面验证的配置了。我又可以省下2个交换的口了。
  5. 最新的EdgeOS的是基于Debian 9的。有能力升级的同志们都可以升级下。因为在9的repo里。。某个奇妙的梯子是可以直接APT 安装的。不需要去研究啥交叉编译拉。
  6. 细节决定命运啊,我从默认目标下cp出来的config.json没有local IP的配置。。导致我个傻X一晚上没想明白为啥流量过不去。结果跟上次在服务器端一样,那次是没配服务器地址,这次是没有local ip的选项导致绑定问题。
  7. 上海电信至今不给IPv6….虽然不是啥必须的但是我想玩呀。
  8. VLAN 51这个IPTV传说的组播VLAN。。。究竟有没有用啊,很玄学啊。今天搞了一天这个,最终是关了Cisco 3750的IGMP Snooping解决的。不过vlan51…我现在是根本没加进去啊在路由上。那这个组播的VID需要只在光猫上存在就行?
  9. 我想买ER-4……..啊啊啊啊

Supervisor on EdgeOS是真的好用啊~~

因为要在ERL3上挂SS跟ChinaDNS…所以在后台进程是有Linux管理的ChinaDNS以及ss-redir…

但是不知为啥…ChinaDNS跟ss-redir, 尤其是chinaDNS,会莫名就总结.

后来一段时间用Crontab的定时任务把ChinaDNS跟ss-redir定时重启.

不过总觉得这管理方式很土.

最近换了Supervisor…感觉各种好…很稳, 自定义配置文件,有log 记录..甚至于还能做web查询.完美…

ERL-3现在用的系统没有systemd, 以后估计也未必有..所以暂时来说, Supervisor应该算是很不错的选择呢..

 

细节决定成败啊~~EdgeRouter大破恢复中的一个细节坑了我2天..

EdgeRouter Lite 3(后面简称ERL3)在最近的一次系统升级后再起不能…

连上console去查看,发现是U盘内的系统引导不起来了,所以就一直在不停重启…

得,拆机器确认下内置U盘是不是还活着…U盘还能读…那就用恢复系统重新引导重做系统吧….

重做完了开始恢复所有配置, 因为备份的存在所以基础配置是没有悬念的….然而问题是….后台用Linux命令完成的Shadowsocks出问题了..

转发无法工作…

可以确认的是, 服务器是没有问题的..那么问题就只能在本地了..

本地的ss代理一共有4大部分组成:

  1. DNSMASQ +IPSet,组成本地的DNS解析功能以及翻墙需要功能的IP列表记录.
  2. ChinaDNS作为非国内IP的DNS解析工具
  3. Shadowsocks-Libev 作为透明代理
  4. iptables作为流量分离工具

其中1跟4其实都是系统已经自带的功能, 基本不太可能出问题, 唯一的区别是, 1是可以简单验证的, 而iptables我不知道怎么确定他把识别到了正确的组而把流量转发到需要的端口去了.

所以,故障排除顺序是

  1. 确认dns正常工作, dnsmasq没问题, chinadns也没问题, ipset正常记录IP一样很正常,所以1跟2没问题
  2. 确认ss工作正常. 启动-v的诊断模式, ss的log没有任何异常

然后我就没想法了…因为iptables我不知道怎么确认..

然后查了各种地方测试了不同版本的ss,不同的服务器,不同的iptables配置方式,不同的本地端口, 都无法解决问题…很尴尬啊..心态略崩溃…

不过在最后, 发现之前已经灭了的onlyOS博客又能看了…..所以爬了下评论…发现一个之前完全不知道的config.json的点..

因为之前其实调整过很多次config文件…主要就集中在本地端口跟本地的IP配置上….所以本着死马当作活马医的态度,再试了一下..nice啊..

 

所以问题的关键还在于…细节啊..

这个细节就是…本地的config.json..local_address是要用0.0.0.0的,不配置local_address或者配置127.0.0.1,都是没用的..

至少后面的telnet很明确验证了这个情况….唉…不过好歹救回来了…我现在要纠结的事情变成了….我要不要换个U盘给路由呢…有点抖啊…怕再出点什么幺蛾子…

自动翻墙配置EdgeOS篇

ROS篇结束以后,我们来记录一下现在正在工作的EdgeOS的配置.

大概介绍一下Edge Router Lite 3这个路由器.

ERL3是Ubnt发售的一款纯有线的路由, 以NAT速度快闻名, 有记录是在1G的网络上可以跑出900多M的NAT速度…所以说速度很快.

有兴趣的朋友可以去amazon收一个:

Ubiquiti Networks Edgerouter Lite 3Port Router (ERLITE-3)

 

下面这个是ER-X, 相对ERL-3有缩水不过ERL3的价格比这个高不少, 所以ER-X还是比较超值的

Ubiquiti EdgeRouter X Advanced Gigabit Ethernet Routers ER-X 256MB Storage 5 Gigabit RJ45 ports

 

当然也可以国内某著名网站

其内嵌的EdgeOS的本质是跑在一个Debian系统上的Vyatta路由系统, 因为vyatta现在已经被博通收购, 所以现在的EdgeOS是基于原本的开源代码后续开发的, 在命令行格式上仍然完全集成了vyatta的模式.

由于EdgeOS其实是Debian上的一个应用, 所以我们很多时候可以跳过edgeos, 直接在debian上操作来实现一些edgeos上并不能实现的功能.

思路其实仍然一样, 我们需要解决2个问题:

  1. DNS污染的问题
  2. 流量区分的问题

因为我们可以直接在Debian上操作, 所以我们的选择就多了很多很多…毕竟Linux base的东西太多了.

所以我们现在选择这样的组合来完成我们需要的功能:

  1. VPN隧道+IPset+edgeOS的防火墙规则转发
  2. SS隧道+Ipset+ChinaDNS+iptables防火墙规则转发
  3. 上面这种的混合模式

首先我们来介绍一下第一种,这种方式的好处在于不需要对路由内的debian做太多的操作, 相对来说比较容易实现.

VPN的隧道可以选择IPsec SSL, L2TP或者PPTP.

广告一波我在用的VPS:https://bandwagonhost.com/aff.php?aff=5802

我在搬瓦工已经有了PPTP, 所以就自然直接上PPTP了, 不过因为ERL的GUI模式是没有PPTP的设置界面的, 所以我们需要使用edgeOS的命令行模式:

configure
 edit interfaces pptp-client pptpc0
 set user-id your-sername
 set password your-password
 set server-ip your-vps-ip
 set require-mppe
 commit
 save
 exit

只要数据正常, vpn就会自动拨号连接起来, 然后就是NAT:

configure
set service nat rule 5012 type masquerade
set service nat rule 5012 outbound-interface pptpc0
commit
save
exit

NAT完成以后, 我们需要搞定路由,

在搞定路由之前, 我们先需要认识一下IPSET这个Linux的工具, IPSET算是Dnsmasq和iptables的一个辅助工具, 主要的功能是快速的把域名或者IP归类, 然后帮助防火墙来识别, Dnsmasq算是附带的.

所以这里就有一个逻辑, 就是我们把所有gfwlist所知道的被墙的域名都转换为IPSET所能认识的配置文件, 在这样的情况下通过IPSET所归类的组, 我们可以要求dnsmasq去制定的DNS服务器去解析, 而避免了被墙的域名遭到污染, 同时呢, 这个组又可以作为防火墙的选择依据, 让这组的路由全部都走VPN通道出去:

具体的思路可以参考:

https://xiaoding.org/?p=391

这位兄弟的博客, 上面同时也有编译好的高版本的Dnsmasq, 因为系统内建的是2.61版本不支持ipset功能.

在理解这些以后, 我们可以先通过系统命令创建一个组:

configure
 set firewall group address-group group-name
commit
save

这时候ipset就有了一个可以自由使用的组了.

然后我们就把gfwlist转换成所需要的ipset设置, 因为gfw太大了, 所以我们需要跑个python的脚本, 可以从github直接抄来:

https://github.com/smallfount/gfwlist2dnsmasq

gfwlist2dnsmasq, 我把文件直接上传了可以直接下:

然后用python2 跑一遍就可以得到需要的ipset列表, 并且会根据脚本的配置去配置放到指定的地方然后dns的解析也是我们设定的方式.

最后就是防火墙规则的配置了:

configure
set protocols static table 1 interface-route 0.0.0.0/0 next-hop-interface pptpc0
set firewall modify your-group-name rule 1 action modify 
set firewall modify your-group-name rule 1 destination group address-group your-group-name 
set firewall modify your-group-name rule 1 modify table 1 set firewall modify your-group-name rule 1 protocol all
set interfaces ethernet eth1 firewall in modify your-group-name 
commit 
save

这样的配置就会让系统的防火墙根据group去区分不同的出口.

然而问题还是有: 因为gfwlist的转换并不完美, 所以可能会有不少域名有问题.

所以还有另外的办法,我们下一篇继续

技术文—自动翻墙配置ROS篇

因为休息在家, 就想了点事情给自己弄弄.  一来是有事情研究不会太无聊, 二来呢一直一来Bash都属于我不太擅长的领域, 通过折腾可以多学点怎么玩.

所以呢, 趁着自己有空, 就把家里的翻墙配置彻底优化了一下, 可以保证自己最大程度得使用舒适.

背景呢是手上有2台纯有线的路由, 一台是RB450G, 朋友送的, 一台是Ubnt的ERL3, 这是自己在升级到100M宽带的时候自己买的.

在这2货之前呢, 我一直都是IPv6直接挂到He的6to4的Tunnel上实现Google等支持IPv6的访问了, 不过问题就是IPv6毕竟还是小众的, youtube这种就算能访问也不能看片子, 所以用途就很小.

在使用了ERL3以后还是延续了原来的部署方式, 并没有特意去搞太多因为大部分时候我只要有Gmail跟Google就满足了其实.

不过在帮朋友在Azure上部署了一套SS并且他用Asus梅林固件的路由器完成了家用的自动翻墙以后, 我忽然觉得其实路由翻墙也不错嘛, 尤其是其实实现方式比我认为的还是容易多了.所以决定折腾一下.

因为朋友用上了R7000以后把ROS的RG450G送给我了, 所以我觉得先折腾一下这个, 毕竟ROS真心资料比较容易找.

ROS的配置可以使用WinBOX来完成, 当然如果会命令行会更好, 因为命令行其实逻辑性更容易理解一点.很多时候反而是GUI上的配置比较难理解.

基本的思想其实很简单, 就是放弃国内的DNS(因为国内所有的DNS在解析国外被墙的域名的时候必然被污染), 使用国外的DNS并且让DNS从VPN上直接出国而不走国内路由的, 否则DNS的解析结果会直接被污染.

所以我们首先需要搞一个VPN.

我个人使用的是搬瓦工的VPS: https://bandwagonhost.com/aff.php?aff=5802

最近能买到的比较便宜应该只有Los Angeles的2.99刀每月的套餐. LA的DC是搬瓦工比较快的那个, 东部的基本不行.

在起了VPN以后, 我们在VPS上起个VPN, 搬瓦工如果使用centos的话是有自动部署脚本的, 可以直接起OpenVPN.

不过为了我自己用起来方便我其实还是起了PPTP, 可以直接搜自动安装脚本去自动安装, 当然也可以自己手动装.

在VPN server端搞定以后, ROS这端就直接起一个VPN的Interface: 新建PPTP(或者SSTP,OVPN等等)客户端连接:

HH@]0KASPG@8K9RLP}D61F8

, 然后输入VPS的服务器IP, 端口号等需要的信息:

X}9__7C]%901ED%84}C36EJ

只要信息正确, VPN Link会自动建立.

不过为了要能正常通信, 我们需要在ROS上建立一个新的SNAT, GUI的位置防火墙, NAT页里面.

新建一个SNAT的类型, 把out interface改成VPN的接口, action 改成masquerade, src address 改成自己的内网IP段就行了.

CLI比较好理解其实, 例如:

/ip firewall nat
add action=masquerade chain=srcnat comment=”” disabled=no src-address=192.168.1.0/24(自己的本地IP段)

这样VPN的路径就通了.然后我们需要相关的路由来知道流量:

首先我做了一条给8.8.8.8 使用的路由, 这样可以保证我使用的DNS从VPN出去而不是被GFW污染一圈:

/ip route add dst-address=8.8.8.8 gateway=Bandwagong(VPN接口的名字) disabled=no check-gateway=ping

这样DNS就解决了, 然后我们需要把我们需要翻墙的流量到入VPN, 这样就能完成翻墙了.

这里就有问题了, 因为ROS是怎么知道那些需要去VPN的呢?

我们需要整理一个IP List告诉ROS, 然后给去到这些IP的流量做个标记, 再做一条路由让这些流量从VPN出去而不是本地.

具体怎么搞我们下一篇继续.