广东移动东莞长安300兆宽带

10月搬到离深圳一条河的长安,1300住相当于虎门1800的房,虽然农民房、采光差,安静太多了,而且没中介费(虎门18.5月亏了2550,厚街9月亏了500),食堂也好多了。本想装200兆59的联通宽带,但公寓只能装移动/电信,虽然以前移动/铁通宽带据说堪比歌华(晚上网高峰期很卡、掉线,周末一两天没人修),但电信太贵了,而移动300兆才39……营业厅测了晚上流畅看Youtube 2160P,虽然测速网才60~100兆,就没得挑了。安装师傅很弱,把网线插百兆3口,我比测速改到千兆1口。测速最快跑到369兆,大部分时间能接近300兆,最差也超过200兆。强烈怀疑营业厅也插错百兆口……

不知哪个天才设计,白底白字不细看根本注意不到……开着闪光灯,左边其它俩百兆口也难以分辨……那么想省钱,可以印到移动标志左边……

这种人员素质体现在很多方面。譬如,师傅图省事,最初光猫挂在阳台热水器下方,因为电源插座只有俩,路由器从厨房接电。因为我的小米4A千兆版启动加载国内IP需要11分钟,师傅不耐烦等,我提前说了路由器刷过里面有梯子加载慢,还是背着我重置路由器,却又看不懂英文的LuCI。后来我重新配置少看一行,折腾半天才“穿越长城走向世界”……后来我注意到黑色室外光缆不同于黄色室内光纤,俩钢筋夹着单光纤,比铜网线结实。只要不折直角、满足转弯半径,也能穿堂入室。而廉价铝合金门隔音差、缝隙大,角落密封胶条阙如,应该没问题。后来斜对门两居室维修,我参观发现,人家直接连到电视下面,还熔接小段黄色室内光纤,电信贵也有合理性……直接夹在俩推拉门里,很少磨,还螺旋缠绕了一段电缆……

总之我自己重新布线,转弯半径超过5厘米,不算太难看?

用了快一个月,瞬间掉线不少,感觉不明显。只有一次半夜掉一分钟,打完保修电话就好了,还送了3G流量。300兆39,5G流量,30分通话,相当于移动300兆宽带26.3,而且200安装费10个月全返还。联通200兆59,还要花200买光猫。其实很便宜,在北京合租,一间屋还得25/50……新开卡可以套餐下月生效,本月只要用别的流量(譬如电信的10块5G),相当每付费10月白送一个月宽带……我捱到积攒的电信10G快用尽才开卡,也真够傻的……

前天晚上把修好的6T加原来的4T下载盘,共10T跑满了400兆P2P下载,峰值能450兆(3:25 421兆/3点平均367兆)!一晚上下了600G,平均200兆。白天上传人少,只有一两百兆,一整天下了1T。平均100兆。昨晚就衰减了,只下了350G。

移动没限制下载速度,但限制上传。优质资源下完,速度迅速衰减。要榨干300兆带宽,只能爬虫加P2P下载。然后还有富余,够日常使用。

网速再快没啥意义了,除非你花钱订网飞,超高清VR。300兆其实也够4K甚至8K了,但移动300兆出国不稳定。

多路无线接入/无线端口聚合负载均衡

公寓俩AP信号相对好点,但有时只有1m的下行连接。几十K,现在京东最低10m才能流畅看(图)的时代约等于断网,谁差这点流量(不刷抖音肯定用不完)。还有俩AP信号时有时无,但只要连上,就很少出现1m的连接……

以前想象过mwan3多线,但电脑只有P2P下载,手机只有极少情形(同时更新系统/应用)才有用。但最近都在爬数据,简单的爬虫4线程能跑满50m,典型的高并发(100多RPS),而且时不时掉到几十K很扫兴,高性能/高可用都需要。或者说,后者是前者的基础,跳过1m下行连接就有机会几百K乃至过M了。

多拨?多路无线中继?

mwan3通常用来多拨,单线(macvlan虚拟多网卡)、双线(端口聚合以突破物理端口限制,千兆套餐达速1.2G的运营商预留带宽)或多线(千兆套餐只能多物理线路),很多人懒得动脑就沿用。

多路无线中继似乎更准确,然而,如果在低频以客户端模式连接(WWAN),低频的远程AP信号并不会被增强,中继应该用客户端(WDS)模式。OpenWRT默认的扫描/加入其它网络,就是非WDS/非无线中继客户端,而且没必要每路接入都开中继。扫描低频就知道如今信号相互干扰有多严重了。

实际上只是对多路无线接入进行负载均衡,也可称之为无线端口聚合,因为接入的无线网络以wwan虚拟端口存在。其实,接口(Interfaces)几乎都是虚拟端口:LAN(包含若干个局域网端口)、WAN、WAN6、WWAN。只有WAN和物理端口一一对应,也只因为默认单线接入。

无线还是有线接入?

一个路由器,一个频段虚拟多个WWAN,再负载均衡当然最好。然而我试了N次,不可行。一个频段可虚拟多个不同模式的无线网络,譬如分别基于客户端/接入点模式,但不能同时基于客户端(WWAN)模式。若同时接入不同的AP,一个掉线了才会连另一个。我有俩选择:

  1. 外接USB网卡接入多个AP:编译无线网卡驱动很麻烦。要一个一个搜芯片名,几乎没自觉标出这最关键信息的制造商……万恶的小螃蟹,8192德国和瑞典能分出俩驱动……8188刷了不识别(wifi detect/config),大家都说好的mt7601,试了俩网卡都不认……见识下多麻烦,一家厂一芯片就能折腾几十种驱动,这里还只是已“支持”有限的几种……就算相同芯片,做成网卡后,路由器也未必认……
  2. 只能用其它路由器,分别接入不同AP,再用网线多路接入主路由:如图MiR4A的LAN接入MW4530R的WAN,WAN旁边的LAN转为WAN接入另一路(DIR505),最右的LAN接电脑(蓝色扁平线)。MW4530R用了8年宝刀未老,MiR4A去年618都降到74,开源社区还没做完交换机功能……LuCI没交换机就没VLAN,就不能LAN转WAN,只能WAN+自身无线接入双路接入。而MW4530R可以接入五路,如果能接受不稳定的无线连接甚至可以接入六路(自身无线接入+5千兆口),最好的情况AP1可下行40m,大部分情况不超过20m,6路共120m,上上代WiFi的MW4530R不会成为瓶颈(2×2最大128m)——当然如果任一AP稳定40m下行,我也没必要这样折腾了……这事教育我们别乱扔过时电子产品,说不定哪天就有大用了,我刚好有仨上上代无线路由器……

LAN转WAN、配置mwan3

一开始参考WAN转LAN,然后反向操作。然而,所有的LAN在一个网段/VLAN,每一个WAN必须在一个单独的网段/VLAN。如果理解成WAN都在同一个VLAN,只要LAN改的WAN接上网线就断网了,如上图MiR4A的LAN接MW4530R的WAN(最左USB旁)……

搜了仨教程,广域网加速讲的最明白,附上我的分组:

CPU这列可以忽视,截这么宽只为保留添加的描述(左起第二列)。简单说就是LAN所在VLAN1(第一行)全都不标记(LAN 2/3/4),其它(除CPU)都关闭,每个WAN各占一VLAN并且不标记(原WAN/LAN1转的WAN1)。不在此VLAN的端口,在此VLAN中当然关闭了。有几路无线接入就有几个VLAN——自身无线接入(一个)+其它路由器有线接入(多个)=LAN网段(一个)+各WAN网段(多个)。

头晕就在于不标记/标记的区别,这是对CPU而言,系统/CPU根据标记的VLAN ID分隔不同网段。至于为什么要普通用户琢磨透,可能开发者想当然了吧,就现有功能而言完全多余。

划分好网段/VLAN还要新建接口(WAN1),并配置mwan3,照上面教程做即可。

三路无线接入:本机wwan、MiR4A接wan(掉线)、DIR505接lan1转的wan1。然而,即使MiR4A在线3小时,带宽倍增的目的并未实现。折腾的目的为保证满载4线程爬虫必需的带宽(50m),结果却才几十、几百K,反而不如原来的单路无线接入(wwan)。

而且MiR4A接wan、DIR505接lan1转的wan1分配的流量非常低。应该均匀分配,但百度IP会发现一定时间段内IP不会变。

“mwan3用标准Linux策略路由和负载均衡多路流量,流量的分配以每个IP连接为单位”

白折腾十多天……这就不只是域名只能利用一路接入……譬如www.qidian.com和m.qidian.com,尽管后端服务器绝不止DNS记录里几个IP,对用户而言IP都一样。

分给美国以外IPv4数量很稀缺,网站也用负载均衡,一个IP对应后端很多服务器。同一个IP后面的N个网站,都只能利用一路接入,而不管接入了多少路。除非再折腾对DNS进行负载均衡——大部分公共DNS只返回一个IP,可以搭建本地DNS收集所有记录,这样就可以通过多个IP利用多路带宽。

唯一的收获,只是增加了故障转移功能/failover,但还需要优化,现在彻底断网才会换端口,但无线连接变成了1m就该切换到别的无线接入。

然而,现实却没多少挑捡的机会,就流量而言,以前最好用的AP(wan)最近信号一向不佳,甚至不如时有时无的wan1……免费宽带能用就行了,至少现在做到了高可用……而且一个凑合(很少超2M)、一个最近够呛(很少超10m)、一个时有时无,没必要再折腾基于DNS的负载均衡,合并也增加不了多少带宽。

使用一段时间,并不如预想的“高可用”,多路接入反而更卡顿……

穿越长城走向世界:Trojan路由手动配置(改进版)

题外话

Trojan路由手动配置太难了,折腾15天一边摸索一边记录,很多反复之处。简洁版照做应该很顺,出问题可参考Trojan路由手动配置(摸索版),^F问题关键字。有耐心仔细看可学习调试方法,怎样自定义域名过滤/内外分流

前言

提前打预防针,我15天经历5大坑:

  1. Trojan客户端:JSON语法很苛刻/OpenWRT看日志不容易/status总是running不报错
  2. OpenWRT编译:多线程容易死锁出错/停滞,单线程就算开电驴,慢但肯定成功
  3. ipset:并不省维护,如果不需要黑名单助攻,划不来折腾
  4. ChinaDNS:对DNS过滤太死板,导致代理服务DNS死锁……
  5. Trojan透明代理手动配置:不标注127.0.0.1改成0.0.0.0也不说,折腾一天多欲仙欲死……

Trojan路由手动配置(摸索版)基于Trojan配置文档关于透明代理iptables规则设置Trojan透明代理手动配置,选了代码少的DNS on TCP(Trojan透明代理手动配置),实际使用性能问题严重。内存要有数据结构保持TCP连接,网络拥堵或大量并发查询,trojan就会挂(毕竟主流的OpenWRT最大内存才128M)。后面会提到一些优化,没用,还得上UDP。所以才要写改进版。

DNS与分流策略

DNS污染有两大解决思路:

策略A:白名单直接用国内DNS/连国内线路,黑名单用境外加密DNS/连境外线路,其他用ChinaDNS,国内IP连国内线路,国外IP连国内或境外线路。若白名单漏选,ChinaDNS应该可以保证合适的IP(连本地CDN)、连国内线路(有些政府网站屏蔽了境外IP),如果运营商没DNS劫持国内网站;若黑名单漏选,如果运营商DNS劫持你看广告(国内IP),那你就去不了目标网站。所以要看具体情况:

  • 如果你在境外上学/在外企工作,脱离中国社会,白名单之外全部出国
  • 如果没这么“国际化”/西化,那你要权衡连不上国外,还是连不上国内更不利(维护更麻烦)
  • 同样的,经过黑名单/白名单/ChinaDNS筛选后,可能没被封的国外IP连国内还是境外线路,也要权衡速度和连通性,如果目标线路不拥堵,直连肯定比绕圈快,但如果黑名单漏选,你会连不上

这里的连通性当然说的是“一次设置智能梯子”,尽量少维护,你当然可以手动修改黑名单/白名单/ChinaDNS(判断为国外IP连国内还是境外线路)。

ChinaDNS可补充黑名单漏选的情况,但如果黑名单漏选的域名被运营商DNS劫持就没办法。反过来单独用ChinaDNS更容易被劫持,黑名单没漏选的情况下,对ChinaDNS也是一种补充。而白名单更适合单独使用,查完“国内常用的域名表”还要连国内DNS,比只用ChinaDNS还多查一次表。这个表不大,但增加了复杂性和更新/维护的成本。

策略B:黑名单用境外DNS/连境外线路,其他用ChinaDNS判断为国内IP连国内线路,否则用境外DNS/连境外线路我看到有人同时用了ChinaDNS+ChinaList,不明白原因,国内网站解析到国外CDN是因为部署ChinaDNS到VPS了?

策略C:用ChinaDNS判断为国内IP连国内线路,否则用境外DNS/连境外线路宽带为联通/电信,而非宽带通/歌华等二级运营商,DNS劫持很少见。

透明代理

倘若你用过代理类梯子,就知道需要设置系统或浏览器,应用(比如浏览器)很清楚你在用代理。而透明代理工作在底层,应用(比如浏览器)对其一无所知(也就不用麻烦每个都设置)。如果你用惯了全局类VPN,会发现socks代理每个应用都要设置,而并非所有应用都支持socks代理。我在ubuntu设置了apt、3个firefox(各用于noscript/gifblock/java plugin),github update还是非常卡……

我决定先实现策略C(only ChinaDNS),需要先编译ChinaDNSDNS-Forwarder for OpenWRT(强烈建议把nano也加入编译,vi反复i/Esc实在太反人性)。据说ChinaDNS-NG维护更好更新,但没提OpenWRT,感觉不易上手。编译好刷机完,ssh登录,先设置Trojan:nano /etc/trojan.json

{
    "run_type": "nat",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "domain.you",
    "remote_port": 443,
    "password": [
        "yourpasswd"
    ],
    "log_level": 1,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "path/to/cert.pem",
        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
        "sni": "",
        "alpn": [
            "h2",
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "curves": ""
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "reuse_port": false,
        "fast_open": false,
        "fast_open_qlen": 20
    }
}

注意替换域名、密码、证书文件路径,注意run_type不同是natlocal_addr127.0.0.1(这是个大坑)

设置ChinaDNS:mv /etc/chinadns_chnroute.txt /etc/chinadns_chnroute && nano /etc/config/chinadns

config chinadns
        option enable '1'
        option bidirectional '1'
        option chnroute '/etc/chinadns_chnroute'
        option addr '0.0.0.0'
        option port '5353'
        option server '119.29.29.29,localhost#5300'

开启双向过滤,则丢弃境外DNS返回的国内IP,未必离你最近。

设置DNS-Forwarder:nano /etc/config/dns-forwarder

config dns-forwarder
        option enable '1'
        option listen_addr '0.0.0.0'
        option listen_port '5300'
        option dns_servers '1.1.1.1'

我选择Cloudflare,因为真正的自由主义对监控资本主义(谷歌)也充满警惕,在西方反乌托邦影视剧中大公司比威权政府更邪恶。不过Cloudflare也是最快的详细评测在此

设置dnsmasq:nano /etc/config/dhcp

config dnsmasq
        option domainneeded '1'
        option boguspriv '1'
        option filterwin2k '0'
        option localise_queries '1'
        option rebind_protection '1'
        option rebind_localhost '1'
        option local '127.0.0.1#5353'
        option domain 'lan'
        option expandhosts '1'
        option nonegcache '0'
        option authoritative '1'
        option readethers '1'
        option leasefile '/tmp/dhcp.leases'
        option noresolv '1'
        option nonwildcard '1'
        option localservice '1'
        option cachesize '10000'
        option dnsforwardmax '1000'

因为要通过dnsmasq配置/etc/config/dhcp或命令行设置上游DNS,要用noresolv替换resolvfilelocal/lan/改成127.0.0.1:5353cachesizednsforwardmax本为解决网络拥堵或大量并发查询时DNS on TCP超时,导致trojan进程占内存太多被杀掉,然并卵还得上UDP。

echo "$IPtoTrojanProxy $domain" >> /etc/hosts

否则会形成DNS死锁,对代理服务DNS要通过代理服务解析成IP才能进行代理服务DNS……

ChinaDNS在UDP 5353提供纯净的DNS,需要通过境外DNS将污染过滤;而现在从境外DNS无论UDP还是TCP查询都会被DROP/REJECT,因此需要通过DNS-Forwarder在5300提供UDP转TCP的DNS,最后DNS on TCP通过iptables重定向到代理Trojan发出。

iptables规则设置示例是个简易的透明代理,本地DNS和全部TCP流量都重定向到代理,没内外分流/本地CDN加速;Trojan透明代理手动配置用黑名单策略没完全实现内外分流,如果黑名单未及时收录,即使通过正确IP也可能上不了(封IP)。前节ChinaDNS/DNS-Forwarder已经实现了DNS策略,所以这里比iptables规则设置示例简单了很多:

iptables -t nat -N FKCCP

iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0/8 -j RETURN
iptables -t nat -A FKCCP -d 10/8 -j RETURN
iptables -t nat -A FKCCP -d 127/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168/16 -j RETURN
iptables -t nat -A FKCCP -d 224/4 -j RETURN
iptables -t nat -A FKCCP -d 240/4 -j RETURN

date && while read block; do
	iptables -t nat -A FKCCP -d $block -j RETURN
done < /etc/chinadns_chnroute && date

#iptables -t nat -A FKCCP -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080

iptables -t nat -A PREROUTING -p tcp -j FKCCP
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080

exit 0

while逐行读兲朝IP网段并RETURN很慢(MiR4A:10’23”),别急躁以为出错取消/重启。通常都卡在IO,但MT7621(MIPS)真慢,就算把chnroute写成iptables.sh上传到/tmp(RAM)也耗时10’29″……可以把chnroute分割成4段,4线程同时执行,但得上4把锁,后边的重定向等4个锁文件删除才执行,没必要。就算每天重启,夜里或午餐,还没10分钟空闲嘛。如果路由器很稳定,一年都执行不了一次。

scp tproxy $IPtoOpenWRT:/etc/rc.local

iptables重启就没了,把上面的内容保存为tproxy替换OpenWRT的/etc/rc.local,启动就能自动记载。尝试过加执行权限,放到/usr/bin或/root,但/etc/rc.local不调用……

iptables -t nat -N FKCCP
iptables -t mangle -N FKCCP

iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0/8 -j RETURN
iptables -t nat -A FKCCP -d 10/8 -j RETURN
iptables -t nat -A FKCCP -d 127/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168/16 -j RETURN
iptables -t nat -A FKCCP -d 224/4 -j RETURN
iptables -t nat -A FKCCP -d 240/4 -j RETURN

while read block; do
	iptables -t nat -A FKCCP -d $block -j RETURN
done < /etc/chinadns_chnroute

#iptables -t nat -A FKCCP -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080

ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A FKCCP -p udp -d 1.1.1.1 --dport 53 -j TPROXY --on-port 1080 #--tproxy-mark 0x01/0x01
#iptables -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 1

iptables -t nat -A PREROUTING -p tcp -j FKCCP
#iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080
iptables -t mangle -A PREROUTING -j FKCCP
iptables -t mangle -A OUTPUT -p udp -d 1.1.1.1 --dport 53 -j MARK --set-mark 1

exit 0

尝试过代理DNS on UDP,原理也懂点,但无论本地/转发都试过,要么无应答,要么被污染。OpenWRT日志看不到Trojan对DNS on UDP的转发,TPROXY流程很复杂,日志看得晕头转向:DNS on UDP(1.1.1.1)没重定向到1080就发出去了、或不知所踪、或SRC/DST逆转(不知道无应答/被污染还是彻底反了),总之追踪路由/网络编程源码(还是C语言)超出了效费比下限……

据说TPROXY只能应用于PREROUTING链的mangle表,只能透明代理来自内网的UDP流量,对于本机的UDP则无能为力……等于说需要2台路由器或linux主机,一台透明代理Trojan,一台dnsmasq/ChinaDNS作专用DNS……

开p2p下载,trojan在2’/10’内耗尽内存被杀掉,服务端timeout从10’改30″也无济于事(MiR4A峰值load超过17了…)。考虑过supervisor,但supervisor基于python,32M闪存都装不下。busybox编译可选的runit太简陋,monit挺麻烦还要占900+K闪存。可以用以下命令切换(也可以写成alias)。

cat .ssh/id_rsa.pub | ssh $IPtoOpenWRT "sed -i 's/127.0.0.1#5353/119.29.29.29/' /etc/config/dhcp && /etc/init.d/dnsmasq reload"
cat .ssh/id_rsa.pub | ssh $IPtoOpenWRT "sed -i 's/119.29.29.29/127.0.0.1#5353/' /etc/config/dhcp && /etc/init.d/dnsmasq reload"

如果p2p时还想留梯子,可以让transmission/amule启动/退出时,启动trojan并切换firefox代理配置文件。

su - $usr -c "sed -i 's/network.proxy.type\", 0/network.proxy.type\", 1/' .mozilla/firefox/*/prefs.js && cd Downloads/trojan && ./trojan &" && cat .ssh/id_rsa.pub | ssh $IPtoOpenWRT "sed -i 's/127.0.0.1#5353/119.29.29.29/' /etc/config/dhcp && /etc/init.d/dnsmasq reload" && su - $usr -c 'transmission-gtk' && cat .ssh/id_rsa.pub | ssh $IPtoOpenWRT "sed -i 's/119.29.29.29/127.0.0.1#5353/' /etc/config/dhcp && /etc/init.d/dnsmasq reload" && kill `pidof trojan` && su - $usr -c "sed -i 's/network.proxy.type\", 1/network.proxy.type\", 0/' .mozilla/firefox/*/prefs.js"

然而prefs.js不重启firefox没reload方法,只能手动切,多点几下吧……

cat .ssh/id_rsa.pub | ssh $IPToOpenWRT "sed -i 's/127.0.0.1#5353/119.29.29.29/' /etc/config/dhcp && mv /etc/rc.local . && reboot" && su - $usr -c "cd $Path2Trojan && ./trojan &" && su - $usr -c 'transmission-gtk' && cat .ssh/id_rsa.pub | ssh $IPToOpenWRT "sed -i 's/119.29.29.29/127.0.0.1#5353/' /etc/config/dhcp && mv rc.local /etc && reboot" && kill `pidof trojan`

先启动trojan客户端,ChinaDNS换国内DNS/重载dnsmasq;再启动p2p;退出时换回ChinaDNS/重载dnsmasq,关掉trojan客户端。

编译和测试

按目录选择以下包,编译OpenWRT:

LuCI
Network/ChinaDNS,Network/dns-forwarder,Network/trojan
Utilities/Editors/nano

如果TCP流量全重定向,测速成绩接近浏览器socks代理。如果只重定向80/443,测速会很差,实际使用能到16~25M/s。

我用letsencrypt颁发的证书90天过期(非3月),每60天自动renew,干脆每天更新一次:

yuangg@picasso:~$ echo "32 21 * * * scp $domain:/etc/letsencrypt/live/$domain/cert.pem client/path/ && scp client/path/cert.pem root@$IPtoOpenWRT:/etc/" | crontab -

我的letsencrypt每60天21:31自动renew,你哪天梯子坏了服务器看一下,当然撑到凌晨3点renew一次,能保证以后都在凌晨更新,一点也不影响上网。

策略C实际使用有域名无法解析,比如著名技术博客阮一峰,DNS-Forwarder可以解析出11个日本IP,ChinaDNS/dnsmasq就不行,可能还需要黑名单助攻。黑名单不能直接查阮一峰在不在上面,不好说改进ChinaDNS/换ChinaDNS-NG,还是策略B更好(所以说可能)。

全设置脚本

MiR4A不稳定,p2p下载会挂掉LuCI、连不上wwan、偶尔自动重启。升级因为测速更快,长期使用差别不大。重新编译刷MW4530R,懒得重新设置。注意不同路由/版本,resolv.conf.auto路径可能不同。

ssh-keygen -f /root/.ssh/known_hosts -R 192.168.1.1 && ssh-keygen -f /root/.ssh/known_hosts -R 10.0.0.239 && scp Downloads/trojan/config.json 192.168.1.1:/etc/trojan.json && scp Downloads/trojan/cert.pem 192.168.1.1:/etc/ && scp Documents/deploy/tproxy 192.168.1.1:/etc/rc.local && cat .ssh/id_rsa.pub | ssh 192.168.1.1 "cat > /etc/dropbear/authorized_keys && sed -i -e 's/OpenWrt/MW4530R/' -e 's/UTC/CST-8/' -e '5i\option zonename Asia/Shanghai' /etc/config/system && sed -i 's/192.168.1.1/10.0.0.239/' /etc/config/network && sed -i -e 's/\/lan\//127.0.0.1#5353/' -e 's/resolvfile/noresolv/' -e 's/\/tmp\/resolv.conf.auto/1/' -e '19i\option cachesize 10000' /etc/config/dhcp && echo -e '\n34.92.185.251 pinshu.ren' >> /etc/hosts && sed -i -e 's/0/1/' -e 's/1.0/0.0/' -e 's/.txt//' -e 's/114.114.114.114,8.8.4.4/119.29.29.29,localhost#5300/' /etc/config/chinadns && sed -i -e 's/0/1/' -e 's/1.0/0.0/' -e 's/10/00/' -e 's/8/1/g' /etc/config/dns-forwarder && mv /etc/chinadns_chnroute.txt /etc/chinadns_chnroute && sed -i 's/0/1/' /etc/config/trojan && sed -i -e 's/client/nat/' -e 's/127.0.0.1/0.0.0.0/' -e 's/cert.pem/\/etc\/cert.pem/' /etc/trojan.json" && ssh 192.168.1.1 'passwd root && reboot'

曾设想mwan多线,11n 2×2上限约128M,俩100M wwan就成瓶颈了,但手机只有极少情形,譬如同时升级系统/下载APP/下载离线地图,能用满3线路。电脑p2p下载通过有线连接,要达到1000M的瓶颈需要10×100M线路,实际上wwan很少会超过65M……通常可用的wwan不超仨……当然双/多线HA还是有用的,但对手机银行、京东、淘宝等应用,增加了复杂性。因为只能通过相同的线路登录,使用中线路A变差切换到B就会出问题,而固定线路未必始终可用……

总结

OpenWRT透明代理日常上网没问题,p2p下载DNS on TCP(网络拥堵或大量并发查询)会导致trojan在2’/10’内耗尽内存被杀掉(MiR4A峰值load超过17了…),内存/系统/闪存/CPU局限太多了。这些对电脑根本不是问题(除了能效差),玩到最后都会上软路由,我觉得我不会MIPS>ARM>Intel NANO>Intel移动U,MIPS/ARM高端路由缺乏性价比,技术还落伍。如果我需要WiFi6VR流视频,AX200比2.5G有线网卡便宜。毕竟160MHz的WiFi6峰值1.6G有线千兆已成瓶颈,广域网才普及100M,WiFi6软路由不会长时间运行。这需求有线网太贵了,用NAS俩万兆网卡就超过1600了,618/双11不到1000攒2×32G内存不香吗?

穿越长城走向世界:Trojan路由手动配置(摸索版)

题外话

08年8月买了G1开发Android,因此买了第一个路由器,内置天线百兆LAN的W268R。后来用GoAgent知道了OpenWRT,13年买了千兆WR1041N,迷你WR703N,64M内存的迷你DIR 505,128M带USB的MW4530R……败家有点内疚,京东买WR1041N退货了(刷机后千兆经常重连),刚好W268R没多久摔坏了。虽然普通人很少挪动,没移动部件……拆了没发现哪断了,MW4530R转主力!WR703N虽很小,但再拖电源/线,就不如505适合卫生间信号覆盖了。然后15年WR703N突然点不亮,USB电涌?!…

505定位是旅行(当然现在宾馆无线很普及),但有时难免AP刚好要穿过几个墙角/一条很长的墙,除了卫生间卧室无线信号也弱……所以505一半的时间都有用,其它时间跑reaver本来也挺好,然而大部分AP并不开WPS……

到了2020年,MW4530R信号变弱了,趁618升级MiR4A。很便宜70多,比玩具(除刷机几乎没用过)WR703N还便宜20。当然,128M以下11n仍够用,320M以下WiFi5也不算瓶颈。现在除了北京,最便宜宽带都不超过100M。

网上说小米路由烂的很多。确实刷机难,MiR4A刷砖了3次,AC2100没刷成,模拟拨号成功,就是没反向shell……我通常不会反复尝试相同方法,但刷小米路由属于玄学,最后没砖的反复刷5次成功……新的MiR4A信号强,一个月之后也变弱了。MW4530R从未连不上LuCI。MiR4A开机22天就死机了,重启LuCI也没用,我设置每月1/15号重启,剩2天又死机了,而且电脑有连接无IP出不去(我改成每周日重启)……但实在很便宜(200以内WiFi5千兆刷OpenWRT唯三选MiR4A/红米/小米AC2100,200多唯一R6260还是翻新机),就当主路由备机吧……

本来就不喜欢AC2100,太厚笨,只是轻薄的MiR4A信号比它弱。不过后来知道大神固件几十兆,AC2100(128M)才能玩的起,MiR4A只有16兆闪存……然而,大神、大神除源码组件没任何文档,我也不放心用。

前言

OpenWRT不能直接装Trojan,编译教程网上很多。但对于习惯PP2P/OpenVPN全局代理的网民来说,代理类SS(R)/Trojan是一个大坑。shell系配置为扁平键值对,而JSON键值对/对象后面只要有逗号,就得再跟一个键值对/对象,否则语法错误,服务/客户端都无法启动。服务看日志就会发现问题,而我找不到OpenWRT的日志文件,查状态就是running……LuCI找日志才看到报错,而基于全局代理的经验ping/nslookup google只会更困惑,困难归纳为:

  • JSON苛刻的语法(普通码农都很少手写JSON),改配置容易出错彻底挂掉;
  • OpenWRT日志文件难找,挂了服务状态正常,Trojan也不在shell报错;
  • 代理系梯子,不能用VPN类全局的经验ping/nslookup google检查连接性;

如果下载了客户端,压缩包有个examples文件夹,你就会知道client.config怎么写(注意替换域名、密码、证书文件路径):

{
    "run_type": "client",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "domain.you",
    "remote_port": 443,
    "password": [
        "yourpasswd"
    ],
    "log_level": 1,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "path/to/cert.pem",
        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
        "sni": "",
        "alpn": [
            "h2",
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "curves": ""
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "reuse_port": false,
        "fast_open": false,
        "fast_open_qlen": 20
    }
}

然而在OpenWRT+Trojan源码找不到config.json,编译后搜到的(也就是刷机后路由器中的)config.json是服务器类型……境内路由部署Trojan服务意义何在?我用server.config照网上教程删被坑很多次,从最后键值对开始删,前面键值对逗号不删,就无法启动,报错还忒简略……

DNS与分流策略

我的OpenVPN始终离不开hosts文件,自己搭DNS很复杂,一直懒得折腾。几乎只用搜索也没问题,Youtube这种疯狂跳转的不行,今年不得不寻求彻底解决方案。

DNS污染有两大解决思路:

策略A:白名单直接用国内DNS/连国内线路,黑名单用境外加密DNS/连境外线路,其他用ChinaDNS,国内IP连国内线路,国外IP连国内或境外线路。若白名单漏选,ChinaDNS应该可以保证合适的IP(连本地CDN)、连国内线路(有些政府网站屏蔽了境外IP),如果运营商没DNS劫持国内网站;若黑名单漏选,如果运营商DNS劫持你看广告(国内IP),那你就去不了目标网站。所以要看具体情况:

  • 如果你在境外上学/在外企工作,脱离中国社会,白名单之外全部出国
  • 如果没这么“国际化”/西化,那你要权衡连不上国外,还是连不上国内更不利(维护更麻烦)
  • 同样的,经过黑名单/白名单/ChinaDNS筛选后,可能没被封的国外IP连国内还是境外线路,也要权衡速度和连通性,如果目标线路不拥堵,直连肯定比绕圈快,但如果黑名单漏选,你会连不上

这里的连通性当然说的是“一次设置智能梯子”,尽量少维护,你当然可以手动修改黑名单/白名单/ChinaDNS(判断为国外IP连国内还是境外线路)。

ChinaDNS可补充黑名单漏选的情况,但如果黑名单漏选的域名被运营商DNS劫持就没办法。反过来单独用ChinaDNS更容易被劫持,黑名单没漏选的情况下,对ChinaDNS也是一种补充。而白名单更适合单独使用,查完“国内常用的域名表”还要连国内DNS,比只用ChinaDNS还多查一次表。这个表不大,但增加了复杂性和更新/维护的成本。

策略B:黑名单用境外DNS/连境外线路,其他用ChinaDNS判断为国内IP连国内线路,否则用境外DNS/连境外线路我看到有人同时用了ChinaDNS+ChinaList,不明白原因,国内网站解析到国外CDN是因为部署ChinaDNS到VPS了?

策略C:用ChinaDNS判断为国内IP连国内线路,否则用境外DNS/连境外线路宽带为联通/电信,而非宽带通/歌华等二级运营商,DNS劫持很少见。

透明代理

倘若你用过代理类梯子,就知道需要设置系统或浏览器,应用(比如浏览器)很清楚你在用代理。而透明代理工作在底层,应用(比如浏览器)对其一无所知(也就不用麻烦每个都设置)。如果你用惯了全局类VPN,会发现socks代理每个应用都要设置,而并非所有应用都支持socks代理。我在ubuntu设置了apt、3个firefox(各用于noscript/gifblock/java plugin),github update还是非常卡……

操作指导网上很多,深入浅出讲原理的很少。我们以Trojan配置文档关于透明代理iptables规则设置为例进行学习。

不难从前一节域名解析策略推测出,对国内/境外上网分流,需要对流量设置规则。而在操作层面会具体到每一个数据包(网络传输内容的数据分片),这些规则按执行顺序划分的列表称之为(规则集),这些链按功能划分为(链集)。iptables包含5个(功能)表,raw/filter(用于防火墙)/nat(网络地址转换,例如端口转发)/mangle(修改数据包)/security。

# Create new chain
iptables -t nat -N SHADOWSOCKS
iptables -t mangle -N SHADOWSOCKS

# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN

# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
# See ashi009/bestroutetb for a highly optimized CHN route list.
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

用户自定义了一个链/规则集SHADOWSOCKS,每一条规则中,-j(–jump)指定了满足条件的数据包接下来应用的目标/下一条规则目标/下一条规则可以是自定义链/规则集,或者内置的链/规则集,例如:ACCEPT(放行数据包,默认)、DROP(丢弃数据包)、RETURN(停止应用该链/规则集)、REJECT(丢弃数据包,返回错误包)、REDIRECT(重定向数据包到指定端口)、TPROXY(标记目标端口数据包并导向指定端口)。

ACCEPTRETURN的区别,相当于编程循环的continue和break,只要发向内网IP和代理服务器IP的数据包不会再经过SHADOWSOCKS链/规则集处理。

除了代理服务器和内网IP,也可以RETURN全部的国内IP段,实现内外分流。

# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345

这里将所有前面没RETURN的TCP流量导向代理服务器,没必要,你不想电骡/torrent从韩国/呆弯/夯康的下载/上传消耗服务器流量吧?53/80/443可满足大部分需求,但Youtube或其它你需要的应用,可能要开一些非标准端口。当网站不能正常使用,可通过HttpFox查看哪些端口连不上,再增加对这些端口的重定向。

# Add any UDP rules
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01

这里将本地DNS查询(UDP 53)加上透明代理标记,重定向到代理客户端,由代理客户端执行DNS策略。

# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
iptables -t mangle -A PREROUTING -j SHADOWSOCKS

这里以ShadowSocks为例,自定义了一个SHADOWSOCKS链/规则集,当然也可以指定其它名字(比如TROJAN)。iptables其实很复杂,这里只求看懂几条命令。

网上有一个Trojan透明代理手动配置,不过用的黑名单策略:黑名单中的域名解析/流量和谷歌DNS查询重定向到代理客户端。因为只编译了dns-forwarder,只接受谷歌DNS的查询结果,没完全实现内外分流。尽管只定义黑名单域名走境外代理,但对于出海的中国互联网企业(阿里/京东/抖音……),也会因为谷歌DNS返回境外的IP而上了一个用不上的网站。其价值在于可以参考实现策略B(黑名单+ChinaDNS)。当然如果你在深圳,VPS在中国香港,内容/延迟差别不大(高峰期有可能被限速)。此外,如果黑名单未及时收录,即使通过正确IP也可能上不了(封IP)。

我决定先实现策略C(only ChinaDNS),需要先编译ChinaDNSDNS-Forwarder for OpenWRT(强烈建议把nano也加入编译,vi反复i/Esc实在太反人性)。据说ChinaDNS-NG维护更好更新,但没提OpenWRT,感觉不易上手。编译好刷机完,ssh登录,先设置Trojan:nano /etc/trojan.json

{
    "run_type": "nat",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "domain.you",
    "remote_port": 443,
    "password": [
        "yourpasswd"
    ],
    "log_level": 1,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "path/to/cert.pem",
        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
        "sni": "",
        "alpn": [
            "h2",
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "curves": ""
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "reuse_port": false,
        "fast_open": false,
        "fast_open_qlen": 20
    }
}

跟前面客户端配置client.config只有run_type不同是nat,注意替换域名、密码、证书文件路径。

设置ChinaDNS:mv /etc/chinadns_chnroute.txt /etc/chinadns_chnroute && nano /etc/config/chinadns

config chinadns
        option enable '1'
        option bidirectional '1'
        option chnroute '/etc/chinadns_chnroute'
        option addr '0.0.0.0'
        option port '5353'
        option server '119.29.29.29,localhost#5300'

开启双向过滤,则丢弃境外DNS返回的国内IP,未必离你最近。

设置DNS-Forwarder:nano /etc/config/dns-forwarder

config dns-forwarder
        option enable '1'
        option listen_addr '0.0.0.0'
        option listen_port '5300'
        option dns_servers '1.1.1.1'

我选择Cloudflare,因为真正的自由主义对监控资本主义(谷歌)也充满警惕,在西方反乌托邦影视剧中大公司比威权政府更邪恶。不过Cloudflare也是最快的详细评测在此

设置dnsmasq:nano /etc/config/dhcp

config dnsmasq
        option domainneeded '1'
        option boguspriv '1'
        option filterwin2k '0'
        option localise_queries '1'
        option rebind_protection '1'
        option rebind_localhost '1'
        option local '/lan/'
        option domain 'lan'
        option expandhosts '1'
        option nonegcache '0'
        option authoritative '1'
        option readethers '1'
        option leasefile '/tmp/dhcp.leases'
        option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
        option nonwildcard '1'
        option localservice '1'

以上默认配置高亮为与ChinaDNS和DNS-Forwarder 的设置示例不一样的部分。大部分留着没问题,authoritative深入看手册。因为要通过dnsmasq配置/etc/config/dhcp或命令行设置上游DNS,要用noresolv替换resolvfilelocal/lan/改成127.0.0.1:5353 ,最后加nohosts(费这么大劲就为了永别/etc/hosts),ipset(每次换节点不用改IP)。改2加2。

config dnsmasq
        option domainneeded '1'
        option boguspriv '1'
        option filterwin2k '0'
        option localise_queries '1'
        option rebind_protection '1'
        option rebind_localhost '1'
        option local '127.0.0.1#5353'
        option domain 'lan'
        option expandhosts '1'
        option nonegcache '0'
        option authoritative '1'
        option readethers '1'
        option leasefile '/tmp/dhcp.leases'
        option noresolv '1'
        option nonwildcard '1'
        option localservice '1'
        option nohosts '1'
        list ipset 'domain.you'

ChinaDNS在UDP 5353提供纯净的DNS,需要通过境外DNS将污染过滤;而现在从境外DNS无论UDP还是TCP查询都会被DROP/REJECT,因此需要通过DNS-Forwarder在5300提供UDP转TCP的DNS,最后DNS on TCP通过iptables重定向到代理Trojan发出。

此命令换节点/IP就得手动修改,嫌麻烦:

# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN

可以用dnsmasq+ipset实现iptables对代理服务器RETURN。dnsmasq在DNS时匹配指定域名集,就把其IP存在ipset集,这样iptables就可以对这个ipset包含的全部IP匹配和处理。这样换节点、变IP可以自动对代理服务器RETURN

iptables规则设置示例是个简易的透明代理,本地DNS和全部TCP流量都重定向到代理,没内外分流/本地CDN加速;Trojan透明代理手动配置用黑名单策略没完全实现内外分流,如果黑名单未及时收录,即使通过正确IP也可能上不了(封IP)。前节ChinaDNS/DNS-Forwarder已经实现了DNS策略,所以这里比iptables规则设置示例简单了很多:

iptables -t nat -N FKCCP

ipset -N private iphash
iptables -t nat -A FKCCP -m set --match-set private dst -j RETURN
iptables -t nat -A FKCCP -d 0.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 10.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 127.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16.0.0/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 224.0.0.0/4 -j RETURN
iptables -t nat -A FKCCP -d 240.0.0.0/4 -j RETURN

iptables -t nat -A FKCCP -p tcp -m multiport --dports 53,80,443 -j REDIRECT --to-ports 1080

iptables -t nat -A PREROUTING -p tcp -j FKCCP

编译和测试

默认编译的dnsmasq不包含ipset模块,需编译dnsmasq-full(默认含ipset模块)。MiR4A/AC2100尚无稳定版(不能opkg install),选以下模块(根据目录查找),切记取消勾选默认dnsmasq(与dnsmasq-full只能二选一)

Base/dnsmasq-full
LuCI
Network/Firewall/iptables-mod-nat-extra
Network/ChinaDNS,dns-forwarder,ipset,trojan
Utilities/Editors/nano

OpenWRT日志在LuCI>Status>System Log看到类似于(^F查找trojan)的以下内容,就表示Trojan代理成功运行:

Wed Aug  5 19:49:10 2020 daemon.err trojan[1964]: [2020-08-05 19:49:10] [WARN] trojan service (nat) started at 127.0.0.1:1080

ChinaDNS/DNS-Forwarder配置很简单,没JSON苛刻的语法,一次过:

root@MiR4A:~# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:www             0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      
tcp        0      0 :::www                  :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
udp        0      0 0.0.0.0:5300            0.0.0.0:*                           
udp        0      0 0.0.0.0:mdns            0.0.0.0:*                           
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING       1024 /var/run/ubus.sock

5300为DNS-Forwarder,mdns(Multicast DNS,与前面www/ssh类似标准端口)即5353,为ChinaDNS。netstat只确保ChinaDNS/DNS-Forwarder运行,ChinaDNS只执行过滤DNS污染的逻辑,DNS-Forwarder只提供UDP转TCP的DNS,iptables则承担最关键DNS on TCP on Trojan,以保证可信的DNS:

root@MiR4A:~# iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 1080
root@MiR4A:~# iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080
root@MiR4A:~# nslookup www.google.com 127.0.0.1#5353
Server:		127.0.0.1
Address:	127.0.0.1#5353

Name:      www.google.com
Address 1: 172.217.160.100
Address 2: 2001::8079:926b

对比Trojan文档关于透明代理iptables规则设置Trojan透明代理手动配置,会发现Trojan文档推荐配置修改UDP 53,重定向到代理服务完成DNS,而Trojan透明代理手动配置则通过DNS-Forwarder将DNS on UDP转为DNS on TCP,再重定向给代理服务完成DNS。如果将DNS on TCP视为和80/443的HTTP/HTTPS(on TCP)一样的数据包,只有PREROUTINGOUTPUT,就没有过滤DNS污染的效果。

root@MiR4A:~# nslookup www.google.com
Server:		8.8.8.8
Address:	8.8.8.8#53

*** Can't find www.google.com: Parse error
Name:      www.google.com
Address 1: 69.63.190.26

运营商DNS有时候会挂,以前在wwan设置了custom DNS。虽然会被污染,1.1.1.1根本不解析。删掉8.8.8.8再试就正常:

root@MiR4A:~# nslookup www.google.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Name:      www.google.com
Address 1: 172.217.19.67
Address 2: 2001::ae24:c4f2

有时候会出现:

root@MiR4A:~# nslookup www.google.com
Server:		127.0.0.1
Address:	127.0.0.1#53

*** Can't find www.google.com: No answer
Name:      www.google.com
Address 1: 2001::1f0d:500f
root@MiR4A:~# nslookup www.google.com 127.0.0.1#5353
Server:		127.0.0.1
Address:	127.0.0.1#5353

*** Can't find www.google.com: No answer
Name:      www.google.com
Address 1: 2001::1f0d:4a11

通过LuCI的Status>System Log检查Trojan/ChinaDNS都正常运行,重定向DNS on TCP要用5~9″才返回区区约100字节,等一会正常了。但再等一会儿又不正常了,大部分时间都不正常,境外域名全都连不上:

Thu Aug  6 11:19:49 2020 daemon.err trojan[1885]: [INFO] 192.168.10.55:58608 forwarding to 1.1.1.1:53 via domain.you:443
Thu Aug  6 11:19:50 2020 daemon.err trojan[1885]: [ERROR] 192.168.10.55:58608 cannot resolve remote server hostname domain.you: Host not found (non-authoritative), try again later
Thu Aug  6 11:19:50 2020 daemon.err trojan[1885]: [INFO] 192.168.10.55:58608 disconnected, 0 bytes received, 35 bytes sent, lasted for 5 seconds

形成了死锁,对代理服务DNS要通过代理服务解析成IP才能进行代理服务DNS……

ChinaDNS机制是国内DNS若返回化外IP则DROP,等境外DNS返回。如果路由器刚重启dnsmasq没来及缓存,你马上设置iptables重定向境外DNS on TCP到代理服务,境内DNS来不及伪装成境外DNS返回代理服务IP就锁死DNS……

ChinaDNS/DNS-Forwarder只要设置了iptables重定向境外DNS on TCP就能正常运行,因为测试前dnsmasq已经被代理服务客户端对代理服务DNS缓存了代理服务的IP,而整合dnsmasq再重启破坏了这个前提。

Trojan透明代理手动配置基于dnsmasq在DNS时匹配指定域名集,就把其IP存在ipset集,这样iptables就可以对这个ipset包含的全部IP匹配和处理,因为采用了策略A(黑名单),没采用ChinaDNS对国内DNS返回的化外IP直接DROP,所以dnsmasq确保会缓存一份国内DNS查询的结果,若在黑名单上会被后返回的境外DNS on TCP查询结果替代。而对于策略C(only ChinaDNS),dnsmasq-full(with ipset support)要先DNS存ipset,再根据ipset对代理服务RETURN,用dnsmasq+ipset实现iptables对代理域名RETURN,除非ChinaDNS改进对国内DNS返回的化外IP直接DROP

策略C只比策略A对黑名单多查一次国内DNS,毫秒级而已,而境外代理至少几十/几百毫秒延迟。策略A还有黑名单未及时收录,即使通过正确IP也可能上不了(封IP),连通性不好的问题。

LuCI
Network/ChinaDNS,dns-forwarder,trojan
Utilities/Editors/nano

如果路由器空间紧张(MiR4A可以省64K:),可取消打包Base/dnsmasq-full(切记要勾选Base/dnsmasq)、Network/Firewall/iptables-mod-nat-extra、Network/ipset,很少需要经常换代理服务节点/IP。以前在vultr达拉斯5年只换2次IP,没必要为省这点修改/维护,浪费更多时间(已经浪费很多时间了:)。

root@MiR4A:~# iptables -t nat -A PREROUTING -d $IPtoTrojanProxy -j RETURN
root@MiR4A:~# iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 1080
root@MiR4A:~# iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080
root@MiR4A:~# nslookup www.google.com 127.0.0.1#5353
Server:		127.0.0.1
Address:	127.0.0.1#5353

*** Can't find www.google.com: No answer
Name:      www.google.com
Address 1: 1949::1967:2020

还是不解析代理服务……ChinaDNS对国内DNS返回的化外IP直接DROP,而非替换太反人性了!不能直接改/etc/trojan.json,因为证书绑定了域名(地址改ip会报错),只能改hosts和dnsmasq:

echo "$IPtoTrojanProxy $domain" >> /etc/hosts
sed -i -e '/nohosts/d' -e '/ipset/d' /etc/config/dhcp

至此域名解析策略C终于完结了……

root@MiR4A:~# nslookup www.google.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Name:      www.google.com
Address 1: 216.58.200.68
Address 2: 2001::c710:9eb6

复杂的3层DNS(dnsmasq/ChinaDNS/DNS-Forwarder)过滤都成功了,而且DNS on TCP也REDIRECT成功了,关键就一句REDIRECT还不简单吗?然而就上不了谷歌,那照猫画虎加一句OUTPUT

iptables -t nat -N FKCCP

iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 10.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 127.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16.0.0/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 224.0.0.0/4 -j RETURN
iptables -t nat -A FKCCP -d 240.0.0.0/4 -j RETURN

iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080

iptables -t nat -A PREROUTING -p tcp -j FKCCP
iptables -t nat -A OUTPUT -p tcp -j FKCCP

还是上不了,而且看日志trojan只收到转发DNS on TCP。几十个网页看得欲仙欲死,文档惜字如金,一图胜千言还是看不懂。最关键内网在哪外网在哪?此图进出口没问题,但区分内外网是基础。

不过也非自愿明白了PREROUTINGOUTPUT的区别:内网进/出路由的流量。所以重定向DNS on TCP不需要PREROUTING。DNS标准也支持TCP,但通常只有报文长度超过UDP最大512字节,或域名服务器之间同步才用到。内网DNS皆UDP,根本不调用PREROUTING。如果调用了PREROUTING,复杂的3层DNS(dnsmasq/ChinaDNS/DNS-Forwarder)过滤就失效了,CDN加速/内外分流都白折腾了。

#iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080

清楚这并不够,还只有DNS正常……折腾一天多总算用日志解决了:

#iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080

iptables -t nat -N FKCCP
#iptables -t nat -A FKCCP -j ACCEPT

iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 10.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 127.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16.0.0/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 224.0.0.0/4 -j RETURN
iptables -t nat -A FKCCP -d 240.0.0.0/4 -j RETURN

iptables -t mangle -A INPUT -p tcp -j LOG --log-prefix "mangle "
iptables -t nat -A FKCCP -p tcp -j LOG --log-prefix "before "
#iptables -t nat -A FKCCP -p tcp -j REDIRECT --to-ports 1080
#iptables -t nat -A FKCCP -p tcp -m multiport --dports 53,80,443 -j REDIRECT --to-ports 1080
iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080
iptables -t nat -A FKCCP -p tcp -j LOG --log-prefix "after "
iptables -t mangle -A OUTPUT -p tcp -j LOG --log-prefix "MANGLE "

iptables -t nat -A PREROUTING -p tcp -j FKCCP
#iptables -t nat -A OUTPUT -p tcp -j FKCCP
#iptables -t nat -A PREROUTING -p tcp -s 10/8 -j FKCCP
#iptables -t nat -A POSTROUTING -p tcp -s 10/8 -j MASQUERADE

原来参考的Trojan透明代理手动配置端口从127.0.0.1改到了0.0.0.0却没有标注,而Trojan配置文档默认端口为127.0.0.1,因为没标注没注意就没改。PREROUTING重定向127.0.0.1:1080127.0.0.1只有路由器的进程能访问(环回地址不经过物理端口),非自愿被鞭策复习重定向(要客户端重新请求)和转发(代发)的区别……大部分文档都写转发,Trojan透明代理手动配置漏这一句话,坑我一天多……

root@MiR4A:~# logread | grep 205
Fri Aug 7 19:49:67 2020 kern.warn kernel: [ 1063.956423] before IN=br-lan OUT= MAC=54:48:e6:a8:a0:00:00:d8:61:a6:a7:72:08:00 SRC=10.0.0.205 DST=172.217.20.20 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=43172 DF PROTO=TCP SPT=54698 DPT=443 WINDOW=64240 RES=0x00 SYN URGP=0
Fri Aug 7 19:49:67 2020 kern.warn kernel: [ 1063.990896] mangle IN=br-lan OUT= MAC=54:48:e6:a8:a0:00:00:d8:61:a6:a7:72:08:00 SRC=10.0.0.205 DST=10.0.0.235 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=43172 DF PROTO=TCP SPT=54698 DPT=1080 WINDOW=64240 RES=0x00 SYN URGP=0
Fri Aug 7 19:49:67 2020 kern.warn kernel: [ 1064.029443] MANGLE IN= OUT=br-lan SRC=10.0.0.235 DST=10.0.0.205 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=1080 DPT=54698 WINDOW=0 RES=0x00 ACK RST URGP=0

127.0.0.1改成0.0.0.0127.0.0.1改成0.0.0.0127.0.0.1改成0.0.0.0

{
    "run_type": "nat",
    "local_addr": "0.0.0.0",
    "local_port": 1080,
    "remote_addr": "domain.you",
    "remote_port": 443,
    "password": [
        "yourpasswd"
    ],
    "log_level": 1,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "path/to/cert.pem",
        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
        "sni": "",
        "alpn": [
            "h2",
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "curves": ""
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "reuse_port": false,
        "fast_open": false,
        "fast_open_qlen": 20
    }
}

如果TCP流量全重定向,测速成绩接近浏览器socks代理。如果只重定向80/443,测速会很差,实际使用能到16~25M/s。

P2P晚上速度快,白天都要用网开的少,看你嫌不嫌麻烦每天(自动)切换。比如8~22重定向全部TCP流量,夜里重定向80/443/…

#!/bin/bash
iptables -t nat -N FKCCP

iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0/8 -j RETURN
iptables -t nat -A FKCCP -d 10/8 -j RETURN
iptables -t nat -A FKCCP -d 127/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168/16 -j RETURN
iptables -t nat -A FKCCP -d 224/4 -j RETURN
iptables -t nat -A FKCCP -d 240/4 -j RETURN

date && while read block; do
	iptables -t nat -A FKCCP -d $block -j RETURN
done < /etc/chinadns_chnroute && date

#iptables -t nat -A FKCCP -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080

iptables -t nat -A PREROUTING -p tcp -j FKCCP
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080

至此内外分流终于完结了……

while逐行读兲朝IP网段并RETURN很慢(MiR4A:10’23”),别急躁以为出错取消/重启。通常都卡在IO,但MT7621(MIPS)真慢,就算把chnroute写成iptables.sh上传到/tmp(RAM)也耗时10’29″……可以把chnroute分割成4段,4线程同时执行,但得上4把锁,后边的重定向等4个锁文件删除才执行,没必要。就算每天重启,夜里或午餐,还没10分钟空闲嘛。如果路由器很稳定,一年都执行不了一次。

chmod u+x tproxy && scp tproxy $IPtoOpenWRT:/usr/bin/ && ssh $IPtoOpenWRT

iptables重启就没了,把上面的内容保存为tproxy,加执行权限,scp到路由,重启自动运行:

root@MiR4A:~# nano /etc/rc.local

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
tproxy
exit 0

我用letsencrypt颁发的证书90天过期(非3月),只能每俩月(初凌晨3:01)续一次(服务器3点renew):

yuangg@picasso:~$ echo "1 3 1 */2 * scp pinshu.ren:/etc/letsencrypt/archive/$domain/cert1.pem client/path/cert.pem && scp client/path/cert.pem root@$IPtoOpenWRT:/etc/" | crontab -

然而letsencrypt每60天自动renew,crontab太难写,干脆每天更新一次:

yuangg@picasso:~$ echo "32 21 * * * scp $domain:/etc/letsencrypt/live/$domain/cert.pem client/path/ && scp client/path/cert.pem root@$IPtoOpenWRT:/etc/" | crontab -

我的letsencrypt每60天21:31自动renew,你哪天梯子坏了服务器看一下,当然撑到凌晨3点renew一次,能保证以后都在凌晨更新,一点也不影响上网。

策略C实际使用有域名无法解析,比如著名技术博客阮一峰,DNS-Forwarder可以解析出11个日本IP,ChinaDNS/dnsmasq就不行,可能还需要黑名单助攻。黑名单不能直接查阮一峰在不在上面,不好说改进ChinaDNS/换ChinaDNS-NG,还是策略B更好(所以说可能)。

总结

罗嗦了半天,只为理解掌握大部分配置,可以自由修改(可见自由在于掌握了多少信息,否则只是自以为没被操控)。当然,你可以花钱买现成,也可以省心刷大神固件,还可以照葫芦画瓢,但出了问题无法维护,也无法优化。大多数不开机/反复自动关机,只需要换主板电池/清理内存插槽即可,小白却只能换掉整台电脑。

从7.25到8.8很多反复之处,相比照抄版的教程可以自定义域名过滤/内外分流,熟悉调试方法/日志。有空再写一个简洁改进版。15天经历5个大坑:

  1. Trojan客户端:JSON语法很苛刻/OpenWRT看日志不容易/status总是running不报错
  2. OpenWRT编译:多线程容易死锁出错/停滞,单线程就算开电驴,慢但肯定成功
  3. ipset:并不省维护,如果不需要黑名单助攻,划不来折腾
  4. ChinaDNS:对DNS过滤太死板,导致代理服务DNS死锁……
  5. Trojan透明代理手动配置:不标注127.0.0.1改成0.0.0.0也不说,折腾一天多欲仙欲死……

穿越长城走向世界:Trojan服务手动安装

题外话

有人觉得讽刺。然而墙就在那,穿越了就是另一个世界——我可没说这个世界对中国人就是好的,当然各种资源,肯定多多益善。但任何事情都有另一面,并不只有香甜的空气。

比如某科技网站引用了新乡时报的上不了网课的孩子:疫情暴露中国教育的数字鸿沟,英文标题要收敛些The Coronavirus Exposes Education’s Digital Divide(白左至少表面上要点脸,不像自恨党/香蕉人瞎到以为美国不存在数字鸿沟,哪怕实际上挂羊头卖狗肉)。

作者是Raymond Zhong——甭跟我扯什么大家都是中国人,如果我在战场上听到有人说我是中国人别开枪,我立刻朝丫先打完一弹夹(有约定口令)。犹太和阿拉伯还都是闪米特人,就算忠还有清君侧。

这人得多瞎,在美国动不动打电话都没信号,嘲笑4G基站占全球2/3的中国?发达国家中最高监禁率、贫富最悬殊,讽刺中国的“教育数字鸿沟”?

不能说他的报道纯属捏造,但事实只是一方面,关键在于如何解读。他真的不明白美国的贫民区中学生,为什么不会徒步数小时冒着严寒到山顶上网课?要不要比较下中美的未成年堕胎率、吸毒率、犯罪率?

当然,新乡日报作为濒临灭绝的旧媒体之一,读者也不多——中文无评论(台蛙港废皆无),英文有一个印度人评论,虽然印度和中国只有人口相近……但整天被这种酸臭浸泡,是你想象的天堂吗?

前言

10年开始一直用PP2P,但PP2P用4G连不上,16年11月换装OpenVPN。

OpenVPN网络要求低,却会被DNS污染,所以离不开hosts文件。大部分网站都可以用固定IP,可能会慢点,但Youtube这种疯狂跳转的不行。TCP很可靠,但到了18年最多用一天IP就会被ban,要浪费1分钟换主机。UDP时间稍长就不行了,要反复重启,但我也忍到现在了。因为我几乎只用搜索。

20年需要Youtube科技视频素材,必须换装全面、高效的梯子。前几年流行的SS(R)和我没听过的v2ray据说现在也不行了。不得不承认,如今翻墙早已不是计算机专业独属技能了,甚至很难搜到非一键安装

域名

Trojan必须有域名。我因为搜索Trojan知道了NameSilo,搜手动安装又知道了域名比价,发现刚申请的.win贵了$.75……我可在name.com买过3年的.computer,浪费了90多刀(相当于3条16G内存)!域名代理和中介一样,靠信息不透明赚大钱。现在搜索和比价工具很多,不爽就多动脑,只有想不到没有做不到。如果找不到合适的工具,也许你的机会来了。人类各种进步,都为解决不爽,只不过大部分人将就了一辈子。

网站

既然长期持(只要用Trojan就得)有域名,就有理由坚持写博客了。nginx、mysql/mariadb、php/wordpress这些都很简单,以前也搭过,但再来一遍就觉得烦了。所以先逐行试好了用sed改配置,再从头运行,单脚本全部通过了。

最初的设想,主域名运行Trojan服务,二级域名运行HTTPS。nginx支持虚拟域名,理论上可以用nginx转发主域名HTTPS到Trojan,实际上没看到Trojan支持nginx转发。

因为Trojan会监听443,把符合Trojan协议的通信伪装成普通HTTPS,否则转发到80。如果只运行nginx,用HTTPS访问,和HTTP的主页一样。而如果运行 wordpress,用HTTPS访问,页面是乱的。推测Trojan转发不完善,无法在HTTPS加载CSS,因为nginx的HTTPS没问题。将就下,毕竟网站只是附属,HTTP访问网站没任何问题。

证书

如果只搭网站,装好nginx、wordpress,certbot可以一次通过:

certbot --nginx -d $domain -d $subdomain -d $subdomain

certbot相当于数字证书申请、下载、配置一键脚本,默认会修改nginx的配置,这样443就会被nginx所占用,导致Trojan服务无法启动(这是一大坑),所以要这样用:

certbot certonly -d $domain --agree-tos --register-unsafely-without-email --webroot -w /var/www/html

此外还要修改证书目录/文件的权限,我有点困惑,为啥nginx可以正常读取?

cd /etc/letsencrypt && chmod o+rx live archive && chmod o+r archive/$domain/privkey*.pem

全部安装配置命令

注意替换域名、密码和邮箱,最后的mysql语句要分两次复制/粘帖,否则装半天都被冲掉了。

#替换你的域名、Trojan/WordPress服务的密码
domain='pinshu.ren'
password='yourpasswd'

sed -i -e 's/grep /grep -ai /' -e '/ll=/d' .bashrc && echo 'sudo su' >> .profile && sudo su
cd /etc/update-motd.d && rm 10-help-text 50-motd-news 90-updates-available && sed -i -e '/  System information as of /d' -e 's/\/bin\/date/uptime/' 50-landscape-sysinfo && cd /etc/apt/apt.conf.d && sed -i -e 's/\/\/\(.*updates"\)/\1/' -e 's/\/\/\(.*-Unused-\)/\1/' -e 's/\(.*-Unused-.*\)false/\1true/' -e 's/\/\/\(.*Reboot "\)false/\1true/' -e 's/\/\/\(.*Time "0\)2/\15/' 50unattended-upgrades && sed -i -e 's/grep /grep -ai /' -e '/ll=/d' ~/.bashrc && cd /etc && ln -fs /usr/share/zoneinfo/Asia/Shanghai localtime && echo "
alias ll='ls -lh'
alias lct='ls -ct'      #sort by ctime
alias llct='ll -ct'
alias llctr='ll -ctr'
alias lctr='ls -ctr'
alias lmt='ls -t'       #sort by mtime
alias llmt='ll -t'
alias llmtr='ll -tr'
alias lmtr='ls -tr'
alias lat='ls -ut'      #sort by atime
alias llat='ll -ut'
alias llatr='ll -utr'
alias latr='ls -utr'
alias lx='ls -X'        #sort by extension
alias llx='ll -X'
alias lls='ll -S'       #sort by size
alias llsr='ll -Sr'
alias li='ls -I'        #--ignore=PATTERN
alias lr='ls -R'        #--recursive
alias llhd='ls -lhd'
alias llk='ll --block-size=K'
alias llm='ll --block-size=M'
  
alias dfh='df -ht ext4'
alias dfg='df -t ext4 -PBG'
alias dfm='df -t ext4 -PBM'
alias duh='du -hd0'
alias dug='du -d0 -BG'
alias dum='du -d0 -BM'
  
alias pscpu='ps -eo pid,pcpu,rss,stime,time,cmd --sort=-pcpu | head -n6'
alias psmem='ps -eo pid,pcpu,rss,stime,time,cmd --sort=-rss | head -n6'
alias mcm='free -m && echo --sort=-pcpu && pscpu && echo --sort=-rss && psmem'
  
alias te='/usr/bin/time -f %E'
  
alias ping='ping -c 10'
alias wget='wget -c -t0'" >> bash.bashrc
#谷歌云GCP内核需开启BBR,其它VPS默认已开启(内核>4.9),多余命令可以删掉
echo 'net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr' >> sysctl.conf && sysctl -p # --system
#Minimal不包含add-apt-repository
add-apt-repository -y ppa:greaterfire/trojan && apt-get update && apt-get install -y fail2ban supervisor nginx mariadb-server php-fpm php-mysql certbot trojan unzip && apt-get upgrade -y && apt-get autoremove -y && apt-get clean && sed -i 's/^bantime.*10m/bantime=10y/' /etc/fail2ban/jail.conf && cd /etc/nginx/ && cp sites-available/default ~ && sed -i -e "s/\/html/\/php/" -e 's/index.html /index.php /' -e "s/server_name _/server_name $domain/" -e 's/#location ~ \\/location ~ \\/' -e 's/#\(.*\)fastcgi-php/\1fastcgi-php/' -e 's/#\(.*\)fpm.sock;/\1fpm.sock;}/' sites-available/default && wget wordpress.org/latest.zip && unzip latest.zip && rm latest.zip && chown -R www-data:www-data wordpress/ && mv wordpress /var/www/php && cd /var/www/php && mv wp-config-sample.php wp-config.php && sed -i -e 's/database_name_here/wordpress/' -e 's/username_here/wordpress/' -e "s/password_here/$password/" wp-config.php && certbot certonly -d $domain --agree-tos --register-unsafely-without-email --webroot -w /var/www/html && service nginx reload && echo '0 3 1 */2 * certbot renew' | crontab - && sed -i -e "s/password1/$password/" -e "s/\/path\/to\/certificate.crt/\/etc\/letsencrypt\/live\/$domain\/fullchain.pem/" -e "s/\/path\/to\/private.key/\/etc\/letsencrypt\/live\/$domain\/privkey.pem/" /etc/trojan/config.json && cd /etc/letsencrypt && chmod o+rx live archive && chmod o+r archive/$domain/privkey1.pem && systemctl enable trojan && service trojan start && mysql_secure_installation && mysql -p #root,INDEX.PHP,server_name,fastcgi-php,fpm.sock
#mysql_secure_installation:passwd,n,4y
create database wordpress;
create user wordpress@localhost identified by 'yourpasswd';
grant all privileges on wordpress.* to wordpress@localhost;
flush privileges;
exit
#certbot --nginx -d $domain -d $subdomain #需要多装一个软件包python3-certbot-nginx

补充这段代码:letsencrypt颁发的证书每90天过期(非3月),只能每俩月(初凌晨3点)续一次

echo '0 3 1 */2 * certbot renew' | crontab -