我知道我可以将主机名与我的 IP 地址关联起来/etc/hosts
:
1.2.3.4 foo
然后,例如在tcpdump
输出中,我将看到foo
而不是我的 IP 地址(如果-n
未使用)
无论如何,我可以暂时IP -> hostname
在命令行上添加这样的映射,而不实际编辑文件吗?
假设我连接到 wifi,并获得一些随机 IP。我希望在 tcpdump 中将此 IP 解析为我的主机名本届会议(无需将条目永久添加到/etc/hosts
.
更新:
如果我的问题和标题不清楚,我正在寻找一种解决方案,如何在不修改/etc/hosts
.
就像我可以使用命令hostname
设置当前会话的主机名(即直到下次重新启动)而无需编辑一样/etc/hostname
,我正在寻找为当前会话设置反向查找(即直到下次重新启动)而无需修改/etc/hosts
。
答案1
C 库的主机名解析服务(几乎所有需要主机名解析的软件都使用该服务)主要由文件hosts:
中的行控制/etc/nsswitch.conf
。该行上的每个关键字都会导致libnss_*.so
加载相应的库,这些库最终将处理来自应用程序的主机名解析请求。
如果您的发行版包含一个名为 的软件包nss-myhostname
(或任何其他提供libnss_myhostname.so.*
库的软件包),那么您可以安装该软件包,添加myhostname
到hosts:
行nsswitch.conf
,然后该库将自动将本地配置的系统主机名与任何和所有 IP 地址相关联配置到系统上的网络接口。使用此配置,您不需要运行任何命令来更新关联:这一切都会自动发生。如果您的系统上根本没有配置 IP 地址,它还会将您的本地主机名与 IP 地址 127.0.0.2(和 IPv6 地址 ::1)关联起来。
如果hosts:
您的行nsswitch.conf
包含关键字resolve
或您的/etc/resolv.conf
行有一行nameserver 127.0.0.53
,那么您正在使用systemd-resolved
您的 DNS 解析器。它可以为您的本地主机名与任何本地配置的 IP 地址提供类似的自动关联libnss_myhostname
(见上文)。如果您遇到这种情况,请参阅man systemd-resolved
并阅读标题为 的章节SYNTHETIC RECORDS
。它还将包括可选的 mDNS(见下文)和 LLMNR(链路本地多播名称解析器/响应器)功能,这也可能以迂回方式提供本地主机名解析。
如果hosts:
您的线路nsswitch.conf
包含可以使用多播 DNS (mDNS) 的主机名解析服务,例如mdns4_minimal
和您的系统包含一个 mDNS 响应器(例如avahi-daemon
),它可能能够自动解析<hostname>.local
本地系统的 IP 地址,反之亦然。
如果hosts:
您的行nsswitch.conf
包含任何其他选项(或者您的发行版提供其他libnss_*.so
库),您将必须自行研究它们提供的功能,因为您没有指定您的发行版。
如果hosts:
你的行nsswitch.conf
只包含经典files
和dns
关键词,或者您需要为当前未配置到任何本地网络接口的 IP 地址分配名称(例如其他主机的 IP 地址的名称),然后参见中的方法马库斯·穆勒的回答。
如果这些答案都不适合您,那么恐怕答案将是“不,没有您要求的功能。但是如果您有编程技能,那么没有什么可以阻止您自己实现它“ - 上面和 Marcus Müller 的答案中的可能方法列表应该为您提供有关可用于插入您自己的解决方案的接口的想法。
答案2
所以,tcpdump在这里所做的就是触发反向查找;你说它通常似乎能够尊重 /etc/hosts 条目,这表明它使用 libc 的getnameinfo
函数来实现这一点。正如人们所期望的那样。
因此,这意味着您需要修改运行时环境的一个相当核心的部分的行为;在我看来,/etc/hosts 确实不是最具侵入性的方式!
现在,认真对待您的“仅限本次会议”:您需要定义会议的含义:
- 如果“会话”意味着您当前运行的
tcpdump
(或从一个 shell 启动的所有进程),您可以使用LD_PRELOAD
加载您自己的小库,该库只是getnameinfo
用您自己的版本替换该函数,实际上只是将所有参数传递给原始函数,但只有在将所请求的地址与您想要伪造姓名的地址进行检查之后;无论您是从文件、环境变量还是活动连接中读取该地址,都由您决定 - 如果“会话”意味着“活动网络连接”,只需告诉网络管理器不要使用网络自动配置(DHCP)建议使用的解析器,而是使用本地运行的您自己的解析器,并使用 post-bringup 和 -bringdown 触发的 systemd 单元文件添加/删除该解析器中的条目。这将影响所有用户。
- 如果“会话”意味着您想要运行许多程序:使用脚本,将原始 /etc/hosts 复制到新文件,添加所需的行。然后,创建一个安装命名空间,在其中使用修改后的文件。就像是
#!/bin/bash
modified_hosts=$(mktemp XXXXXXX.etchosts)
cp /etc/hosts "${modified_hosts}"
echo "$1 ownhost" >> "${modified_hosts}"
method="unshare"
#method="container"
if [[ ${method} = "unshare" ]]
then
unshare --mount --map-root-user \
bash --rcfile \
<(echo . ~/.bashrc; \
mount --bind --make-private "${modified_hosts}" /etc/hosts; \
echo "You're now in a mount space of your own, /etc/hosts has been modified."\
)
else
container_image="fedora:36"
podman run -it --rm -v "${modified_hosts}:/etc/hosts:Z" "${container_image}"
fi