我在 Debian 上运行 Kerberos / LDAP 用户身份验证,几十年来一直运行良好。我现在想使用笔记本电脑,可以通过有线或 WiFi 连接。我一直在思考如何设置这个基础设施,我不相信没有解决方案。我脑子里的毛线球是这样的:
LAN 和 WiFi 的 NIC 具有不同的 MAC,因此 DHCP 将分配不同的 IP 地址。此外,LAN 和 WiFi 不应桥接,即理想情况下它们甚至位于不同的网段中。因此,不同的 IP 意味着不同的 DNS 名称,即不同的 keytab 条目。此外,对于远程管理ssh
访问,我需要提前知道笔记本电脑当前是有线连接还是使用 WiFi。
嗯,绝对有可能在每台笔记本电脑都有两个名称、Kerberos 主体、ssh 身份等的情况下运行此功能……但是,难道没有更方便的解决方案,更面向机器而不是 NIC 吗?
我已经考虑过 DDNS 之类的概念,但对于简单的移动自由来说,这似乎有点复杂。或者这是 RADIUS 应该解决的问题?
我很感激有关这个问题的最佳实践的提示,或者我无法通过人格分裂系统获得的经验。
答案1
因此,不同的 IP 意味着不同的 DNS 名称
或者动态更新的 DNS 名称。Windows 计算机始终会这样做 - 所有 AD 域成员都会向权威 DNS 服务器发送 RFC2136“更新”消息(这就是该ipconfig /registerdns
选项的作用),这样无论计算机在哪里,它都会有一个有效的 DNS 条目。Windows 甚至使用 Kerberos 来验证更新。
通过 ISC BIND 托管的动态可更新区域,您可以在 Linux 上获得相同的功能;您可以拥有一个网络脚本,该脚本可以nsupdate
在网络连接建立后立即运行以添加/删除 IP 地址。
nsupdate -g <<!
zone dyn.example.com
del $(hostname).dyn.example.com 0 ANY
add $(hostname).dyn.example.com 300 A ${ipv4}
add $(hostname).dyn.example.com 300 AAAA ${ipv6}
add $(hostname).dyn.example.com 300 SSHFP ${fingerprint}
send
!
(其他 DNS 服务器也实现了 RFC2136 动态更新,尽管它们中的大多数仅支持基于 PSK 的 TSIG-HMAC 身份验证 - BIND 是唯一通过 GSS-TSIG 支持 Kerberos 的服务器。)
正如评论中提到的,DHCP 服务器在收到带有“主机名”选项的 DHCP 租约请求时也可能更新 DNS(大多数主机都会发送它,大多数消费者无线路由器也会这样做)。ISC BIND+dhcpd 设置使用相同的 TSIG RFC2136 更新;其他服务器可能有自己的机制。
您还可以使用多播 DNS (mDNS) – 添加host/foo.local
为 Kerberos 主体,并让 avahi-daemon(或 systemd-resolved)向其他 LAN 主机公布自己的地址。非 Linux 系统也普遍支持 mDNS。
即不同的 keytab 条目。
可以让两个主体共享相同的密钥;例如,通过使用 LDAP 后端的 MIT Kerberos,您可以创建 LDAPalias
对象并添加多个krbPrincipalName
属性。
ldapmodify <<EOF
dn: krbPrincipalName=host/[email protected],cn=EXAMPLE.COM,cn=Kerberos,o=FooInc
add: krbCanonicalName
krbCanonicalName: host/[email protected]
-
add: krbPrincipalName
krbPrincipalName: host/[email protected]
krbPrincipalName: host/[email protected]
-
EOF
ldapadd <<EOF
dn: krbPrincipalName=host/[email protected],cn=EXAMPLE.COM,cn=Kerberos,o=FooInc
objectClass: alias
objectClass: extensibleObject
aliasedObjectName: krbPrincipalName=host/[email protected],cn=EXAMPLE.COM,cn=Kerberos,o=FooInc
EOF
(我思考Heimdal 也支持其默认 HDB 后端的别名,但 MIT Krb5 不支持。)
创建别名后,服务器只需要一个主体的密钥表条目 - 只要其他主体成功解密(如果密钥是共享的,它们就会成功解密),它就会接受为其他主体颁发的票证。不过您可能需要启用此 krb5.conf 选项才能使其工作:
[libdefaults]
ignore_acceptor_hostname = yes
如果某些 Kerberos 客户端不进行主机名规范化(例如,从 Windows 进行 SSH 时,根本不会规范化主机名),则此功能非常有用,因为它允许您在同一台机器上同时拥有host/foo.example.com
和。host/foo
LAN 和 WiFi 的 NIC 具有不同的 MAC,因此 DHCP 将分配不同的 IP 地址
只要以太网和 Wi-Fi 不在同一子网上同时使用,就可以配置相同的DHCP 客户端 ID对于两个接口,因此在两个接口上都接收相同的租约(客户端 ID 优先于物理 MAC 地址)。
但是,难道没有一种更方便、更面向机器而不是 NIC 的解决方案吗?
您可以借用企业路由中的“环回地址”理念 - 即将“管理”地址与分配给物理接口的地址分离。(在 IPX 中也称为“内部网络”,在 LISP 中也称为“EID/RLOC”等)
一种典型的方法是创建一个dummy0
接口并为其分配一个 IP 地址/32
;然后让笔记本电脑运行一个小型路由守护进程(如 babeld 或 Bird2),通过 OSPF 或 Babel 或 RIP 将其(作为存根接口)通告给其他计算机。
运行路由守护进程的设备(其他主机和/或您的 LAN 路由器)将自动知道它们可以通过任何“物理”以太网/Wi-Fi IP 地址到达“环回”IP 地址;主机将能够从 Wi-Fi 切换到以太网,甚至可以在子网之间移动,同时保留其地址和活动的 TCP 连接。
除了复杂性之外,这还有一个缺点,即大多数路由协议在 Wi-Fi 上都有点“繁琐”,这可能会影响电池寿命。(BGP 用于数据中心,让服务器以这种方式宣布其 IP 地址,虽然不太繁琐,但需要路由器来支持它,而 OSPF/Babel 可以直接在所有主机之间运行。)