Loading

企业网络服务搭建(一)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,重启路由器就正常了。

 

posted @ 2024-10-12 14:06  上官飞鸿  阅读(83)  评论(0编辑  收藏  举报