我知道您可以添加主机名,/etc/hosts
这样解析它们实际上并不执行 DNS 查找。这将是一行,例如
123.45.67.89 myhostname
我的问题是,我可以将第一部分(IP 地址)设置为多少,以便任何尝试连接到此部分的操作myhostname
都将始终失败?
编辑:我所说的失败是指如果可能的话,明确的 ICMP 拒绝。我不想等待超时。
原因
有时我有一个虚拟机实例在某处运行。云服务器在每次启动时都会设置不同的IP,并且我不支付任何公共域名的费用。我有一个启动实例并添加一行的脚本,/etc/hosts
以便我可以使用 轻松 ssh 或打开到该主机的浏览器选项卡myhostname
。
这一切都很好,但我也想消除当实例被终止并尝试连接时此条目myhostname
不是进行任何 DNS 查找,或者(更糟糕)尝试连接到我目前所在的任何本地域上的某个同名主机。
答案1
因此,您需要一个 IP 地址,a) 保证不与任何远程内容匹配,b) 拒绝所有内容。
做一个:
iptables -I INPUT 1 -i lo -d 127.66.66.66 -p tcp -j REJECT --reject-with tcp-reset
iptables -I INPUT 2 -i lo -d 127.66.66.66 -j REJECT
(或者您选择的 iptables 防火墙管理工具的等效工具。)
现在,所有到 127.66.66.66 的 TCP 连接都会收到 TCP RST 数据包作为响应,而其他所有连接都会收到 ICMP 拒绝。 (根据我的经验,TCP RST 通常会比 ICMP 更快地拒绝 TCP 连接。)
IP地址127.66.66.66在环回段内,因此保证不会干扰任何非本地的东西。
答案2
我找不到强制hosts
“未找到”响应的方法,我认为您需要拥有自己的 DNS 服务器。但你还可以做一些其他的事情...
使用 IP 地址
127.0.0.1
(或 中的任何内容127/8
)使名称指向您的本地主机。对于您未运行的服务,您的系统会回复 TCP 重置或错误或丢弃数据包,但如果您在本地运行 SSH,则它不会很好地工作。使用任何私人使用地址,例如
10/8
.根据您的配置,您的系统可能会尝试向它们发送数据包,但您的 ISP 应在数据包到达很远之前将其丢弃。或者您可以让防火墙在它们离开您的计算机之前拒绝它们。使用实际上是无效地址的地址。
0.0.0.1
(或0/8
except中的任何内容0.0.0.0
)似乎在 Linux 和 Windows 中的连接上产生错误。0.0.0.0
例如,DHCP 客户端在知道自己的地址之前就使用它们,并且似乎直接指向 Linux 上的本地主机。 (整个块实际上被保留来表示“该网络上的该主机”。)
当然,所有这些基本上都是谎言,并不是最干净的解决方案。