我认为您的问题没有明确的正确答案。相反,有很多方法可以接近你想要的。因此,我将提供一些提示如何完成它。
如果一台机器有超过 2 个接口(lo
算作一个),您将无法轻松地自动检测正确的接口。这里有一些关于如何做到这一点的食谱。
例如,问题是,如果主机位于 NAT 防火墙后面的 DMZ 中,它将公共 IP 更改为某个私有 IP 并转发请求。你的机器可能有10个接口,但只有一个对应公共的。
如果您在双 NAT 上,即使自动检测也不起作用,您的防火墙甚至会将源 IP 转换为完全不同的东西。因此,您甚至无法确定默认路由是否通向您的具有公共接口的接口。
通过默认路由检测
这是我推荐的自动检测事物的方法
通常ip r get 1.1.1.1
会告诉您具有默认路由的接口。
如果你想用你最喜欢的脚本/编程语言重新创建它,请使用strace ip r get 1.1.1.1
并遵循黄砖路。
设置它/etc/hosts
如果您想保持控制,这是我的建议
/etc/hosts
您可以在like中创建一个条目
80.190.1.3 publicinterfaceip
然后你可以使用这个别名publicinterfaceip
来引用你的公共接口。
可悲的是haproxy
没有用 IPv6 理解这个技巧
使用环境
这是一个很好的解决方法/etc/hosts
,以防万一你不是root
与 相同/etc/hosts
。但为此使用环境。您可以尝试/etc/profile
或~/.profile
为此。
因此,如果您的程序需要一个变量MYPUBLICIP
,那么您可以包含如下代码(这是 C,请随意从中创建 C++):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
/path/to/your/script
所以你可以像这样调用你的脚本/程序
MYPUBLICIP=80.190.1.3 /path/to/your/script
这甚至适用于crontab
.
枚举所有接口并消除那些你不想要的
如果你不能使用的绝望方式ip
如果您确实知道您不想要什么,您可以枚举所有接口并忽略所有错误的接口。
对于这种方法,这似乎已经是一个答案https://stackoverflow.com/a/265978/490291 。
像 DLNA 一样做
醉汉试图在酒精中淹死自己的方式
您可以尝试枚举网络上的所有 UPnP 网关,这样可以为某些“外部”事物找到正确的路由。这甚至可能在您的默认路由未指向的路由上。
有关这方面的更多信息,请参阅https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
即使您的默认路由指向其他地方,这也会给您留下一个好印象,哪个是您真正的公共接口。
还有更多
山与先知相遇的地方
IPv6 路由器会宣传自己,为您提供正确的 IPv6 前缀。查看前缀可以提示您它是否具有一些内部 IP 或全局 IP。
您可以侦听 IGMP 或 IBGP 帧以找出一些合适的网关。
IP 地址少于 2^32 个。因此,在 LAN 上 ping 它们并不需要很长时间。从您的角度来看,这为您提供了有关 Internet 大部分位置的统计提示。但是,您应该比著名的https://de.wikipedia.org/wiki/SQL_Slammer更明智一些
ICMP 甚至 ARP 都是很好的网络边带信息来源。它也可能对您有所帮助。
您可以使用以太网广播地址联系您的所有网络基础设施设备,这通常会有所帮助,例如 DHCP(甚至 DHCPv6)等。
这个额外的列表可能是无穷无尽的,而且总是不完整的,因为每个网络设备制造商都在忙于发明如何自动检测他们自己的设备的新安全漏洞。这通常有助于如何检测一些不应该存在的公共接口。
'纳夫说。出去。