如果内网系统访问还在使用IP来进行访问,可以试着搭建域名系统,即DNS服务。因为域名比IP更好记,并且内部域名可以随意命名,比如 it.com、hisdb.com
为了防止域名冲突,内网域名可以使用DNS服务器的域名重写功能,这样就不怕和外网域名冲突了。
DNS的配置可以随DHCP服务一起下发,配合DHCP服务器实现IP和DNS自动分配。
在正确配置了DHCP服务及DNS服务的情况下,客户端的网络配置应该全部使用自动获取。
一般核心交换机都带DHCP功能,但在交换机上配置多网段DHCP功能会非常复杂。建议使用专用DHCP服务器实现静态和动态地址规划。我们使用的是雨滴科技的智能网关来实现DHCP功能。DHCP服务会将内网DNS下发到客户端。
DHCP服务需要支持静态IP池和动态IP池的分配,并且能够将IP固定住,不让其动态飘。动态IP策略不利于资产梳理和定位,最终要达到如下效果:使用DHCP分配,一旦分配后DHCP租约不再过期,保证MAC与IP绑定。
DNS 服务器需要支持外网域名解析转发与内网域名覆盖。当外网域名与内网域名冲突时,应使用内网域名覆盖外网域名。
内网DNS服务器使用的是 AdGuard 来提供DNS服务。AdGuard 是一款网络广告拦截工具,也可以当DNS服务器来使用。它有免费版和付费版,付费版提供了更多高级功能和定制选项。这里使用的是它的免费版,主要使用的它的DNS转发和重写功能:
内网的服务器IP、域名可以使用Git库来维护,通过脚本将IP、域名同步到AdGuard 中。之前对如何同步域名配置做过详细介绍:
如果只是小范围使用,可以使用系统的 hosts 文件代替 DNS 服务,比如在 git-bash 下将 DNS 配置同步到系统的 hosts 文件:
$ cat DNS.txt >> /c/Windows/System32/drivers/etc/hosts
复制
需要注意的是修改 hosts 文件需要管理员权限,在运行 git-bash 时需要使用管理员权限运行。
系统会优先使用 hosts 文件解析域名,使用 ipconfig 命令可以查看 hosts 文件配置是否生效:
C:\> ipconfig flushdns
C:\> ipconfig displaydns
复制
基于 hosts 的域名配置会一直在 dns 缓存中驻留,不会因 flushdns 而清空。
日常维护可以使用 Git 库管理 IP 与域名的对照关系,允许一个 IP 有多个域名,我们使用的数据格式是:
域名 IP 备注
复制
hosts 数据格式为:
IP 域名
复制
AdGuard 的配置文件中使用的数据格式为:
rewrites:
- domain: oa.com
answer: 10.1.1.8
- domain: www.oa.com
answer: 10.1.1.8
复制
在处理各种配置文件时可以通过 awk 或 python 进行灵活处理。比如将带备注的域名数据转 hosts,可以使用 awk 选择列:
$ cat AdGuardHome.txt | \
awk '{print $2" "$1}'
复制
将带备注的域名数据转AdGuard配置,可以使用正则表达式结合文件插入:
import re
import sys
# DNS.txt 数据格式
# 域名 IP 备注
s1 = 'DNS.txt'
# 从 AdGuard 配置目录获取配置文件模板
s2 = 'AdGuardHome.yaml_template'
# 替换AdGuard配置文件中的 DNS 部分
def dns2conf(f):
L = []
for line in f:
s = line.split()
L.append(s)
L.sort(key=lambda item: socket.inet_aton(item[1]))
for i in L:
print(" - domain: %s" % i[0]);
print(" answer: %s" % i[1]);
pattern0 = 'rewrites:'
pattern1 = '- domain:'
pattern2 = 'answer:'
L = []
f = open(s2, mode='r', encoding='utf-8')
for line in f:
match_rule = re.search(pattern0, line)
match_name = re.search(pattern1, line)
match_ip = re.search(pattern2, line)
if match_rule:
print(line, end='')
with open(s1, mode='r', encoding='utf-8') as f1:
dns2conf(f1)
continue
if match_name:
continue
elif match_ip:
continue
else:
print(line, end='')
f.close()
复制
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
提示:下方是广告...