企业网络服务搭建(一)OpenWRT uhttpd ddns firewall wireguard
简介:
最近要给媳妇的企业重新搞一搞信息化,这个也写个系列文章吧。
为什么要写openwrt呢?小公司,搞不起托管、搞不起上云。也不算搞不起,主要是自己手边各种垃圾材料多啊。自己家,公司,父母家,3处家用宽带。
本着垃圾佬的心态,能省则省。其实更多的是模拟大型异地办公需求的一种探索。
OpenWR:
开源免费的一个路由系统,玩的比较多,功能比较多,能刷openwrt的路由器也挺多。价格还实惠。它将是各个节点的接入系统,虽然还有一些更高级的pfSense OPNsense,在初级阶段,我还是会考虑openwrt的。
刷机,配置上网就不讲了。
本例使用设备如下
家里:
型号 Xiaomi Redmi Router AC2100
架构 MediaTek MT7621 ver:1 eco:3
目标平台 ramips/mt7621
固件版本 OpenWrt 23.05.5 r24106-10cc5fcd00
办公室:
型号 Phicomm K2P
架构 MediaTek MT7621 ver:1 eco:3
目标平台 ramips/mt7621
固件版本 OpenWrt 23.05.2 r23630-842932a63d
uHTTPd:
干嘛搞这个呢?openwrt是有web管理的,不用苦哈哈的在命令行窗口干。为了通过internet远程管理检查路由,我们受运营商的限制,80、443是无法访问的。所以需要修改openwrt默认的web服务器uhttpd的端口。用来实现远程互联网管理。
而且我3条宽带,最后申请的这条是怎么投诉都不开IPV4公网地址了。还要为未来考虑,直接ipv6组网了。
安装:
虽然openwrt默认已安装uhttpd,但是它没安装luci-app-uhttpd,也就是没有web控制界面,所以需要安装一下,可以web更新列表,搜索uhttpd,找到luci-app-uhttpd安装,也可以ssh上去 opkg update && opkg install luci-app-uhttpd。
安装完毕以后,可能需要退出登陆,重新登陆才能出现菜单。
添加监听端口
我添加了18080、18443两个ipv6的监听端口。ipv4的前面是0.0.0.0:,ipv6的前面是[::]:
重新启动uhtpd
测试:
找到路由获取的ipv6地址,带上端口号测试一下是否可以访问。
设备--接口,随便复制一个ipv6地址,带协议和端口访问测试。
不好复制,就点一下右上角的刷新变为暂停
我测试的地址是
http://[240e:xxxx:xxxx::1]:18080
https://[240e:xxxx:xxxx::1]:18443
可以正常访问就好了。
DDNS
申请域名,申请cloudflare账号,转移主dns解析就不讲了。
我说了,三条家用宽带,这是没有固定IP地址的,还得上ddns,你们喜欢用什么我管不了,为了我的个人习惯和需求,我写了一个cloudflare-ddns。
jackadam1981/cloudflare-ddns (github.com)
顺便将用法写在这里。
单文件,shell脚本,支持cloudflare,更灵活。
安装
仅需要一个文件raw.githubusercontent.com/jackadam1981/cloudflare-ddns/refs/heads/main/ddns.sh
我一般复制到/root/cfddns/ddns.sh
token令牌
要跟cloudflare一起用,需要有cloudflare的tokenAPI 令牌 | Cloudflare在这个页面注册一个新的令牌
使用DNS模板
编辑下令牌名称,选择所有区域,继续
创建令牌
这个令牌只显示一次,存入keepass(用了十多年的跨平台云密码管理软件)吧。
脚本加权限
在你存ddns.sh的目录下给这个脚本增加执行权限。
chmod +x ddns.sh
初次执行脚本
直接执行当前目录的ddns.sh
./ddns.sh
执行指定目录的ddns.sh
/root/cfddns/ddns.sh
依赖
虽说是纯shell实现,但是也依赖jq json编解码 curl 网络请求两个包。
如果系统没有这两个包,会提示你安装,并给出安装命令。
配置文件
这个就是重点讲一下的了。
很多动态域名,我并不知道它提交的IP是怎么来的,也不了解过程,这也是我写这个脚本的原因之一。
我也创新的将不存在的域名,自动注册也写进去了。随便写主机名吧。
'{ "settings": { "log_level": "debug,info", "arIp6QueryUrl": "https://6.ipw.cn", "arIp4QueryUrl": "https://4.ipw.cn", "log_header_name": "DDNS" }, "domains": [ { "domain_name": "example1.com", "zone_id": "", "auth_email": "your_email@example.com", "auth_key": "your_auth_key1", "auth_key_valid": false, "records": [ { "name": "subdomain1", "type": "A", "proxy": false, "local": true, "nic_name": "eth0" }, { "name": "subdomain2", "type": "AAAA", "proxy": true, "local": false, "nic_name": "eth0" } ] }, { "domain_name": "example2.com", "zone_id": "", "auth_email": "your_email@example.com", "auth_key": "your_auth_key2", "auth_key_valid": false, "records": [ { "name": "subdomain3", "type": "A", "proxy": false, "local": true, "nic_name": "eth1" } ] } ] }'
log_level:可以写debug,可以写info,debug会显示更多的信息给你,info就写简单的信息给你。
arIp6QueryUrl:在线获取ipv6地址的网站
arIp4QueryUrl:在线获取ipv4地址的网站
log_header_name:日志记录头,在选择行读取日志时很有用
domains:域名相关设置,可以有多个域名,示例文件是两个域名。
domain_name:域名的名字,就是你注册的那个名字
zone_id:cloudflare对域名的识别号,不用填,会自动获取并缓存
auth_email:忘记了,应该是不用填的
auth_key:刚才申请的token,或许改成token更好,有空改脚本再说。
auth_key_valid:验证过没有,默认false,脚本自己会检测这个token是否有效可用,如果可用会自动改true
name:子域名,就是你想注册的主机名
type: A 或 AAAA IPV4 或 IPV6
proxy:白嫖的CDN加速,ddos防火墙,开不开随便你了。
local:是否使用本地网卡地址,true使用本地网卡地址,需配套下面的nic_name
nic_name:如果使用本地网卡地址,多网卡时用哪个网卡?写网卡名,一般是 ip addr 显示的网卡名。
这就是我为了自己的灵活使用设计的ddns脚本。
可以在一个主机上管理多个域名,主机名,是否开彩云代理,是否用本地地址,本地用哪个网卡,随意组合。
定时运行
cron定时任务还是web写吧
系统--计划任务
*/10 * * * * /root/cfddns/ddns.sh
每10分钟运行一次。
防火墙
以前都苦巴巴的求爷爷告奶奶,申请个公网IPV4,然后端口转发。
现在IPV6也能用了,几乎不见纯IPV4的路由器了,我们就不做端口转发了。
我们直接用防火墙通信规则,放行指定端口的流量好了。
网络--防火墙--通信规则
我写了个Allow_local,意思是允许本机的流量
允许从wan到本设备 22 18080 18443端口流量的转发。
测试
现在有了DDNS解析,有了防火墙通信规则,应该可以用itdog.cn做测试了。
为什么不用手机测试呢?我反正用和宽带捆绑的手机,无法通过域名访问,只能通过IP地址访问。很诡异的一种故障现象,至今没找到问题。
你说运营商做了用户隔离,22的ssh又能访问,18080,18443就不行,难道是端口号太低?
在线ping,全绿
带端口的tcping,也还好
带协议,带端口的网站测速,全绿
这就完成了本地网络的建设。
wireguard
有了动态域名,有了自定义端口,你已经可以从互联网访问两个路由器了。
同时访问两个路由器的管理界面,就可以配置wireguard了。
异地组网也是一个需求,虽然暂时没必要,但是垃圾佬的极客精神就在这里体现了,可以不用不能没有。
据说linux老大对wireguard赞不绝口,没有屎山代码,性能也很优秀。就它了,wireguard
照样把两地openwrt设置好。注意使用不同的网段,我家使用的是192.168.2.*/24,公司使用的是192.168.3.*/24
开放wan到此设备52080端口,或者你喜欢的端口。
安装
仅安装luci-proto-wireguard就会自动安装所有依赖项。
安装完成后需要重启路由器,否则不生效,无法添加对应接口。
VPN网络规划
我们需要有一个网段专门用来互相通信,我选了172.16.1.*/24,正好对应各地网段,给家用了172.16.1.2/24,给公司用了172.16.1.3/24,第四位对应子网的第三端。
添加接口
分别在两个路由器添加接口
网络--接口--添加新接口
名称任意,协议WireGuard VPN
两地分别生成新的密钥对,设置开放防火墙的端口,指定VPN的接口IP地址。
防火墙
我们重新配置了Wireguard,所以还需要开放Wireguard端口。
允许UDP,wan到设备,你设置的端口。
高级设置,可以设置仅IPV6,反正我IPV4不够,就IPV6,我设置仅IPV6。
对端
这个概念就有点复杂了,vpn是有两端的,我们创建接口,算是一端,链接的目标就称之为对端。
我们创建的接口,就是另一方的对端了。
先跟着我配
网络--接口--wiereguard--防火墙,设置为LAN区域
对端配置
两边都要设置对端,具体对应关系如下:
配置完成后重启一下端口,检查是否连接成功
网络--接口--你定义的wireguard设备--重启
状态--WireGuard,能看到上次握手时间,就是连接正常了。
如果你遇到了能ping通对面网络,却无法打开网页,请重启一下路由器。可能是有bug,重启路由器就正常了。