我认为您的问题没有确定的正确答案。相反,有很多方法可以使您接近自己想要的东西。因此,我将提供一些提示如何完成它。
如果一台机器有两个以上的接口(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。因此,在局域网上仅对它们全部执行ping操作并不需要很长时间。从您的角度来看,这可以为您提供有关Internet大部分位置的统计提示。但是,您应该比著名的https://de.wikipedia.org/wiki/SQL_Slammer更加明智。
ICMP甚至ARP是网络边带信息的良好来源。它也可能对您有帮助。
您可以使用以太网广播地址来联系通常会有所帮助的所有网络基础设施设备,例如DHCP(甚至DHCPv6)等等。
这个额外的列表可能是无止境的,而且总是不完整的,因为每个网络设备制造商都在忙于发明如何自动检测自己的设备的新安全漏洞。这通常对如何检测不应该存在的公共接口很有帮助。
纳夫说。出来