Linux - 不配IP地址可以ping通一台机器吗?
2021年03月21日 14:03:31 [原创]
Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,Nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术,Epoll 很重要,但是 Epoll 与 Select 的区别是什么呢?Epoll 高效的原因是什么? 本文将一探究竟。
正常我们ping通一台机器需要先知道其IP地址,但是如果我们不给这台机器分配IP地址能ping通吗?
那我先告诉你,答案是肯定的,你只需要知道一点,机器互相能否互通,一切皆看路由,至于IP地址只是为了区分不同机器的一个标识,它不决定机器之间是否可以互通。
我们先简单来做个实验来验证它:
有2台同网段机器,A,B
在A上执行:
ip route add local 1.1.1.1/32 dev eth0
ip route add 2.2.2.2/32 dev eth0 scope link
上述配置简述:
ip route add local 1.1.1.1/32 dev eth0,代表添加了一条local路由,把1.1.1.1的ip地址作为本机地址来处理。
/* Linux判断一个ip是否是本机的就是查询local路由条目来判断的,正常网卡上配置ip后内核都会自动添加local路由条目。
ip route add 2.2.2.2/32 dev eth0 scope link,代表去往2.2.2.2的ip地址通过2层处理,就是直接走链路层通过arp协议拿到mac地址去访问,而不走3层网关进行转发。
/* Linux判断目标ip是否直接通过2层处理,主要是根据scope标识来确定的,link就代表通过2层处理,比如网卡配置ip后,内核会自动添加一条到同网段的scope link路由条目。
在B上执行
ip route add local 2.2.2.2/32 dev eth0
ip route add 1.1.1.1/32 dev eth0 scope link
然后我们在A上ping 2.2.2.2 后看下结果,

OK,我们看到可以直接ping通了。
通过这个小实验我们需要了解的是,Linux机器是否互通核心取决于路由配置,所以掌握内核路由相关知识是核心。
实际应用:
比如透明代理的实现中,这个知识点就是很重要的一部分,因为透明代理中代理往后端发送请求的时候需要调用setsockopt开启IP_TRANSPARENT选项后,把sourceip从本机地址设置为客户端ip,从而实现透明转发的效果,后端回复的包代理通过配置local路由,把接收到的包(目标ip是客户端地址,正常不会处理因为是非本机的地址)作为本机地址来处理,处理后再发送给客户端,从而实现完整的请求过程。
路由常用输出详解:
SCOPE 作用域
- host:表示的目的地址为本地主机
- link:2层作用域,目前地址和该机是同2层/同网段
- globa:全局作用域,所有远程非直连目的地
- NUMBER:它代表了一个数字值,这允许系统管理员或开发者定义定制化路由的行为
RTPROTO 协议类型
- kernel:表示该路由是由内核自动配置的,通常是在网络接口配置时由内核根据接口的配置自动生成的路由
- static:指明路由是静态配置的,由系统管理员手动添加,用于覆盖动态路由或确保特定路径的稳定性
- dhcp:表示路由信息是通过DHCP(动态主机配置协议)服务自动获取的,常见于动态IP地址分配的场景
- redirect:这类路由是由于ICMP重定向消息而生成的,当路由器建议主机更改下一跳时发生
- boo: 指在系统启动过程中配置的路由,这些路由可能在路由守护进程启动前存在,但通常会被更专业的路由配置覆盖
- ra:短语“ra”代表“Router Advertisement”,意味着路由是通过IPv6的路由器发现协议自动安装的
- NUMBER: 它代表了一个数字值,这允许系统管理员或开发者定义自己的路由协议标识符