当前位置: 首页 > 工具软件 > Pluto > 使用案例 >

pluto中监听各个网口的500端口处理逻辑

赵高雅
2023-12-01

1. pluto中监听各个网口的500端口处理逻辑

  • whack_handle()

    • find_ifaces()

      • find_raw_ifaces4()

        • socket、setsockopt、bind、ioctl、

        • 通过ioctl(master_sock, SIOCGIFCONF, &ifconf)获取到所有的网络配置信息(网口名称和IP地址)

        • 通过ioctl(master_sock, SIOCGIFFLAGS, &auxinfo)获取网卡是否处于UP状态

        • 构建UP状态的<网口名,IP地址>链表,并返回此链表

        • 在获取网口IP时,只能获取到该网口下的IP地址信息:

          '''c
          
          struct raw_iface {
              ip_address addr; 			/*这里可以看出只能获取一个IP地址*/
              char name[IFNAMSIZ + 20];	/* what would be a safe size? */
              struct raw_iface *next;
          };
          
          '''
          
      • find_raw_ifaces6()

        • 通过/proc/net/if_inet6文件来获取IPv6的网络接口
        • 获取网络接口IP并返回链表
      • process_raw_ifaces()

        • ipesc开始的接口直接跳过, 也就是说如果添加tunnel接口,这里需要确认下

        • mast开始的接口直接跳过

        • 遍历所有的接口,确保没有配置相同的接口IP地址

        • 创建监听的套接字(绑定500和4500端口

        • 接口采用的数据结构:

          struct iface {
              char *vname;	/* virtual (ipsec) device name */
              char *rname;	/* real device name */
              ip_address addr;	/* interface IP address */
              u_int16_t  port;    /* host byte order */
              int fd;	/* file descriptor of socket for IKE UDP messages */
              struct iface *next;
          #ifdef NAT_TRAVERSAL
              bool ike_float;
          #endif
              enum { IFN_ADD, IFN_KEEP, IFN_DELETE } change;
          };
          
    • 全局变量:interfaces通过上述流程后便构造成功,且获取到了接口的所有IP地址,然后通过链表连接起来

 类似资料: