网络子系统18_arp对代理的处理

简介:
//	代理使用的特性:
//		medium-id  当ARP请求的目的地址非本机地址时,处理ip子网横跨不同的lan,且该子网中提供arp请求的主机有多快nic,设置这些nic是否在同一lan

//	arp代理处理的特点:
//		1.本机arp请求的优先级高于对代理主机的arp请求

//	延迟处理的实现:
//		1.通过tbl->proxy_queue入队对代理地址的arp,通过param->proxy_delay指定封包在代理队列中应该待的时间

//	arp代理处理
//	函数主要功能:
//		1. 设备需要开启转发功能
//		2. 目的ip地址应该为单播类型
//		3. 发送arp请求的主机与被代理的主机使用不同的接口设备连接
//		4. 已经开启全局代理或设备代理,并且入口lan与出口lan不同
//		5. 如果arp没有被延迟处理,则延迟处理,否则应答	
1.1 static int arp_process(struct sk_buff *skb)
{
	...

		//请求地址非本机ip,存在到目的地的路由
		} else if (IN_DEV_FORWARD(in_dev)) {//输入接口具有转发功能
			if ((rt->rt_flags&RTCF_DNAT) ||//此路由项执行目的地网络地址转换
			    (addr_type == RTN_UNICAST  && rt->u.dst.dev != dev &&//或目的ip地址为单播类型,并且出口设备不是入口设备
			     (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &tip, dev, 0)))) {//设备可以处理代理,或者代理过的地址数据库中有目的地址
				n = neigh_event_ns(&arp_tbl, sha, &sip, dev);//创建发送ip对应的neighbour结构,被动学习
				if (n)
					neigh_release(n);

				if (skb->stamp.tv_sec == LOCALLY_ENQUEUED || //检测此skb是从延时队列中出队的
				    skb->pkt_type == PACKET_HOST ||//或者配置了延时处理,目标主机为本机
				    in_dev->arp_parms->proxy_delay == 0) {//入口设备配置不适用延时
					arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);//应答arp
				} else {
					pneigh_enqueue(&arp_tbl, in_dev->arp_parms, skb);//否则将此arp入队,延时处理
					in_dev_put(in_dev);
					return 0;
				}
				goto out;
			}
		}
	}

	...
	//此skb为邻居可达的证据,更新邻居状态
	...

out:
	if (in_dev)
		in_dev_put(in_dev);
	kfree_skb(skb);
	return 0;
}




//	判断是否可以对此主机进行代理
//		1.开启全局代理或设备代理
//		2.被代理主机与请求主机应该在不同的lan
2.1 static inline int arp_fwd_proxy(struct in_device *in_dev, struct rtable *rt)
{
	struct in_device *out_dev;
	int imi, omi = -1;
	//是否开启设备代理,或者全局代理
	if (!IN_DEV_PROXY_ARP(in_dev))
		return 0;
	//一台主机,给连接在同一个lan的多个nic设置相同的medium-id,告诉协议这些nic是否在同一的lan上
	if ((imi = IN_DEV_MEDIUM_ID(in_dev)) == 0)//medium-id特性被关闭
		return 1;
	if (imi == -1)//arp代理已关闭
		return 0;

	if ((out_dev = in_dev_get(rt->u.dst.dev)) != NULL) {
		omi = IN_DEV_MEDIUM_ID(out_dev);
		in_dev_put(out_dev);
	}
	return (omi != imi && omi != -1);//出口设备的medium-id不等于出口设备的medium-id时,才可以代理此请求,表示两块nic在不用的lan
}

目录
相关文章
|
6月前
|
缓存 网络协议 网络架构
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
113 1
|
4月前
|
缓存 数据安全/隐私保护 Kotlin
Kotlin 中的网络请求代理设置最佳实践
Kotlin 中的网络请求代理设置最佳实践
|
20天前
|
存储 缓存 网络协议
|
1天前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
2月前
|
缓存 网络协议 网络架构
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
本文详细介绍了如何使用网络抓包工具Wireshark进行网络抓包分析,包括以太网v2 MAC帧、IP数据报、ICMP报文和ARP报文的格式,以及不同网络通信的过程。文章通过抓包分析展示了IP数据报、ICMP数据报和ARP数据报的具体信息,包括MAC地址、IP地址、ICMP类型和代码、以及ARP的硬件类型、协议类型、操作类型等。通过这些分析,可以更好地理解网络协议的工作机制和数据传输过程。
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
|
3月前
|
缓存 负载均衡 应用服务中间件
Nginx 代理管理器强势登场!轻松设置反向代理,为你的网络安全与高效护航,快来探索!
【8月更文挑战第23天】Nginx 代理管理器(NPM)是一款强大的工具,用于简化反向代理的设置流程。反向代理能隐藏后端服务器的真实IP,提升安全性,实现负载均衡与缓存等功能。用户需先安装Nginx 代理管理器,然后通过其Web界面添加代理主机,指定代理名称、协议类型、服务器地址及端口等信息。对于HTTPS协议,还需上传SSL证书/密钥。完成设置后,可通过浏览器测试反向代理是否正常工作。Nginx 代理管理器还支持高级特性,如负载均衡、缓存及访问控制等。
93 1
|
3月前
|
缓存 负载均衡 应用服务中间件
【揭秘】nginx代理配置全攻略:从零到精通,一文带你玩转高效网络代理的秘密武器!
【8月更文挑战第22天】nginx是一款高性能的HTTP与反向代理服务器,支持代理服务、负载均衡及缓存等功能,有助于提升网站响应速度和安全性。首先需确保已安装nginx,可通过包管理器进行安装。安装后启动并确认nginx运行状态。接着编辑配置文件(通常位于`/etc/nginx/nginx.conf`),设置代理转发规则,例如指定目标服务器地址和请求头信息。配置完成后测试有效性并重新加载nginx以应用更改。可以通过部署简易HTTP服务器验证代理功能是否正常工作。此外,还可以通过扩展配置文件实现更复杂的代理需求,如基于路径的代理和SSL加密等。
454 2
|
3月前
|
缓存 负载均衡 网络协议
Haskell网络编程:深入理解代理和TLS配置
Haskell网络编程:深入理解代理和TLS配置
|
4月前
|
人工智能 缓存 网络协议
网络层之三层交换、icmp协议、arp协议
网络层之三层交换、icmp协议、arp协议
|
5月前
|
数据采集 Java 数据安全/隐私保护
使用Java进行网络采集:代理IP与参数传递详解
Java参数传递是按值传递,包括对象引用的值。当传递对象时,方法内部修改对象内容会影响原始对象,但不能改变原始引用。示例展示了如何在爬虫代理中使用此机制,通过`ProxySettings`类传递代理信息,方法内可访问但不能更改原始对象。理解这一机制对编写高效无错的Java代码至关重要。
使用Java进行网络采集:代理IP与参数传递详解