MoreRSS

site iconDeepzz | 陈启敬修改

成都的 Golang 开发者,React 爱好者。拥有多个个人项目,热爱编程与户外。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Deepzz | 陈启敬的 RSS 预览

从零到日入$10:朋友独立开发临时邮箱网站的故事

2025-03-05 22:40:00

最近,我的朋友决定踏上了独立开发者的道路,做了一个临时邮箱网站:tempmail100.com。作为一个旁观者,我亲眼见证了他从零开始,一步步摸索,最终取得了广告日入$10的成绩。今天,我想分享一下他的经历,希望能给那些想要踏入独立开发者行业的朋友一些启发。

tempmail100-days-10dollar

1. 从想法到落地

朋友的初衷很简单:做一个实用的临时邮箱工具,帮助用户在不暴露真实邮箱的情况下,快速注册一些临时服务。他选择了临时邮箱这个方向,主要是因为市场需求明确,且技术门槛相对较低。

他花了几周时间,从设计到开发,最终上线了tempmail100.com。网站的页面设计非常简洁,用户体验也很流畅,尤其是那个“一键生成邮箱”的功能,简直不要太方便。

2. 技术栈与SEO优化

作为一个独立开发者,朋友在技术选型上非常务实。他选择了轻量级的技术栈,确保网站能够快速响应,并且易于维护。同时,为了提升网站的SEO表现,他做了以下几件事:

  • 外链建设:他主动在一些技术论坛(如V2EX、X等)上分享了自己的项目,吸引了不少开发者点击和讨论。这些外链不仅带来了流量,还提升了网站的权重。
  • 关键词优化:他在网站的标题、描述和内容中巧妙地融入了“临时邮箱”、“免费邮箱生成”等关键词,确保搜索引擎能够更好地抓取和索引。
  • 社交媒体推广:他还在Twitter(X)上分享了一些开发心得和使用技巧,吸引了不少用户前来试用。

3. 支付与变现

为了让网站能够持续运营,朋友决定引入Stripe作为收款工具。为了接入Stripe,他甚至注册了一家美国公司!虽然这个过程有些复杂,但最终他成功接入了Stripe,用户可以通过付费解锁一些高级功能,比如更长的邮箱有效期、自定义邮箱前缀等。虽然目前付费用户还不多,但这为他提供了一个稳定的收入来源。

此外,他还通过Google AdSense在网站上投放广告。随着流量的增加,广告收入也逐渐提升,最近甚至达到了日入$10的成绩。虽然这个数字看起来不大,但对于一个刚刚起步的独立开发者来说,已经是一个不错的开始了。

4. 挑战与未来

当然,独立开发者的道路并不总是一帆风顺。朋友也遇到了一些挑战,比如如何持续吸引新用户、如何应对竞争对手等。但他始终保持乐观,不断优化产品,提升用户体验。

未来,他计划继续完善网站功能,比如增加多语言支持、提升邮箱的稳定性等。同时,他也希望通过更多的SEO优化和社交媒体推广,进一步提升网站的知名度和流量。

5. 给新人的建议

如果你也想要踏入独立开发者的行业,朋友的建议是:

  • 从小项目开始:不要一开始就想着做大而全的产品,选择一个细分市场,解决一个具体的问题。
  • 注重SEO和推广:酒香也怕巷子深,好的产品需要让更多人知道。SEO和社交媒体推广是非常有效的手段。
  • 保持耐心:独立开发是一个长期的过程,不要急于求成。只要坚持,总会有收获。

结语

朋友的经历让我深刻体会到,独立开发者虽然充满挑战,但也充满了可能性。如果你也有类似的想法,不妨大胆尝试,或许下一个成功的独立开发者就是你!

如果你对tempmail100.com感兴趣,或者有任何关于独立开发的问题,欢迎在评论区交流。我们一起探讨,一起进步!

本文链接:https://deepzz.com/post/indie-maker-tempmail100.html参与评论 »

2024年终总结 - 稳中求变

2025-01-01 10:49:00

2025年啦,大家过得都可还好?

时间转瞬即逝,2024年就过完了,不得不感叹一年时间还是蛮短暂的!

回顾2024:

2024骑着第一辆公路车参加了2023的跨年骑行,千人规模很是壮观,以后是再也不会有了。

2024组装了第一台真正意义上的NAS,五盘位,8T,结合Apple TV该享受的还是要享受。

2024学习了swift与swiftui,与朋友空闲时间开发了一款临时邮箱应用,突破了独开零收入门槛。

2024读了6本书,远未达到最初设定的10本书的目标,看来执行力还是差了些。

2024为小朋友组装了一个大玩具:水管攀爬架,挺爱玩,大运动好了不少。

2024总共骑行了400来公里,都没别人跑步跑得多,看来还得找个骑行搭子。

2024开始关注保险,为家人安排了重疾险,寿险。

2024房贷利率降低了不少,还贷压力也有部分减轻,但依旧是个重担。

2024不少地方发生战争,如乌克兰俄罗斯,还有各种事故,只能说珍惜当下,天灾还是人祸不知道哪一个先来。

2024特朗普竞选总统成功,币圈高涨,可惜没能抓住,错失成为首富的机会。

2024陪着我的小家伙又成长了一年,每次看到他的笑容,喊着爸爸,心里都是感动。

2024家里第一次开了地暖,室内外温差十几二十度,家里真的是舒服。

2024奶奶九十大寿,真的是儿孙满堂,实实在在的印证了家有一老,如有一宝。

2024工作平稳,但有个盼头,来年努力为公司输出,一同成长。

2025愿世界和平,愿家人安康,愿陌生的你快乐幸福,愿风调雨顺!

本文链接:https://deepzz.com/post/2024-year-end.html参与评论 »

2023年终总结 - 焦虑的一年

2024-01-01 22:49:00

该篇总结是我第一次严格意义上的年终总结,也到了必须要进行总结的时候。总结经验,反思过往!

相较于以往,每年的这个时候都会看到很多人在对自己进行总结。对于自己,是一个性格比较随意的一个人,总结不总结的也无所谓,只要内心对自己有要求,有思考就行。但对于很多事和物,没有纸笔的记录很快就会忘却,2023年对于我来说是挺焦虑的一年,希望记录下对这些事情,以作反省。

先说说自己,性格是一个比较独立的一个人,不想去处理那些复杂的人际关系,不喜欢,也是浪费时间(当然这肯定是不对的,大家不要学我)。简简单单的就挺好,没有利益,没有冲突,有兴趣的就一块玩,没有的我们下次找机会。平时个人想法也挺多的,就是执行力需要提高。

从标题可以反映出我2023焦虑的一年,可以从工作上和生活中来进行总结。

工作上

我目前在一家安全相关的公司从事产品研发的工作,公司不大但老板有技术背景,对技术比较看重。当时过去主要工作内容是数字身份产品的研发(以创业的心态),包括IDaaS平台(OAuth2/OIDC,SAML,LDAP等)、无密码身份认证(WebAuthn/FIDO2)、协同签名和S/MIME相关的产品。

由于各种原因吧,如产品方向和研发方案,经过3年的产品研发,最终的产出很少或者说没有应用场景。个人挺苦恼的,毕竟作为研发研发出没有产生价值的产品真的很没有成就感,产品没价值就代表研发没价值。

2023最主要是将我们的产品通过国密L2认证,这也是痛苦的根源,目前也仅通过一半。起初从已通过小伙伴处得知过认证还是比较容易,检测人员有提供部分指导。自从我们从接手项目开始,整个文档或者说产品的方案就不满足检测要求,才知道有多难。整个过程下来文档修改过不下百遍,在一遍遍修改和沟通下才艰难完成部分项目的认证,期间还收到整改通知。

总结下来:

  1. 对检测要求和产品设计的不了解(过检产品由他人研发),沟通和功能修改过程也挺难的。
  2. 不能汲取公司内部已过产品的经验,该过检产品非标品,有很大不确定性。仅能部分参考。
  3. 检测机构为北京国密检测局且今年格外严格。

我认为这个过程对我来说是焦虑的,首先它不是的我强项(产品研发),其次它的认证过程是我不能够把控的。当一件事情不在我的控制范围内的时候,充满了不确定性,就像一个快断线风筝,指不定什么时候就失败了,它就会让我变得焦虑。我的性格不容许有这样的事情发生。

同时,2023年较年初定下的目标完成了不到50%,未能达成年初计划,其中有研发方向的变化,有人员的变化。

不过今年公司产研的变化让我看到希望,从最初无产品经理到目前三名产品经理。现在产品的立项也较之前更严谨,不再是一股脑拍板觉得这个可以做,这个方向我看到了机会,今天行明天不行。我相信在产品经理的介入下,通过调研用数据说话,更多人的参与立项讨论,专业的事交给专业的人,以后会更加规范,做的产品会更有价值。

从根本上来说,利用每个人的长处去做事情一定是事半功倍的,有时候静下心来好好思考,方向比忙得不可开交更加重要,观察与发现比我觉得更合适。2023年工作上的变化就是没有变化,现在看来,除了埋头干活或许有意提升自身的价值更加重要。

生活中

今年生活上最大的变化是我们家里的天使宝宝降临,给我们整个家庭带来了很多变化。

宝宝出生前,家里就开始囤各种婴儿用品,什么婴儿床、婴儿车、小玩具、纸尿裤、抱被什么的,各种各样,以前我们小时候咋就没这么多玩意。同时两边的父母也过来帮着带带孩子煮个饭照顾我们的饮食,不然两个人确实转不过来。

孩子出生后本以为大人可以轻松一点,谁知孩他妈还堵奶,最严重的是最后还发炎了,痛的恼火得很。最后找通乳师通了五六次才消下去(新生孩母亲一定要注意这个问题)。孩子每几个小时就需要喂一次奶,有时候还一直哭闹,这让你睡眠和精力严重不足。但这就是人生需要经历的一件事,孩子有时候一个笑容就会把你治愈。加油吧,少年!

今年给自己找了一个锻炼的理由,一狠心给自己添置了一台公路车,国庆节第一次就去骑行了95公里的绿道,那感觉很酸爽。身边的朋友也一起购置了,以后跟这大神一起拉练。

2024计划

个人比较向往独立开发者,有经验的朋友的可以带带新人。

装了一年多的房子打算2024年初入住。由于房子不是在工作附近,每次装修或安装什么东西就得安排时间,一来二去整个房子很多细节都没有弄好,不过有什么办法只有妥协,下一次不就有经验了嘛。

年前和朋友聊了许久,感觉每个人都有每个人的苦恼,都过得不容易,比如为了下一代怎么怎么的。要我说,有很多苦恼都是自己给自己的压力。只有先把自己安排好,才能安排别人。一辈子很短,快乐向上的活下去!

2024年,给自己立一些Flag:

  • 产品突破0的销售额 - 100%
  • 读10本书,无论什么书 - 60%
    • SwiftUI编程思想 - 100%
    • Swift进阶 - 100%
    • SwiftUI by Tutorials - 100%
    • macOS by Tutorials - 100%
    • 把时间当作朋友 - 100%
    • 三体(全集)- 100%
  • 骑行1000公里。 - 40%
  • 开始运营小红书和Twitter,粉丝数突破5000。 - 10%

2024让自己发生点变化。


2024年目标没有达成,执行力还是差了!!

本文链接:https://deepzz.com/post/2023-year-end.html参与评论 »

如何玩转智能家居 - 组建局域网,访问家庭网络

2022-11-20 23:45:00

接上篇文章,继续折腾家庭网络:如何玩转智能家居 - 网络如何智能openwrt+v2ray

更新说明

  • 2023.02.24:R2S不再作为主路由,采用旁路由接入

本篇文章解决问题是:如何通过配置wireguard实现从世界任何地方优雅的访问家庭网络。我们在家庭网络使用场景汇总一定会遇到以下情况,人在外:

  1. 想要访问家庭网络中的NAS服务,获取一些资料。
  2. 想要下载一部资源,添加下载任务,一回家就可使用
  3. 全屋智能家居,某一个设备出现故障,想要直接接入家庭网络查看原因修复
  4. 等等…

这些场景的基本需求是:安全性一定要有保障,能够在外网连接到家庭网络(不是简单的内网穿透,而是组成大局域网)。

答案不言而喻,组建vpn。那么问题来了,用什么vpn,如何连接到家庭网络:

  • 没有公网IP,现在IPv4已经耗尽,想要从运营商那获得公网IP还是很困难的,而且IPv6目前还不是很普及。
  • 家庭内部网络安全性脆弱,需要防火墙来保护,一般的不应该将家庭网络中的服务暴露在公网中,这样会有极大的安全隐患。

本篇文章的目的是:通过vpn的形式使得在外网如同访问家庭内部局域网一样,让外部设备与家庭网络中的设备形成一个局域网。

那为什么选择wireguard:

  • 开源:https://github.com/WireGuard
  • 简单:代码简单,仅4000余行,原理简单,部署简单。
  • 安全:支持最新加密技术,Curve25519、ChaCha20等。
  • 性能:WireGuard 虚拟网由于是100%内核处理,省去了用户进程和内核交互的开销,因此性能优越,具体表现为吞吐量高。

网络架构: homenet-design

博主目前设计的网络架构如上图,不过本篇文章只讲 光猫<->AC<->R2S 这样的链路:

光猫:192.168.1.1
AC(主路由):192.168.2.1
R2S(旁路由):192.168.2.100

这里的R2S我们作为旁路由来使用,什么是旁路由请自行搜索资料。简而言之,家庭内大多数网络均走AC主路由,部分走旁路由(翻墙),旁路由的(折腾)挂掉不会导致整个家里网络中断。

由于博主家庭网络没有公网IP,动态IP也没有,因此这里找了一台云服务器作为中转(非UDP打洞,中转方式会消耗云服务器流量,请悉知)。当然也可以用基于wireguard现成的方案,如tailscale,免费应该够用(有设备限制)。

提前准备

这里假设你已经准备好已经准备好openwrt路由器。我们还需要准备:

一个公网IP:或是家里自带公网IP+DDNS,或是购买一台公网服务器VPS
一个域名:可选,如果你的公网IP是动态的,那就需要域名且必须通过DDNS

FRP

因为博主家里没有公网IP,那么只能通过这种内网穿透的方式实现,将wireguard的udp端口通过代理的方式暴露到外网,如果有公网IP跳至下一步。

1、在vps上安装frps服务端,请到 frp/releases 下载对应架构的最新版本即可,解压到服务器。

服务端配置:

[common]
bind_port = 7000

token = 768f72bc664ad2ad7c9edccf65523fd7

其中 token 是用来鉴权客户端的,请重新生成。bind_port 指定 frps 监听的端口,云服务器需要放开该端口的访问。

2、在openwrt安装frpc客户端,请到 System->Software 搜索 frpc 安装。 software-frpc

完成后进行配置:假设这里我们选择端口 51820/udp 作为wireguard的通信端口,IP 10.0.0.1作为wireguard的网关IP。 frpc-service

我这边的 /etc/config/frpc 配置如下,你可对应着在网页上进行修改:

config init
  option stdout '1'
  option stderr '1'
  option respawn '1'
  option user 'root'
  option group 'root'

config conf 'common'
  option server_port '7000'
  option tls_enable 'false'
  option server_addr '<server_ip>'
  option token '768f72bc664ad2ad7c9edccf65523fd7'

config conf 'ssh'
  option name 'wireguard'
  option type 'udp'
  option use_encryption 'false'
  option use_compression 'false'
  option local_ip '10.0.0.1'
  option local_port '51820'
  option remote_port '51820'

记得将 server_ip 替换成frps的地址,如果不出意外的,openwrt中的frpc已经跑起来了。

WireGuard

WireGuard是点对点的网络,每个节点既可以做服务器,又可以做客户端。我们这里将部署在openwrt中的wireguard节点称为服务端,在手机或电脑端部署的wireguard节点称为客户端。更多安装方式:https://www.wireguard.com/install/

整体步骤如下:

  1. LAN口设置(旁路由)
  2. 安装wireguard

LAN口设置

1、编辑LAN口,设置上游网关信息: interfaces-lan

lan-settings

2、配置DNS: lan-dns-settings

3、关闭SYN-flood保护,开启动态IP伪装 wireguard-firewall

安装wireguard

1、在openwrt中安装wireguard建议通过System->Software进行安装:

software-wireguard

安装完成,重启路由器。同时你也会看到 Status->WireGuardwireguard-status

配置服务端

需要了解细节的朋友可以参考官方 Quick Start,我们这里通过openwrt进行wireguard服务端配置。

1、点击 Network->Interface 中的 Add new interface 创建接口: wireguard-interface

2、接口名称建议 wg0,协议选择 WireGuard VPN 进行创建: wireguard-create

3、一般设置:

  • Private Key 是WireGuard节点的私钥,可通过 Generate Key Pair 生成,也可手动生成:

    # 通过ssh登录到openwrt,执行
    $ wg genkey | tee privatekey | wg pubkey > publickey
    $ cat privatekey publickey
    
  • Listen Port 监听的端口,这里设置为 51820 与 frpc 配置对应即可。

  • IP Addresses 是WireGuard接口的私有IP网段,这里设置为 10.0.0.1/24 与 frpc 配置对应,不要与其它内网IP段冲突。

wireguard-general-settings

4、防火墙设置,有 vpnvpn,无则选 lanwireguard-firewall-settings

最后 Save,保存即可,后续再步骤添加 Peers

客户端配置

首先,通过这里的安装方式进行客户端的安装:https://www.wireguard.com/install/,我这里以iOS举例。

1、点击 创建隧道->手动创建wireguard-ios-home

2、填写基本信息,主要填写下面三项,其它默认:

  • 名称,这里随便填
  • 公私钥,这里点击 生成密钥对 随机生成即可。
  • 局域网IP地址,即客户端节点IP,这个地址要设置为符合 10.0.0.1/24

wireguard-ios-settings1

3、通过 添加节点 添加服务器信息:

  • 公钥,填写服务端的公钥。
  • 对端,服务端地址+端口,由于家里没有公网,这里走的frp,所以填的是公网vps代理地址。
  • 路由的IP地址(段),这里填写需要走wireguard网络的IP段,如:192.168.100.0/24,192.168.2.0/0,10.0.0.0/0。这样当开启wireguard vpn之后访问这些IP就会走vpn网络。

wireguard-ios-settings2

到了这一步,客户端已经完成配置了。但是服务端还没有,因为wireguard本质上是一个P2P通信的软件,我们还要将客户端公钥信息配置到服务端才行。

配置Peer

在openwrt配置wireguard peer信息。

wireguard-interface-edit

填写刚才配置的客户端信息,Save 保存即可: wireguard-peer-settings

现在在手机上开启 vpn,尝试访问一下路由器地址 192.168.100.1 是否可行。 wireguard-ios-vpn

FAQ

1、客户端如何访问openwrt的下一级路由的服务,如这里如何访问 192.168.2.x 服务:

因为路由器作为openwrt的下一级路由,openwrt是不知道如何到达 192.168.2.x 这个网段的。因此需要添加一条静态路由: wireguard-static-route

2、如何所有流量都走wireguard,并且可以通过之前设置的v2ray进行科学上网:

请参考:https://www.wireguard.com/netns/#routing-all-your-traffic

3、不用开启端口吗,很多教程上面需要开启路由器端口?

开启端口,一般是指我们路由器有公网IP,通过ddns方式对外暴露端口的时候需要开启。

相关地址

[1] https://github.com/WireGuard

[2] https://www.wireguardconfig.com/

本文链接:https://deepzz.com/post/openwrt-and-wireguard-connect-homenet-anywhere.html参与评论 »

如何玩转智能家居 - 如何自由上网openwrt+v2ray

2022-11-12 11:29:00

本篇文章仅作为个人技术研究记录,请勿用于非法用途。

更新说明

  • 2024.01.30:重新整理文档,基于现有模式。
  • 2023.7.19:添加nftables配置。

玩转智能家居,网络很关键,本篇文章我们来聊一聊怎样实现科学上网。其具体的体现就是,路由器帮我们智能的识别我们想要访问的网站,通过分析判断,将流量通过不同的路径进行转发。使用场景大家可以自己想象,这里不做过多赘述。

本次的实战是:在安装了openwrt的软路由上(主路由),通过v2ray+vps实现的翻墙。本次相关软硬件如下:

  • OpenWrt:22.03.2+,该版本之后使用nftables,下面同时也给出iptables配置。
  • V2ray:4.44.0,当前OpenWrt版本能安装的最高版本。

提前准备

一个路由器:博主使用软路由R2S+16GTF卡(读卡器),当然其它软路由也可或者安装了openwrt的路由器。

一个vps(墙外):用于安装v2ray服务端,帮助翻墙。

v2ray有多种传输方式,这里选用了KCP + wechat-video方式。

安装openwrt

软路由首先要刷好openwrt的系统,如何刷,我这边以R2S为例:

1、安装刷机软件,因为用过树莓派刷机软件挺不错,推荐给大家:https://www.raspberrypi.com/software/raspberrypi-home.png

2、 下载openwrt系统,在这里可以查询你的设备支持的固件 https://firmware-selector.openwrt.org/,记得选择版本号。

3、将TF卡连接至电脑,打开树莓派刷机软件,选择“使用自定义镜像“,选择刚才下载的openwrt系统文件,进行烧录: raspberrypi-image

一旦烧录完成,将TF插入r2s,插电即可启动。

修改网关IP

我们修改openwrt网关IP的目的是为了防止IP地址冲突,默认情况下openwrt使用的是 192.168.1.1,这与大多数光猫或路由器冲突。

将openwrt接入到现有网络,通过路由器或光猫后台查询到该openwrt的IP地址。直接访问该IP地址,密码为空,登录。我这里是更改为 192.168.100.1。选择 Network->Interfacesopenwrt-home

点击 Lan 口的 Edit 按钮,将 IPv4 address 修改为你想设置的地址,保存: openwrt-interface-edit

openwrt-interfaces

点击 Save & Apply 之后,等待片刻,即可使用新的地址 192.168.100.1 访问openwrt。

开启IP转发

本方案中openwrt需要开启IP转发才能作为网关使用:

$ echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p

执行后将出现 net.ipv4.ip_forward=1 的提示。

安装v2ray

如何安装v2ray?我们需要在vps上和openwrt上安装并配置v2ray的服务端和客户端。

vps服务器

服务器安装可以参考 Github 这个项目一键安装,需要提前切换到root。

$ bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

安装的相关文件地址会打印出来,如下:

installed: /usr/local/bin/v2ray
installed: /usr/local/share/v2ray/geoip.dat
installed: /usr/local/share/v2ray/geosite.dat
installed: /usr/local/etc/v2ray/config.json
installed: /var/log/v2ray/
installed: /var/log/v2ray/access.log
installed: /var/log/v2ray/error.log
installed: /etc/systemd/system/v2ray.service
installed: /etc/systemd/system/[email protected]

设置开机自启并启动v2ray服务:

$ systemctl enable v2ray; systemctl start v2ray

修改配置文件 /usr/local/etc/v2ray/config.json

{
  "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "info"
  },
  "inbounds": [
    {
      "port": 8545,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "<客户端鉴权uuid>",
            "alterId": 0
          }
        ]
      },
      "streamSettings": {
        "network": "kcp",
        "security": "none",
        "tlsSettings": {},
        "tcpSettings": {},
        "httpSettings": {},
        "kcpSettings": {
          "mtu": 1350,
          "tti": 50,
          "uplinkCapacity": 100,
          "downlinkCapacity": 100,
          "congestion": false,
          "readBufferSize": 2,
          "writeBufferSize": 2,
          "header": {
            "type": "wechat-video"
          }
        },
        "wsSettings": {},
        "quicSettings": {}
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    },
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "block"
    }
  ]
}

这里的uuid是作为鉴权使用,随便生成 $ v2ctl uuid,只需要保证客户端uuid填写一致即可。然后执行以下命令:

$ service v2ray restart # 重启v2ray服务

vps相关的防火墙端口记得开。如果进行调试,可以将日志等级调整为 Debug,并手动启动v2ray服务:v2ray -c /usr/local/etc/v2ray/config.json

OpenWrt

在openwrt上安装v2ray,由于openwrt上未使用bash,故我们不能够使用上面的脚本进行安装,而是采用opkg的方式,请参考 https://github.com/kuoruan/openwrt-v2ray 安装v2ray-core。

也可以直接在openwrt网页上操作,一样的: openwrt-software

openwrt-dpkg

保存后,然后点击 Update lists,完成后搜索v2ray进行安装即可: openwrt-software-search

注意,这里可能由于网络的问题,安装过程较长时间,请耐心等候,或多次尝试。

通过SSH登录到openwrt:ssh [email protected],编辑新建配置文件 /etc/config/v2ray

{
    "log": {
        "loglevel": "info"
    },
    "inbounds": [
        {
            "listen": "0.0.0.0",
            "port": 30000,
            "protocol": "dokodemo-door",
            "settings": {
                "network": "tcp,udp",
                "followRedirect": true
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            },
            "streamSettings": {
                "sockopt": {
                    "tproxy": "tproxy",
                    "mark": 2
                }
            },
            "tag": "transparent"
        },
       {
            "listen": "0.0.0.0",
            "port": 30443,
            "protocol": "socks",
            "settings": {
                "auth": "noauth",
                "udp": false
            }
        },
        {
            "listen": "0.0.0.0",
            "port": 30080,
            "protocol": "http",
            "settings": {
                "timeout": 360
            }
        }
    ],
    "outbounds": [
        {
            "streamSettings": {
                "network": "kcp",
                "security": "none",
                "kcpSettings": {
                    "downlinkCapacity": 20,
                    "writeBufferSize": 1,
                    "readBufferSize": 1,
                    "header": {
                        "type": "wechat-video"
                    },
                    "uplinkCapacity": 50,
                    "congestion": false,
                    "tti": 20,
                    "mtu": 1350
                }
            },
            "tag": "proxy",
            "mux": {
                "concurrency": 8,
                "enabled": false
            },
            "settings": {
                "vnext": [
                    {
                        "users": [
                            {
                                "level": 0,
                                "security": "aes-128-gcm",
                                "alterId": 0,
                                "id": "<客户端鉴权uuid>"
                            }
                        ],
                        "address": "<vps服务器地址>",
                        "port": 8545
                    }
                ]
            },
            "protocol": "vmess"
        },
        {
            "protocol": "freedom",
            "settings": {
                "domainStrategy": "UseIP"
            },
            "streamSettings": {
                "sockopt": {
                    "mark": 2
                }
            },
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "settings": {
                "response": {
                    "type": "none"
                }
            },
            "tag": "adblock"
        },
        {
            "protocol": "dns",
            "streamSettings": {
                "sockopt": {
                    "mark": 2
                }
            },
            "tag": "dns-out"
        }
    ],
   "dns": {
        "servers": [
            {
                "address": "223.5.5.5",
                "port": 53,
                "domains": [
                    "geosite:cn",
                    "ntp.org"
                ],
                "expectIPs": [
                    "geoip:cn"
                ]
            },
            {
                "address": "114.114.114.114",
                "port": 53,
                "domains": [
                    "geosite:cn",
                    "ntp.org"
                ],
                "expectIPs": [
                    "geoip:cn"
                ]
            },
            {
                "address": "1.1.1.1",
                "port": 53,
                "domains": [
                    "geosite:geolocation-!cn",
                    "geosite:speedtest"
                ]
            },
            {
                "address": "8.8.8.8",
                "port": 53,
                "domains": [
                    "geosite:geolocation-!cn",
                    "geosite:speedtest"
                ]
            },
            "localhost"
        ]
    },
    "routing": {
        "domainStrategy": "IPOnDemand",
        "rules": [
            {
                "type": "field",
                "inboundTag": [
                    "transparent"
                ],
                "port": 53,
                "network": "udp",
                "outboundTag": "dns-out"
            },
            {
                "type": "field",
                "inboundTag": [
                    "transparent"
                ],
                "port": 123,
                "network": "udp",
                "outboundTag": "direct"
            },
            {
                "type": "field",
                "ip": [
                    "223.5.5.5",
                    "114.114.114.114"
                ],
                "outboundTag": "direct"
            },
            {
                "type": "field",
                "ip": [
                    "8.8.8.8",
                    "1.1.1.1"
                ],
                "outboundTag": "proxy"
            },
            {
                "type": "field",
                "domain": [
                    "geosite:category-ads-all"
                ],
                "outboundTag": "adblock"
            },
            {
                "type": "field",
                "protocol": [
                    "bittorrent"
                ],
                "outboundTag": "direct"
            },
            {
                "type": "field",
                "ip": [
                    "geoip:private",
                    "geoip:cn"
                ],
                "outboundTag": "direct"
            },
            {
                "type": "field",
                "domain": [
                    "geosite:cn"
                ],
                "outboundTag": "direct"
            }
        ]
    }
}

不对配置做过多解释,你需要替换掉配置中需要修改的部分 <客户端鉴权uuid>vps服务器IP。执行 v2ray -c /etc/config/v2ray,等待启动成功。

此时,我们已经可以进行智能上网了,当然这里还没有实现 透明代理。验证方式,通过指定代理:

$ http_proxy=192.168.100.1:30080 curl -Lv google.com # 墙外测试
$ http_proxy=192.168.100.1:30080 curl -Lv baidu.com # 墙内测试

透明代理

这里我们的软路由是作为旁路由使用的,因此需要实现全局的智能上网(透明代理),所有连接到该路由的设备都可以智能的选择网络路线。透明代理原理是通过 nftables 的路由转发等功能。

完成安装后,请ssh到openwrt。iptables 执行:

# 设置策略路由
ip rule add fwmark 1 table 100 
ip route add local 0.0.0.0/0 dev lo table 100


# 代理局域网设备
iptables -t mangle -N V2RAY
# 目标网关所在网段请求直连, 执行:
#  ip address | grep -w "inet" | awk '{print $2}'
iptables -t mangle -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A V2RAY -d 192.0.0.0/24 -j RETURN
# 目标地址为组播IP/E类地址/广播IP直连
iptables -t mangle -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY -d 255.255.255.255/32 -j RETURN

iptables -t mangle -A V2RAY -d 192.168.100.0/24 -p tcp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY -d 192.168.100.0/24 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY -m mark --mark 2 -j RETURN

# 给 UDP 打标记 1,转发至 30000 端口
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 30000 --tproxy-mark 1
# 给 TCP 打标记 1,转发至 30000 端口
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 30000 --tproxy-mark 1
# 应用规则
iptables -t mangle -A PREROUTING -j V2RAY


# 代理网关本机
iptables -t mangle -N V2RAY_MASK 
# 目标网关所在网段请求直连
# 执行: ip address | grep -w "inet" | awk '{print $2}'
iptables -t mangle -A V2RAY_MASK -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 192.0.0.0/24 -j RETURN
# 目标地址为组播IP/E类地址/广播IP直连
iptables -t mangle -A V2RAY_MASK -d 224.0.0.0/4 -j RETURN 
iptables -t mangle -A V2RAY_MASK -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 255.255.255.255/32 -j RETURN

iptables -t mangle -A V2RAY_MASK -d 192.168.100.0/24 -p tcp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY_MASK -d 192.168.100.0/24 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A V2RAY_MASK -m mark --mark 2 -j RETURN
# 给流量打标记, 重路由
iptables -t mangle -A V2RAY_MASK -p tcp -j MARK --set-mark 1
iptables -t mangle -A V2RAY_MASK -p udp -j MARK --set-mark 1
# 应用规则
iptables -t mangle -A OUTPUT -j V2RAY_MASK


# DIVERT 规则, 避免已有连接的包二次通过 TPROXY
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT

nftbles 执行:

#!/usr/sbin/nft -f

# 清空已有规则
flush ruleset

# 局域网的地址
define RESERVED_IP = {
  10.0.0.0/8,
  100.64.0.0/10,
  127.0.0.0/8,
  169.254.0.0/16,
  172.16.0.0/12,
  192.0.0.0/24,
  224.0.0.0/4,
  240.0.0.0/4,
  255.255.255.255/32,
}

# 代理设备
table ip v2ray {
  # 局域网
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    ip daddr $RESERVED_IP return

    meta l4proto tcp ip daddr 192.168.0.0/16 return # 直连局域网
    ip daddr 192.168.100.0/24 tcp dport != 53 return
    ip daddr 192.168.100.0/24 udp dport != 53 return
    meta mark 2 return # 直连流量
    meta l4proto { tcp, udp } meta mark set 0x1 tproxy to :30000 accept # 转发至v2ray
  }

  # 网关本机 
  chain output {
    type route hook output priority 0; policy accept;
    ip daddr $RESERVED_IP return

    meta l4proto tcp ip daddr 192.168.0.0/16 return # 直连局域网
    ip daddr 192.168.100.0/24 tcp dport != 53 return
    ip daddr 192.168.100.0/24 udp dport != 53 return
    meta mark 2 return # 直连流量
    meta l4proto { tcp, udp } meta mark set 0x1 accept # 重路由至prerouting
  }
}

# DIVERT规则
table ip filter {
  chain divert {
    type filter hook prerouting priority -150; policy accept;
    meta l4proto tcp socket transparent 1 meta mark set 1 accept
  }
}

请注意,这里有代理局域网设备和网关本机的配置,可自行选者。这里 192.168.100.0/24 需要换成你openwrt路由器的IP地址段。进行测试:

$ curl -Lv google.com # 墙外测试
$ curl -Lv baidu.com # 墙内测试

如果执行完上面的 iptablesnftables 命令之后,路由器的访问出现问题,如ssh连不上openwrt,可通过重启路由器的方式解决。因为这里的规则是软写入的,在内存中,重启之后就会无效。因此,一旦你测试成功,请将配置粘贴到openwrt中的 Network->Firewall->Custom Rules 进行固化: firewall-custom-rules

FAQ

1、更多关于透明代理的原理和细节可以参考以下文章:

2、openwrt如何实现v2ray后台运行,开机自启,解决 too many open files

编辑新建 /etc/init.d/v2ray

#!/bin/sh /etc/rc.common

USE_PROCD=1
START=99

NAME=v2ray
PROG=/usr/bin/v2ray

start_service() {
        procd_open_instance $NAME
        procd_set_param command "$PROG" -config /etc/config/v2ray

        procd_set_param file /etc/config/v2ray

        procd_set_param limits core="unlimited"
        procd_set_param limits nofile="1000000 1000000"
        procd_set_param stdout 1
        procd_set_param stderr 1
        # respawn automatically if something died, be careful if you have an alternative process supervisor
        # if process dies sooner than respawn_threshold, it is considered crashed and after 5 retries the service is stopped
        # /etc/init.d/your_service reload will restart the daemon if these files have changed
        procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}

        procd_close_instance
}

reload_service() {
        stop
        start
}

添加执行权限 $ chmod +x /etc/init.d/v2ray。可执行:

$ /etc/init.d/v2ray start/stop/restart # 启动/停止/重启

参考文章

本文链接:https://deepzz.com/post/router-openwrt-v2ray-tproxy.html参与评论 »

如何玩转智能家居 - 网络组网方案实施

2022-06-23 22:27:00

接上篇:如何玩转智能家居 - 家庭组网方案选择

当我们已经选择好家庭组网方案之后:AC(PoE)+AP。那么问题来了:实际该如何操作,如何布线,需要考虑什么?

就我来说,可能考虑这些因素:

  1. 弱电箱位置,要不要挪动,什么位置才是最佳
  2. 强弱电的走向,如何才不会被影响
  3. 我们的AC应该放在哪里,AC为什么需要POE
  4. 我们的AP应该放在哪里,要放几个
  5. 到底需不需要弄一个类似家庭机房的东西,放哪,有什么用
  6. 网线怎么弄,什么地方要放几根,用几类网线
  7. 普通家庭上全屋光纤有用吗

确定需求

确定需求前,我们确定下当下的环境:

  1. 电信宽带目前只能达到千兆
  2. 大多数家庭以WiFi上网为主,台式机上网较少
  3. 不考虑全屋光纤,目前成本较高(土豪请忽略),因为直接支持光纤设备极少,需要光电转换
  4. 全屋必须网络全覆盖,必须实现网络无缝漫游

以上,我们得出:全屋采用超六类网线即可满足未来需求,超六类网线可以达到万兆网络,往后看还是能够满足的。全屋主要是以WiFi为主,那么部署AP时,如果不需要网线则不牵网线,节省成本。

我们还有有哪些需求需要解决呢,确定以下信息:

  • 是否需要IPTV:需要,至少客厅需要一台电视
  • 哪些设备需要网线:电视,台式电脑,Xbox,AP
  • 是否需要科学上网:需要,长期会查询外文资料
  • 是否使用NAS:需要,NAS可以帮助存储照片,视频,音乐等,能够称为智能家居的后端存储
  • 是否需要万兆网络:需要,内网一定要快,至少保证访问NAS的速度,剪辑视频需要
  • 是否需要内网穿透:需要,我需要在外控制家里设备
  • 预算有多少,4k+

以上,我们得出:

  1. 客厅至少需要三根网线:电视或电视盒子,Xbox游戏机,AP
  2. 书房至少需要三根网线:台式电脑,NAS,AP
  3. 每个卧室至少需要一根网线:AP或作备用
  4. 需要一个万兆交换机,实现内网有线万兆
  5. 软路由来一套,自由上网用
  6. 向电信要IPv4或外网服务器来一套

那么综合以上信息,我确定我是需要一个机柜的:将所有的网络硬件都放在一个位置,把NAS也放过去,最后将该机柜放到定制柜里完美隐藏。

设计方案

接下来是设计布网方案,这需要实际根据户型图来操作。大家可以参考我的这张设计图: homenet-design

基本思路就是有一个总的网络机柜,网络从弱电箱出来直接到网络机柜,后续的网络全部走机柜出去。由于博主要实现内网穿透,故画了阿里云上去,如果你们不需要可不参考(也可以走wireguard/tailscale打洞方案)。

以上图仅是设计参考用,实际在实施过程中有些许变化。然后就有了这张图: homenet-design-part2

这张图AP酌情减少了一个,具体根据实际情况来定。

当你确定好方案之后,一定要第一时间与电工师傅进行核对,确认方案的可行性。博主就是这样,想当然的将弱电箱挪到鞋柜处,所有网络设备都放到鞋柜,谁知强电与弱电在一个垂直面上,不行。所以改到了餐柜处,当时也是打得我措手不及,方案是调整了又调整。

选定设备

基于以上种种结论,可以开始选择设备了。

机柜

首先,选机柜。tb上的机柜也有现成的,而且非常结实,有兴趣的朋友可以看这里:简易开放式机柜 open-trial-cabinet

但是,自购机柜的话需要考虑机柜放置位置。比如放鞋柜,那么尺寸一定要合适。还有就是机柜出最好叫木工师傅帮助打一个散热孔。

现成的对于我来说不够折腾,本着极客的原则,博主开始学习网友的购买零件自己组装机柜。具体可参考这里: cabinet-list

lizhu-jijia

lizhu-jijia 从知乎上看到第一眼就爱上这个配置,和我的计划也非常符合。于是我也采购了一套,不过散热还是比较贵的。等房子装修好了晒图。

选AC+AP

由于是面板AP,选择面就比较少了。最开始相中了华为的H6,不过这玩意是贴上去的,不够美观。于是叫朋友推荐了一套TP-Link的套装,省事也省心。

TP-LINK TL-R4010GP-AC PoE ACTP
TP-LINK TL-XAP3002GI-PoE

这两款设备,我是在某鱼上购买的全新,应该不会翻车,有需求的朋友可以去某鱼上搜索下。

这款AC是集PoE交换机一体的:

  • 双WAN口接入
  • 9个千兆网口,2WAN+8LAN
  • 内置无线控制器,可统一管理TP-LINK AP产品
  • 所有LAN口支持标准PoE供电,整机输出功率高达120W
  • IPSec/PPTP/L2TP VPN,远程通信更安全
  • 接入认证(Web认证、短信认证、PPPoE服务器)
  • 上网行为管理(移动APP管控/桌面应用管控/网站过滤/网页安全)

这款AP是支持Wi-Fi6:

  • 新一代Wi-Fi 6 (802.11ax)技术
  • 11AX 2.4G/5G 双频并发,无线速率高达2976Mbps
  • 国标86壳体,外观优雅,出墙厚度仅9.4mm
  • 802.3af/at标准PoE网线供电,无需外接电源
  • 支持TP-LINK易展功能,简单按下按键,即可供TP-LINK易展设备无线接入
  • 频谱导航,引导双频用户优先连接5GHz频段,使2.4GHz 和5GHz 两个频段负载均衡,保障网络性能
  • FIT模式支持自动射频调优
  • FIT模式支持智能漫游
  • 支持弱信号设备剔除、禁止弱信号设备接入功能
  • 胖瘦一体,可以根据不同应用环境选择不同模式
  • 支持TP-LINK 商用网络云平台集中管理
  • 支持TP-LINK 商云APP远程查看/管理
  • 整机尺寸(mm):88*86*45.4,出墙厚度9.4mm

看中这款AP的原因也是它的出墙厚度仅9.4mm,与普通插座面板差不多的高度。实现了完美的隐藏。

参考

https://www.zhihu.com/question/26596786/answer/279309998

本文链接:https://deepzz.com/post/smart-home-networking-design.html参与评论 »