本帖最后由 imyz 于 2024-3-19 11:42 编辑
全新安装的 dnsmasq 其配置文件实际上有多个,功能各不相同,这篇教程只用到其中两个最主要的,第一个是 /etc/default/dnsmasq,不带扩展名,而另一个为 /etc/dnsmasq.conf。第一个配置文件可以看作是根配置文件,用于定义其自身运行环境,比如:定义域名、后备配置、指定默认搜索路径等共六大项,此处不深究,再者也不是 dnsmasq 专题教程;而第二个才是此次的主角,我要讲的配置尽在其中。考虑到文件分类,暂且将这个 dnsmasq.conf 如下图所示移至 /etc/dnsmasq.d/ 文件夹中:
- mv /etc/dnsmasq.conf /etc/dnsmasq.d/
复制代码
为更清楚地展示各个配置文件在 /etc 文件夹中的具体存放位置,同时考虑到第(二)部分亦有雷同之处,以下又有剧透内容,大家在这里重点关心名称含 dnsmasq 的即可,而其余的在(二)才会用到:
/etc
├── default
│ ├── dnsmasq
│ ├── isc-dhcp-server
│ └── tftpd-hpa
├── dhcp
│ └── dhcpd.conf
└── dnsmasq.d
└── dnsmasq.conf
但是,改变配置文件位置也是有前提的,请使用 root 权限并用 nano 编辑 /etc/default/dnsmasq,并将其中 CONFIG_DIR 这句开头的注释符“#”删除并保存,如下图:
- nano /etc/default/dnsmasq
复制代码
注意下方快捷键提示:Ctrl+O 回车保存,Ctrl+X 退出。若实在不会操作的,也可用我提供的文件覆盖。
接着便是 /etc/dnsmasq.d/dnsmasq.conf 文件,为便于对照着解释,先将其内容展示如下:
- port=0 # 禁 DNS
- bogus-priv
- interface=ens192
- bind-interfaces
- no-hosts
- dhcp-range=10.1.1.100,10.1.1.200,255.255.255.0,12h
- dhcp-option=option:router,10.1.1.1
- dhcp-option=option:tftp-server,10.1.1.20
- dhcp-match=set:ipxe,175 # iPXE sends a 175 option.
- dhcp-option=encap:175, 189, 128 # SAN device 0x80
- #dhcp-option=encap:175, 190, imyz # iSCSI username
- #dhcp-option=encap:175, 191, iscsi-target # iSCSI password
- dhcp-match=set:legacybios,option:client-arch,0 # Legacy BIOS
- dhcp-match=set:uefix86,option:client-arch,6 # UEFI x86
- dhcp-match=set:uefix64,option:client-arch,7 # UEFI x64
- dhcp-boot=tag:!ipxe,tag:!legacybios,Boot\iPXE\UEFI\ipxe.efi
- dhcp-boot=tag:!ipxe,tag:legacybios,Boot\iPXE\Legacy\undionly.kpxe
- dhcp-boot=tag:ipxe,Boot\iPXE\menulinux.ipxe
- enable-tftp
- tftp-root=/var/ftpd
- tftp-unique-root
- tftp-no-fail
- tftp-no-blocksize
- dhcp-authoritative
复制代码
以上配置第一行 port=0 表示禁用 DNS 功能,因为教程仅涉及 DHCP 与 TFTP 两项功能。需要重点指出的是第 3 行“interface=ens192”,其作用是绑定/监听“ens192”这张网卡。请注意:这句绑定设置“一定不能照抄”!!!请务必使用各自的网卡名称,包括其中 option:router 与 option:tftp-server 对应的 ip 地址。可网卡名称当如何获取呢?我也是找了很久发现 Debian 12 貌似只能使用以下命令:
针对配置中用“#”注释掉的 11 & 12 两行,大家一眼应该看出其为 iSCSI CHAP 认证的用户名与密码。此处不启用这两项的原因在(上)篇中也提到了,因为用 iPXE 的脚本来配置除功效一样外还更灵活。此外,与 M$ DHCP 服务器配置策略不同,dnsmasq 对语句的先后顺序并不敏感,比如,将 menulinux.ipxe 那句放在前或后均不改变执行结果。还有,dhcp-boot=tag:!ipxe,tag:!legacybios… 这句中逗号隔开的前后两个 tag 是“AND 逻辑与”关系,符号“!”为“NOT 逻辑非”。可 tag:ipxe 哪儿来的?
请看第 9 句 dhcp-match=set:ipxe,175……我粗浅的理解是 dnsmasq 使用该语句设置(set)了一个变量唤作 ipxe,并且该变量与 Option 175 关联绑定;我使用“变量”这一说是与“字符常量”相对应,我感觉 tag="ipxe"(此处 ipxe 代表字符常量)不合理,因为肉眼可见存在多个 set,所以姑且用变量这个假设,而 tag 则像是个数组名,后续语句中 encap:175 的语法是用以拼装 Option 175 字串的。当 iPXE 自举完成后向 DHCP 请求接盘侠时按官方说法会亮出 user-class="iPXE"标记(tag),dnsmasq 在接收到这个请求时发现该 tag 中有个唤作 ipxe 的变量竟然与其同名,区别只是大小写(说好的 Linux 严格区分大小写呢?%#* 我有点快编不下去了…),正好匹配上 tag:ipxe 这句中的 menulinux.ipxe,接盘侠非它莫属了!但等一下,前面拼了半天的 Option 175 不是还闲着没事儿干吗?咱们来看下当事双方的对话记录就清楚了:
iPXE:大姐,您好!您这儿能给说个媳妇儿不!?
dnsmasq:等我看下有合适的没… 欸,这有个 ipxe 不错,和你有夫妻相。
iPXE:这…怎么孩子都 175 了!?
dnsmasq:咋滴,看不上啊?我看你俩挺般配,这孩子还特聪明懂事儿,索性一起打包带走呗。
iPXE:带个孩子不方便,俗话说一分钱一分货嘛!要不您再给找找?我不差钱儿!
dnsmasq:可我这儿也实在没其他了啊!再说就你这条件还想挑三捡四呐?!
iPXE:啥意思?!鸡蛋五毛、一块不卖???
dnsmasq:怎么说话的呐!就你事儿多!爱要要,不要氵衮!
iPXE:…你大…… 人大量!
……
…
.
相信这么解释各位看官应该大致能理解其语法了……这也是我前面所说从语法上我更倾向 isc-dhcp-server 的原因。至于其余的相信都较容易理解了,还有,假如偏好用 DHCP Option 名称而非数字代码方式的,如:dhcp-option=option:router…,那么首先查找 dnsmasq 程序位于何处:
- find / -name dnsmasq # 比如我的位于 /usr/sbin/
- /usr/sbin/dnsmasq --help dhcp
复制代码
配置文件虽然有了,但为确保语法正确,在正式启动服务前可用以下命令来检测,若返回“syntax check OK”则表示启动服务过程不会报错,如下图:
注意:该命令只检测语法,不能检测逻辑或上下文错误!这啥意思呢?打个比方:你正开着车时(别闹)前方突然出现一个人和一个汪星人,撞人还是撞汪星人这两句话从字面上讲就好比“语法”;面对这突如其来的状况你一时间不知所措而向场外亲友电话求助就好比命令检测,但节目限定你在通话全程只能说“[我开车撞人]、[我开车撞汪星人] 两句话的语法是否都对?”仅此一句;场外亲友在经过对包括时政热点与国内外形势等在内的综合要素进行一系列复杂分析判断后答曰“对”就好比 syntax check OK;然而“逻辑”上讲你当时应该刹车,对吧?!
语法检测通过后,请再一次确认启动所需要的各文件已按此前给出的目录结构保存在 /var/ftpd/Boot/ 中,然后就可以用 systemctl restart dnsmasq 来启动服务。而对于不熟悉 dnsmasq 配置的看官,建议用以下命令将服务器响应客户机的日志实时展示在窗口中,对调试过程会很友好,利于及时发现“逻辑错误”:
上图中肉眼可辨 dnsmasq 是如何响应 iPXE Client 请求的对话过程,结尾出现的 minint-xxx 客户机名称代表 WinPE 在那一时刻已完成启动。至此,dnsmasq 这部分的讲解就到此结束。假如配置与操作过程无误,这台 Linux 服务器则已具备下发远程无盘启动 WinPE 所必须的文件的能力了。就是这么简单!
同样地,为便于区分章节,接下来的 isc-dhcp-server + tfptd-hpa 教程则请各看官移步 3 楼… |