首页 >PC >正文

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

创作立场声明:仅个人折腾 事先声明,我没学过代码,所有都是在网上找来自学的,我懂个锤子,电脑出问题了拍两下,没问题继续用。所以各位可以把我当成不明原因的吃瓜群众。

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


吐槽


当初家里无线信号不好,想换路由器,在冲浪的时候无意间碰到了张大妈。说真的,我没法鉴定这是好事还是坏事。

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

我的确买到了合适的路由器,但是被安利了软路由和nas。然后就发生了下面的事。

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

然后我就找DNS相关的文章自学,学完后我才明白学这个是在浪费时间,突然体会到了恺撒大帝临死前的感觉,然后一气之下就把虚拟机删了。

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

这都是程序员的错,他们说话只说一半,写教程会习惯性省略重要部分,例如依赖之类的,例如在这里是省略了glue record需要绑定静态公网ip这最重要的部分。花了差不多1个月的时间学到的教训,记下来免得让别人走弯路的好。也可能是我自学的不够,毕竟自学没有系统性学习出现遗漏是正常的,不是所有人都凭自己意愿去把想学的学好的,如果真能学好我就去华尔街炒股。

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

如果有懂dns的大佬看了这篇发现错误,不用在这里纠正我,请另起文章,详详细细的把所有步骤写出来,再解释清楚,这样我才能真真正正的学会,至于学习能力就把我当成小学毕业的就好,毕竟我看不懂书面语。

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

首先去申请freenom的顶级域名,然后就立马踩坑了,注册邮箱得要是google邮箱,没关系我有,坑人的是必须要用美国时区填写美国地址才能申请,浪费了我大把时间。

home server 篇一:翻车的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 篇一:翻车的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 篇一:翻车的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 篇一:翻车的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 篇一:翻车的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 篇一:翻车的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身份进行操作。


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

webmin login

bind9

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

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

bind module

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

bind module install

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

bind module install done

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

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

bind

虽然看起来是空的,但是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也能放这。


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

bind 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。

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

bind master zone reverse

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

home server 篇一:翻车的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没有一对一关系。

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

forward zone

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

a 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.。

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

ns 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。


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

cname 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了,所以还是放弃自建邮箱吧。

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

mail 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.就行,句号不要忘了。

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

reverse zone

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

a record

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

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

ns record

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

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

cname record

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

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

check 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,推荐直接在路由器上改。

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

networking configration

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

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

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

nslookup

好,现在是内外网同个域名访问的步骤。为了隔离内外网,需要用到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前,感叹号一定要英语的。

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

acl

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

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

view local

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

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

error

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

move 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 篇一:翻车的home server经验分享-DNS [bind9][webm

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

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

root zone

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

home server 篇一:翻车的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 篇一:翻车的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 篇一:翻车的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 篇一:翻车的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 篇一:翻车的home server经验分享-DNS [bind9][webm

home server 篇一:翻车的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 篇一:翻车的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 篇一:翻车的home server经验分享-DNS [bind9][webm

当然,这里也翻车了,duckdns不会自动更新IPv6,我完全不知道为啥pihole只有1台win10可以正常query local dns,剩下的手机啊电脑啊路由器啊都不行,而且pihole也不能query IPv6 name servers。

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

所以有没有大佬指点下怎么用pfsense或者opensense或者什么其它os达成dns改写功能。

好了,DNS经验分享就到这里。下篇翻车的反向代理。

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


网友评论

验证码 换一张
取 消
暂无评论...
三日内热门评论文章
为您推荐
  • 相关阅读
  • 业界资讯
  • 手机通讯
  • 电脑办公
  • 新奇数码
  • 软件游戏
  • 科学探索