home server 篇一:翻车的home server经验分享-DNS [bind9][webm

2022-08-12 19:16:38 9点赞 48收藏 5评论

创作立场声明:仅个人折腾

事先声明,我没学过代码,所有都是在网上找来自学的,我懂个锤子,电脑出问题了拍两下,没问题继续用。所以各位可以把我当成不明原因的吃瓜群众。翻车的home server经验分享-DNS [bind9][webm

吐槽

当初家里无线信号不好,想换路由器,在冲浪的时候无意间碰到了张大妈。说真的,我没法鉴定这是好事还是坏事。翻车的home server经验分享-DNS [bind9][webm 我的确买到了合适的路由器,但是被安利了软路由和nas。然后就发生了下面的事。

在张大妈这看到了jellyfin的贴子,评论里说http是明文,外网访问不安全,要用https才行。然后又碰巧看到了freenom可以免费申请tld。然后又学到了反向代理可以把ip+端口绑定到域名。然后我又在油管看到有人用traefik+cloudflare+let’s encrypt搞定https。好嘞,开干,但是我没想到每走一步都有几个坑等着我跳。

然后我就找DNS相关的文章自学,学完后我才明白学这个是在浪费时间,突然体会到了恺撒大帝临死前的感觉,然后一气之下就把虚拟机删了。翻车的home server经验分享-DNS [bind9][webm 这都是程序员的错,他们说话只说一半,写教程会习惯性省略重要部分,例如依赖之类的,例如在这里是省略了glue record需要绑定静态公网ip这最重要的部分。花了差不多1个月的时间学到的教训,记下来免得让别人走弯路的好。也可能是我自学的不够,毕竟自学没有系统性学习出现遗漏是正常的,不是所有人都凭自己意愿去把想学的学好的,如果真能学好我就去华尔街炒股。翻车的home server经验分享-DNS [bind9][webm 如果有懂dns的大佬看了这篇发现错误,不用在这里纠正我,请另起文章,详详细细的把所有步骤写出来,再解释清楚,这样我才能真真正正的学会,至于学习能力就把我当成小学毕业的就好,毕竟我看不懂书面语。翻车的home server经验分享-DNS [bind9][webm

首先去申请freenom的顶级域名,然后就立马踩坑了,注册邮箱得要是google邮箱,没关系我有,坑人的是必须要用美国时区填写美国地址才能申请,浪费了我大把时间。翻车的home server经验分享-DNS [bind9][webm 嘛,域名到手了接着去cloudflare解析域名,一开始叫我填name servers,我哪知道这是什么东西,没填就傻傻等了1天没解析成功才去搜索,原来得去申请域名的地方把name servers换成cloudflare的。

然后我家公网ip是动态的,总不能每次ip变了再去自己改吧,这时候就轮到ddns出场了,问题是怎么使用呢,又是一番搜索,搜到了jeessy/ddns-go,也成功在docker上部署好了,但是日志里跳出因为freenom的滥用,cloudflare把freenom的api全ban了,要搞只能在cloudflare网页上搞。好吧,大不了我换域名解析商嘛。翻车的home server经验分享-DNS [bind9][webm 额,He.net直接连解析都不给了。这怎么办。

然后在网上搜啊搜啊,出现了,可以用bind9自己解析域名,这里又出现了深坑。因为bind是企业用的,所以都是程序员在维护,因此没有ui,但是webmin有插件可以提供ui来管理bind插件。我看了bind的官方文档说支持ddns,但是webmin上没有bind的ddns设置,网上搜了一堆教程,都是用nsupdate加corntab定时更新,但是nsupdate的使用就是一堆代码,看不懂。继续找,给我找到了可以用webmin的dhcp插件更新,这dhcp是实打实的,要用这个我还得把我路由器的dhcp关了,要不然又搞一层nat,放弃。翻车的home server经验分享-DNS [bind9][webm 这出现个坑,如果我用教程教的的把次级域名放进域里管理,而且name servers的根域名和要管理的域名的根域名一样的话,就会出现要手动更新glue record的情况。现在让我解释为什么,假设我域名是sm.tk,name server是ns1.sm.tk和ns2.sm.tk,那我的name server的record就在sm.lan的域里,如果不绑定glue record,访问sm.tk的时候会出现这情况:访问sm.tk→请求sm.tk的ip→root name servers说我这没有对应的ip呢,我向sm.tk的name server问问→返回的ns1.sm.tk和ns2.sm.tk的ip是啥→不知道啊。是不是很尴尬,所以要绑定glue record。因为root name servers为了稳定更新很慢,所以glue record是没有ddns的,不信你自己搜去,所以每次公网ip更新后你得手动更新glue record,既然都更新glue record了,a record和aaaa record也手动更新好了,那用ddns和bind干嘛。继续找,最简单的解决方法出现了,把域名用cname绑到ddns上,但是这个啊我用cloudflare也能办到。以为这样就结束了吧,没有,后面还有坑。

国内电信运营商把家庭用户的80和443端口都封了,所以let’s encrypt免费证书的http challenge是会百分百失败的。假设用了bind当name server,那就没法用dns challenge了,因为let’s encrypt不支持bind。那let’s encrypt支持cloudflare,为什么不用cloudflare的cname方案呢,原因和之前一样,cloudflare把freenom的api全ban了。既然let’s encrypt这么难弄,为什么不去cloudflare搞证书,因为我真的看不懂cloudflare的证书是怎么下发的。翻车的home server经验分享-DNS [bind9][webm

还有啊,bind还有坑,如果在bind里把免费ddns域名来用,而且想在内网外网都用同一个域名访问,事先在bind里把ddns的域名解析了本地dns,dns challenge会失败,就算用了acl和view也一样。不知道为什么,dns challenge本应该去ddns提供商的name server挑战的,但是电脑先回复了本地bind的name server,然后就挑战失败,拒绝颁布证书。那如果在dns challenge成功后再解析本地dns怎么样,let’s encrypt的证书90天过期,所以需要每90天删了本地dns再干一次,如果没有事先删除本地dns,challenge失败太多会把域名ban了。

还有nom.za也是个垃圾,申请了2周硬是没批下来。翻车的home server经验分享-DNS [bind9][webm

结论:白折腾了。虽然白折腾了,但是我还是学了点的,所以我打算写个经验分享。

介绍

DNS(Domain Name System)是为了容易记而诞生的,你看看啊,你认为42.81.219.16还是www.smzdm.com好记,当然是www.smzdm.com啦,所以在注册域名时要选又短又好记的。


先来简单介绍下域名的组成。www.smzdm.com是一个域名,没错这是句废话。现在分解来解释。com是TLD(Top Level Domain)的其中一个,被ICANN分发,一般人租用不了。smzdm是SLD(Secondry Level Domain),smzdm是com的subdomain,同理www是smzdm的subdomain,正常人租用的域名就是权威机构的TLD下的SLD。www则是三级域名,就是接下来要搞的,如果我的域名是zdm.cn,而且完全又归我管理,那三级域名就能由我免费分发,只要不是骂人的名字想换成什么都行,例如price.zdm.cn。有时候注册的是三级域名,没关系,只要我有管理权,就能搞四级域名。

接下来进入正题。硬件需要一个能长时间开机的电脑之类的东西,软路由也行。软件需要bind和webmin。bind是用来管理dns用的。webmin的webui是来操作bind的,不需要webui就不用装。Bind和webmin支持很多系统例如windows、mac和大部分linux。

我用的系统是ubuntu lts 20.04,不过大部分linux系统只有安装过程不一样,剩下的只有在管理dns时文件夹不同和bind叫named的情况了。

正文

先安装webmin,因为webmin里有bind插件,安装bind就不需要命令行了。其它系统在webmin官网https://webmin.com/download.html的左边的Webmin Installation那,但是你知道的,程序员教程都不是让普通人看的,只有他们圈里的才看的懂,最后还是得在网上搜。翻车的home server经验分享-DNS [bind9][webm

webmin

现在来讲安装步骤。

sudo apt update(webmin需要在系统最新的情况下安装,如果不是可能会出问题)
sudo nano /etc/apt/sources.list
在最后一行加上deb http://download.webmin.com/download/repository sarge contrib,然后按CTRL+X按Y按ENTER
wget -q -O- http://www.webmin.com/jcameron-key.asc | sudo apt-key add
sudo apt update
sudo apt install webmin -y

现在来讲使用步骤,为了避免看不清图片,我会用文字说明。我重复干了很多次,看到ip和时间不同是正常的。因为我是看英语的教程,所以是用英语的,但是webmin是支持中文的。我见过有些中文教程居然是把英语直接翻译成中文,没有任何修改。

打开浏览器访问https://ip:10000/,用账号密码登陆,账号必须要有root或者sudo权限,如果ubuntu只有一个用户的话默认就有了。登陆后就是以root身份进行操作。

webmin loginwebmin login

bind9

在un-used modules里找到bind dns server并安装。Install now要点2次。Bind需要占用udp和tcp的53端口,而且不能改成其它的,因为好像所有软件都默认name server的端口是这个。

bind modulebind module

bind module installbind module install

bind module install donebind module install done

装完后按refresh modules,就能在servers里找到bind了。

bindbind

虽然看起来是空的,但是root zone之类的已经存在了。现在来部署内网dns,外网dns也是一样的步骤。

先创建forward zone,那个reverse zone只有静态公网vps用户才有用,而且我也不知道是干嘛用的。现在点create master zone。在domain name那填想用的域名,我就用home.lan示范,实际上可以内外网用相同域名,如果只想内网使用,lan或者home之类的tld是可以随便用的,local不行。Records file不要用automatic,我试了几次都不行,点旁边的⚪里,再点那个两张纸重合的按钮,进/var/lib/bind文件夹,就会发现里面是空的,然后在下面的地址里加/db.域名,完整地址是/var/lib/bind/db.域名,然后enter。Master server填ns.域名,嘛,实际上不用ns换成其它的也行,只是习惯上这么填而已,email address就随便填,反正也发不了邮件到外网。确认后按create。

姑且还是提下bind装zone record的文件夹吧。/etc/bind装的是默认zone record,像root zone之类的,所以尽量别动。/var/lib/bind是装静态和动态zone的,用户创建的zone主要就是放这。/var/cache/bind是放临时文件的,要是有临时创建且用完就删除的zone也能放这。

bind master zone forwardbind master zone forward

forward zone建好了,接下来建reverse zone,虽然只有静态公网vps用户才有用。reverse解析一般是解析商干的活,个人是不能控制的,看不到不表示不存在,所以自建dns解析也是要搞的。因为用forward zone只会访问域名解出ip,但是访问ip却解不出域名,所以轮到reverse zone出场了。

点create master zone,点reverse前面的⚪,在domain name那填192.168.x,剩下和forward zone填的一样。假设路由器分配的ip段是192.168.1.1-192.168.1.254,那把x改成1。

bind master zone reversebind master zone reverse

回到bind管理界面,192.168.x和域名这2个zone就是自己创建的,剩下都是默认 zone。

翻车的home server经验分享-DNS [bind9][webm

现在搞a record,点域名那,再点address。在name上填要解析的域名的subdomain,address填服务所在机器的ip。假设要给根域名绑定ip,假设根域名是home.lan,home.lan在192.168.0.130上,在name上留空,address填192.168.0.130,再按create。假设要给name server绑定ip,name server的ip就是bind所在机器的ip,ns.home.lan在192.168.0.131上,在name上填ns,address填192.168.0.131,再按create。还有如果所有服务都是同个ip,那根域名照home.lan前面填,然后在name上填*,address填上ip,再按create,这样所有的subdomain都会有同一个ip,虽然可以这么干,但是不推荐,一般都是用cname替代,在mail record那会解释。那个aaaa record也是一样填法,只是得去ipv6 address那填。记着域名和ip没有一对一关系。

forward zoneforward zone

a recorda record

如果有多台设备做fallover,也可以添加ns record,点name server。Zone name可以填当前zone的域名,也能填其它zone的,只要有管理权,同样的可以用其它zone的name server当自己的,记得最后带个英文句号。name server填bind所在机器的域名,记得最后带个英文句号。例如home.lan还有一个name server在backup.lan,zone name填home.lan.,name server填backup.lan.。例如run.lan有一个name server在home.lan,zone name填run.lan.,name server填home.lan.。

ns recordns record

现在搞cname record,点name alias。在name上填要解析的域名的subdomain,real name上填相同ip的域名,域名后一定用带个英文的句号。Cname就是用来偷懒用的,例如有个域名已经绑好了a record,另一个域名也是同一个ip,那就用cname绑定,这样服务器改ip只需要改一个a record。例如www.abc.home已经有a record ,www.abc.home和bbq.abc.home是同个ip,那name填bbq,real name填www.abc.home.,句号不要忘了。这样改www.abc.home的a record , bbq.abc.home也会是和www.abc.home同个ip。

cname recordcname record

现在搞mail record,点mail server。在name上填要解析的域名的subdomain,这subdomain不能出现在a record或者aaaa record或者ns record或者cname record里,这就是为什么不推荐用*的原因,mail server填邮箱服务所在服务器的域名,例如在home.lan就填home.lan.,在server.home.lan就填server.home.lan.,句号不要忘了,priority填数字,一般第一个从10开始,第二个20,以此类推。邮箱的外网端口应该是被运营商ban了,所以还是放弃自建邮箱吧。

mail recordmail record

reverse zone的填法和forward zone大同小异,只是address和域名调个位置。现在搞a record,点192.168.x那,再点reverse address。假设要给192.168.0.130绑定server.home.lan,那address填192.168.0.130,hostname填server.home.lan.就行,句号不要忘了。

reverse zonereverse zone

a recorda record

同样的reverse zone可以添加ns record,点name server。Zone name填x.168.192.in-addr.arpa.,记得最后带个句号。name server填bind所在机器的域名,记得最后带个句号。

ns recordns record

cname record也一样,点name alias。Name填192.168.x.abc的abc。Real name填efg.x.168.192.in-addr.arpa.。

cname recordcname record

把要填的都填好,现在来检查有没有错误,去bind管理界面点check bind config,如果像下图一样没错误就可以回管理界面点右上角的applyconfigration,就是刷新符号。

check bind configcheck bind config

默认情况下,本地dns server是127.0.0.53,用nslookup或者dig是出不了结果的,所以要去webmin的networking的networking configration的hostname and dns client把127.0.0.53改成127.0.0.1。其它设备要想访问这服务器的dns record要把dns server改成该bind所在的机器的ip,推荐直接在路由器上改。

networking configrationnetworking configration

现在就能用nslookup来测试了,console在左下脚从左往右第三个,nslookup 域名/ip,或者dig域名/ip,失败会报nxdomain,成功的话会解析。内网dns部署就到此为止。

现在的域名还没什么用,除非刚好有服务开在80/443端口,要不然还是得域名+端口访问。反向代理下篇再写。

nslookupnslookup

好,现在是内外网同个域名访问的步骤。为了隔离内外网,需要用到view。先搞个acl(access control lists),事实上acl也能在内网里用,把单独几个ip屏蔽了,或者只给几个ip访问权限,嘛,不要把内网搞那么复杂啊,虽然也能这么干,专门搞个nas只让自己看小姐姐。去bind管理界面点access control lists,ACL Name里填随便什么英文名字,Matching addresses,networks and ACLs里填192.168.x.0/24和localhost和localnets,一行一个,然后save。如果想屏蔽ip,那就在192.168.x.0/24上一行加!192.168.x.d,有几个就几行,!192.168.x.d一定要在192.168.x.0/24前,感叹号一定要英语的。

aclacl

现在先建内网的view,bind管理界面点create client view。View name随便填英文名,Applythis view to clients填刚刚搞的acl名字,然后create。至于All clients是留给外网用的。

view localview local

然后会看到报错,因为只要有view,那么所有zone都要在view里。接下来一个个进zone,选刚刚创建的view的名字,然后按move to view。

errorerror

move to viewmove to view

搞root zone比较麻烦,得先删了再建。点进root zone里,点delete root zone,点delete zone,在bind管理界面点create root zone,get root servers from选existing root in file前的⚪,create in view选刚刚创建的view的名字,点store root servers in files的旁边的按钮,一直选到/usr/share/dns/root.hints,最后create。现在所有的zone都在view里了。

翻车的home server经验分享-DNS [bind9][webm

翻车的home server经验分享-DNS [bind9][webm

root zoneroot zone

接下来搞外网的view,和内网的创建步骤一样,Apply this view to clients选All clients。

翻车的home server经验分享-DNS [bind9][webm

接下来搞外网的zone,步骤和内网都一样,只是多了一个create in view,选刚刚创建的外网view的名字,域名得是真的。

如果公网ip是静态的,需要内网一样建forward zone和reverse zone。如果公网ip是动态的,只需要建forward zone,然后在cname里把域名指向ddns,但是根域名没法用cname,那个a record和aaaa record都不用填。

翻车的home server经验分享-DNS [bind9][webm

这些都搞好后还得再设置view,点进view里,内网的Do full recursive lookups for clients?选yes,Allow queries from..填acl名字。外网的Do full recursive lookups for clients?选no。check bind config里看看有没有报错,apply configration点下,再nslookup一下,没问题了,动态公网ip的,去买域名的地方,把name servers改成刚建的name server,静态公网ip的还要在glue record里把name server和对应外网ip填了。

写完回顾了一下,我没有学dns安全设置啊。在dig域名的时候会把bind的版本号也报出来,有人会根据版本漏洞攻击,想用bind的人需要自己学怎么改版本号。然后如果有多个服务器做name server,为了防止别人恶意篡改,还得学slave zone和rndc key和dnssec key。没有其它服务器的话,在外网zone的edit zone option里的Allow updates from..填none就行。不过也没关系,我又不用bind了。

翻车的home server经验分享-DNS [bind9][webm

Webmin除了bind外还有很多功能,如果用没有gui的linux的话,我很推荐你装它。而且webmin还有像Virtualmin之类的大插件,因为学习需要大量时间,我就提一提。

总结

这文章是不是对大部分人没什么用啊,只对纯内网用户和拥有静态公网ip或者动态公网ip的vps的而且想自己解析dns record的用户才有用,实际上对纯内网用户也没用,实际上我也劝你不要用,内网与pihole的local dns就行,外网随便找个dns解析商就行了,至于为什么要强调vps呢,因为vps有开放80和443啊。

还有一个重要的事,即使你路由器没送ddns,也不需要买域名来自己搞,反正你80/443端口被封了,搞了几个subdomain后还是得加端口访问,这和免费的没差。因为tld要备案,不备案你的域名会被运营商这样那样的。翻车的home server经验分享-DNS [bind9][webm 有没有备案去搜下whois就行。还有确认自己真的需要用远程访问,而且是用域名访问再搞。

附件

嘛,虽然翻车了,但是我又找到了差不多的替代方案,只是不能自动更新ipv6,dns用duckdns,内网解析用pihole,如果用有dns重写功能的软路由,那就不需要pihole了。

duckdns

Duckdns需要注册一下,可能需要梯子,然后在里面申请subdomain,一个账号只能申请5个免费的,实际上只需要1个就够了。然后复制下token。然后把这个docker run命令的中文部分改成自己的就能用了。当前Volume的具体地址可以用pwd找到。

docker run -dit --name=duckdns -e SUBDOMAINS=刚申请的subdomain -e TOKEN=就是那个token -e LOG_FILE=ture -v /home/用户名/docker/duckdns/config:/config --restart unless-stopped linuxserver/duckdns:latest

为啥只需要1个就够了,因为duckdns自动把所有subsubdomain都cname到了subdomain。好像subsubdomain的数量是200个,具体的就需要去duckdns那看了。

pihole

Pihole有点复杂,53端口被系统占用了,但是还是有婉转的解决方法,搞个虚拟端口。去webmin的Networking-Network Configuration-Network Interfaces那点存在的端口,我的叫ens32,点下面蓝色的Add virtual interface,然后在IPv4 address填一个静态ip,例如我用192.168.0.150,关于IPv6我一窍不通,所以就不填了,然后按create就行,然后重启,就得到了新ip了。所以有大佬可以写篇小白向的ipv6文章吗?翻车的home server经验分享-DNS [bind9][webm

翻车的home server经验分享-DNS [bind9][webm

然后,把192.168.0.150改成自己要用的ip,把用户名改成自己的用户名,密码改成要用的密码,运行下面的命令。

docker run -dit --name pihole -p 192.168.0.150:53:53/tcp -p 192.168.0.150:53:53/udp -p 192.168.0.150:80:80 -e TZ="Asia/Shanghai" -e WEBPASSWORD="随便什么密码" -v "/home/用户名/docker/pihole/pihole/:/etc/pihole" -v "/home/用户名/docker/pihole/dnsmasq.d:/etc/dnsmasq.d" --restart=unless-stopped pihole/pihole:latest

完成后访问那个ip/admin/,例如我访问192.168.0.150/admin/,你也可以试试直接访问不带admin的翻车的home server经验分享-DNS [bind9][webm 。然后点击login,然后就能用那个密码登录了。登录后点Local DNS -DNS Records,在Domain填上刚刚申请的完整域名,例如smzdm.duckdns.org,在IP Address填上ip,例如192.168.0.140,然后点add就好了。那个CNAME Records是差不多用法,例如Domain填web.smzdm.duckdns.org,Target Domain填smzdm.duckdns.org,然后点add就好了。

翻车的home server经验分享-DNS [bind9][webm

当然,这里也翻车了,duckdns不会自动更新IPv6,我完全不知道为啥pihole只有1台win10可以正常query local dns,剩下的手机啊电脑啊路由器啊都不行,而且pihole也不能query IPv6 name servers。翻车的home server经验分享-DNS [bind9][webm 所以有没有大佬指点下怎么用pfsense或者opensense或者什么其它os达成dns改写功能。

好了,DNS经验分享就到这里。下篇翻车的反向代理。翻车的home server经验分享-DNS [bind9][webm

展开 收起

微软 (Microsoft) Office 365 家庭版/个人版 激活密钥 1年订阅 正版办公软件 店铺至尊指导服务+M365家庭版加强版-15个月

微软 (Microsoft) Office 365 家庭版/个人版 激活密钥 1年订阅 正版办公软件 店铺至尊指导服务+M365家庭版加强版-15个月

暂无报价

Micropoint 东方微点 网络版 杀毒软件

Micropoint 东方微点 网络版 杀毒软件

20000元起

Microsoft 微软 OFFICE 365 家庭版 会员

Microsoft 微软 OFFICE 365 家庭版 会员

239元起

《国家地理 每日精选》iOS数字版软件

《国家地理 每日精选》iOS数字版软件

暂无报价

《Picsew》iOS数字版软件

《Picsew》iOS数字版软件

暂无报价

Microsoft 微软 Office 365 个人版

Microsoft 微软 Office 365 个人版

249元起

Microsoft 微软 Office 2019 家庭学生版 密钥

Microsoft 微软 Office 2019 家庭学生版 密钥

189元起

WPS 金山软件 会员季卡

WPS 金山软件 会员季卡

19元起

WPS 金山软件 WPS 超级会员 3年卡

WPS 金山软件 WPS 超级会员 3年卡

399元起

《kirakira+》 iOS软件

《kirakira+》 iOS软件

暂无报价

《DARK SOULS III》(黑暗之魂3 )PC数字版游戏

《DARK SOULS III》(黑暗之魂3 )PC数字版游戏

暂无报价

《扫描全能王付费版》iOS数字版软件

《扫描全能王付费版》iOS数字版软件

暂无报价

WPS 金山软件会员 2年卡

WPS 金山软件会员 2年卡

149元起

《拍照取字 专业版》iOS数字版软件

《拍照取字 专业版》iOS数字版软件

暂无报价

Microsoft 微软 OFFICE 365 个人版 办公软件

Microsoft 微软 OFFICE 365 个人版 办公软件

249元起

任天堂 Nintendo Switch《舞力全开 Just Dance》 游戏兑换卡

任天堂 Nintendo Switch《舞力全开 Just Dance》 游戏兑换卡

269元起
5评论

发表评论请 登录
  • 最新
  • 最热
评论举报

请选择举报理由

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
48
扫一下,分享更方便,购买更轻松