我正在尝试在 Debian 安装中设置 winbind,以便在我们的 DNS 服务器无法工作时作为后备。我必须使用 winbind(而不是 mDNS/Avahi 等替代方案),因为我必须使用一种适用于我们现有服务器设置的方法。
Debian 安装包括:
- Virtualbox 上的 Debian squeeze 客户机(4.1.18)
- 具有 NAT 网络的 Windows XP 主机操作系统
- Debian 客户机 IP 地址 10.0.2.15
- 用于 Subversion/Bugzilla,通过 LDAP 身份验证进行域控制器
Windows 主机的 IP 地址为 192.168.1.25。
我们的 Windows 域控制器是 Server 2011 Essentials,我无法修复它出现的问题,因此我只能寻找解决方法(使用 winbind)直到问题解决。它的 IP 地址是 192.168.1.1。
我在 Debian 安装中安装了 winbind、libnss_winbind 和 libpam_winbind。我将hosts
中的行更改/etc/nsswitch.conf
为hosts: files dns wins
。如果我使用,nmblookup servername
则我得到以下输出:
querying servername on 10.0.2.255
169.254.2.33 servername<00>
192.168.1.1 servername<00>
看来服务器中有两个 NIC,一个有私有地址,另一个有我们内部网络上的地址(192... 地址)。我通过查找另一台可以检查所有 NIC 地址的计算机来验证输出所代表的内容。
我的问题是,如果我使用类似的东西ping
,那么它会使用报告的第一个地址(私有 169... 地址),这是无法访问的。这同样适用于任何其他网络代码,例如当 apache 为 Subversion 或 BugZilla 执行 LDAP 身份验证时。
有什么方法可以配置 winbind 返回的值,或者让它在返回 IP 地址之前执行状态检查以查看该 IP 地址是否可访问?我在 winbind 文档或网上没有找到任何内容。
编辑:
route -n
报告以下内容:
Desintation Gateway Genmask Flags Metric Ref Use Iface
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
我的内容/etc/network/interfaces
如下,但我目前不确定它与子网或路由设置有什么关系(即它看起来好像其中没有任何内容):
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
这是来自主机的路由表:
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x2 ...00 13 72 e0 93 4d ...... Broadcom NetXtreme 57xx Gigabit Controller - Pac
ket Scheduler Miniport
0x3 ...08 00 27 00 90 b3 ...... VirtualBox Host-Only Ethernet Adapter - Packet S
cheduler Miniport
===========================================================================
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.254 192.168.1.25 20
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.1.0 255.255.255.0 192.168.1.25 192.168.1.25 20
192.168.1.25 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.1.255 255.255.255.255 192.168.1.25 192.168.1.25 20
192.168.56.0 255.255.255.0 192.168.56.1 192.168.56.1 20
192.168.56.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.56.255 255.255.255.255 192.168.56.1 192.168.56.1 20
224.0.0.0 240.0.0.0 192.168.1.25 192.168.1.25 20
224.0.0.0 240.0.0.0 192.168.56.1 192.168.56.1 20
255.255.255.255 255.255.255.255 192.168.1.25 192.168.1.25 1
255.255.255.255 255.255.255.255 192.168.56.1 192.168.56.1 1
Default Gateway: 192.168.1.254
===========================================================================
Persistent Routes:
None
这是手动 ping 网络上的 IP 地址的结果。我的 traceroute 输出要么只显示最终目的地(如果我使用该-I
选项),要么显示所有星号。因此,使用主机上的上述路由表应该可以到达目的地。我假设 VirtualBox 客户机地址范围没有显示,因为它们由 VirtualBox 应用程序本身管理,并且不会暴露给主机。我发现 10.0.2.2 是 NAT 网络内的 VirtualBox 网关。192.168.56.1 是主机的 IP 地址
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_req=1 ttl=63 time=0.498 ms
64 bytes from 10.0.2.2: icmp_req=2 ttl=63 time=0.490 ms
64 bytes from 10.0.2.2: icmp_req=3 ttl=63 time=0.516 ms
64 bytes from 10.0.2.2: icmp_req=4 ttl=63 time=0.515 ms
--- 10.0.2.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.490/0.504/0.516/0.029 ms
PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data.
64 bytes from 192.168.56.1: icmp_req=1 ttl=128 time=0.755 ms
64 bytes from 192.168.56.1: icmp_req=2 ttl=128 time=1.04 ms
64 bytes from 192.168.56.1: icmp_req=3 ttl=128 time=0.545 ms
64 bytes from 192.168.56.1: icmp_req=4 ttl=128 time=0.606 ms
--- 192.168.56.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.545/0.738/1.047/0.194 ms
PING 192.168.1.25 (192.168.1.25) 56(84) bytes of data.
64 bytes from 192.168.1.25: icmp_req=1 ttl=128 time=0.610 ms
64 bytes from 192.168.1.25: icmp_req=2 ttl=128 time=0.639 ms
64 bytes from 192.168.1.25: icmp_req=3 ttl=128 time=0.570 ms
64 bytes from 192.168.1.25: icmp_req=4 ttl=128 time=0.659 ms
--- 192.168.1.25 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.570/0.619/0.659/0.041 ms
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=128 time=1.15 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=128 time=0.934 ms
64 bytes from 192.168.1.1: icmp_req=3 ttl=128 time=0.941 ms
64 bytes from 192.168.1.1: icmp_req=4 ttl=128 time=0.856 ms
--- 192.168.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 0.856/0.971/1.154/0.112 ms
而且 VirtualBox 肯定在使用 NAT(因为 NAT 网关在上述日志中是可访问的),并且没有使用仅主机网络。我的主机路由表中的仅主机适配器是一个干扰因素,因为我已禁用它,但仍然可以像上面一样 ping。另请参见下面的屏幕截图,其中显示了 VirtualBox 来宾网络设置:。除非存在一些错误阻止它正确使用我的配置。配置的相关部分:
<Network>
<Adapter slot="0" enabled="true" MACAddress="08002780662C" cable="true" speed="0" type="82540EM">
<DisabledModes/>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
<Forwarding name="http" proto="1" hostport="80" guestport="80"/>
<Forwarding name="https" proto="1" hostport="443" guestport="443"/>
</NAT>
</Adapter>
答案1
Debian 上的 169.254.0.0 网络是零配置网络。它在 Wikipedia 上的描述为:
零配置网络允许新手用户无需任何(零)配置即可互连网络设备,当网络上没有可用的 DHCP 和 DNS 服务器时使用它。
Zeroconf 提供:
自动分配网络地址(本地链路),通过多播 DNS 自动解析主机名,自动发现 DNS 服务器后,自动定位网络服务(即打印)。
可以在虚拟机上安全地禁用它,为此,您可以修改文件 /etc/default/avahi-daemon 以包含以下行:
AVAHI_DAEMON_DETECT_LOCAL=0
当您执行此操作时(并重新启动 avahi-daemon 服务),169... 服务器将消失。
编辑:无论如何,如果您要测试连接性,这个小脚本将会执行以下操作:
#!/bin/sh
ping -c1 TheIpWhoseConnectionYouWantToTest
if [ $? -eq 0 ]; then
Specify here the actions you wish to insert IF there is connection
fi
If you also wish to determine the Gateway automatically, you can do it as follows:
IP=$(route -n | grep UG | awk '{print $2}')
echo $IP
这将自动返回您的网关 IP
答案2
首先我想说的是,你在错误的地方寻找问题。
- 所有协议包括多播域名解析和温宾应该能够安全返回全部可用的地址。
- 然后,您的应用程序(包括
ping
)应该使用操作系统的 API 来获取地址信息记录列表。 - 最后,您的应用程序应该逐一尝试信息记录,直到成功连接(
ping
这里可能不是正确的测试工具)。
诀窍在于,尽管温宾(或任何其他插件)返回包含多个地址的列表,所有这些地址都应该是您可以联系的有效地址。否则,服务器或网络配置存在问题。但即使如此,当应用程序尝试连接时,也应该被拒绝目标主机不可达并应立即尝试列表中的下一个项目。
即使上述情况不适用,您无法修复服务器、网络配置或本地应用程序,您也不会迷失方向。操作系统名称解析 API(函数getaddrinfo()
)会根据某些标准重新排序列表。您可以通过编辑来影响该标准,/etc/gai.conf
该标准主要是为了在 IPv4 地址和各种类型的 IPv6 地址之间配置平衡而引入的。这样,当您的温宾nsswitch 插件返回一些地址,它是你谁有最终决定权来决定谁将被选中。
正如其他答案所述,169.254/16
地址空间是为 IPv4 链路本地地址保留的。操作系统通常对 IPv4 链路本地地址的支持不是很好(与 IPv6 链路本地地址相比,后者的支持要好得多)。通常的方法是避免对于具有适当 IPv4 地址的主机,IPv4 链路本地地址全部使用 IPv4 链路本地地址。
如果以上方法都不可行,那么最好通过安装中的 /etc/gai.conf 降低 IPv4 地址的优先级,甚至在 Linux 发行版中默认降低 IPv4 地址的优先级。
此外,由于你的本地系统可能没有来自子网的地址169.254/16
,你的解析器库应该能够从结果中删除这样的地址,因为它是无法到达. 也许值得考虑与发行版维护者展开讨论。
另一个解决方案是保持你的温宾单个以太网段中的机器,其中 IPv4 本地链路地址按预期工作。您必须使用网络桥接而不是 NAT 来实现虚拟化。
答案3
出于好奇,您的路由显示的默认路由是什么?类似 a: route -n 将显示系统上的默认路由。
我很好奇,是否出于某种奇怪的原因,169.254.0.0/16 子网在某个地方被设置为默认网关。也许在您的网络配置或 /etc/network/interfaces 中,您是否为“默认”接口设置了子网、网络和可能的路由。