linux网络route

 

一、网络基础知识:

设备端获取的IP路由表

[root@HKVS /] # route –n

Kernel IP routing table

Destination     Gateway        Genmask     Flags  Metric  Ref    Use Iface

default         192.168.1.1     0.0.0.0         UG    0      0        0 apcli0

default         192.168.2.254   0.0.0.0         UG    0      0        0 ra0

10.8.164.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 apcli0

192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 ra0

1        route命令参数

 [root@linux ~]# route [-nee]
[root@linux ~]# route add [-net|-host] [网域或主机] netmask [mask] [gw|dev]
[root@linux ~]# route del [-net|-host] [网域或主机] netmask [mask] [gw|dev]
观察的参数:
   -n  :不要使用通讯协定或主机名称,直接使用 IP 或 port number;
   -ee :使用更详细的资讯来显示
增加 (add) 与删除 (del) 路由的相关参数:
   -net    :表示后面接的路由为一个网域;
   -host   :表示后面接的为连接到单部主机的路由;
   netmask :与网域有关,可以设定 netmask 决定网域的大小;
   gw      :gateway 的简写,后续接的是 IP 的数值喔,与 dev 不同;
   dev     :如果只是要指定由那一块网路卡连线出去,则使用这个设定,后面接 eth0 等

 

格式:route -n
格式:/sbin/route -n
用于打印路由表,加上-n参数就是在输出的信息中不打印主机名而直接打印ip地址。

2     实例

实例1:显示当前路由

命令:

route

route -n

实例2:添加网关/设置网关

命令:route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

实例3:屏蔽一条路由

命令:route add -net 224.0.0.0 netmask 240.0.0.0 reject

实例4:删除路由记录

命令:

route del -net 224.0.0.0 netmask 240.0.0.0

route del -net 224.0.0.0 netmask 240.0.0.0 reject

实例5:删除和添加设置默认网关

命令:

route del default gw 192.168.120.240

route add default gw 192.168.120.240

3        相关结构体和定义

struct rtentry

{

        unsigned long   rt_pad1;

        struct sockaddr rt_dst;        

        struct sockaddr rt_gateway;    

        struct sockaddr rt_genmask;    

        unsigned short  rt_flags;

        short           rt_pad2;

        unsigned long   rt_pad3;

        void            *rt_pad4;

        short           rt_metric;     

        char            *rt_dev;       

        unsigned long   rt_mtu;        

#ifndef __KERNEL__

#define rt_mss  rt_mtu                 

#endif

        unsigned long   rt_window;     

        unsigned short  rt_irtt;       

};

#define RTF_UP          0x0001         

#define RTF_GATEWAY     0x0002         

#define RTF_HOST        0x0004         

#define RTF_REINSTATE   0x0008         

#define RTF_DYNAMIC     0x0010         

#define RTF_MODIFIED    0x0020         

#define RTF_MTU         0x0040         

#define RTF_MSS         RTF_MTU        

#define RTF_WINDOW      0x0080         

#define RTF_IRTT        0x0100         

#define RTF_REJECT      0x0200

 

4        对底层内核的控制

int ioctl( int fd, int request, .../* void *arg */ ) 详解

第三个参数总是一个指针,但指针的类型依赖于request 参数。我们可以把和网络相关的请求划分为6 类:

套接口操作

文件操作

接口操作

ARP 高速缓存操作

路由表操作

流系统

下表列出了网络相关ioctl请求的request 参数以及arg 地址必须指向的数据类型:

                                                                                                                                                         
   

类别

   
   

Request

   
   

说明

   
   

数据类型

   
   

   

   

   
   

SIOCATMARK

   

SIOCSPGRP

   

SIOCGPGRP

   
   

是否位于带外标记

   

设置套接口的进程ID 或进程组ID

   

获取套接口的进程ID 或进程组ID

   
   

int

   

int

   

int

   
   

   

   
   

FIONBIO

   

FIOASYNC

   

FIONREAD

   

FIOSETOWN

   

FIOGETOWN

   
   

设置/ 清除非阻塞I/O 标志

   

设置/ 清除信号驱动异步I/O 标志

   

获取接收缓存区中的字节数

   

设置文件的进程ID 或进程组ID

   

获取文件的进程ID 或进程组ID

   
   

int

   

int

   

int

   

int

   

int

   
   

   

   
   

SIOCGIFCONF

   

SIOCSIFADDR

   

SIOCGIFADDR

   

SIOCSIFFLAGS

   

SIOCGIFFLAGS

   

SIOCSIFDSTADDR

   

SIOCGIFDSTADDR

   

SIOCGIFBRDADDR

   

SIOCSIFBRDADDR

   

SIOCGIFNETMASK

   

SIOCSIFNETMASK

   

SIOCGIFMETRIC

   

SIOCSIFMETRIC

   

SIOCGIFMTU

   

SIOCxxx

   
   

获取所有接口的清单

   

设置接口地址

   

获取接口地址

   

设置接口标志

   

获取接口标志

   

设置点到点地址

   

获取点到点地址

   

获取广播地址

   

设置广播地址

   

获取子网掩码

   

设置子网掩码

   

获取接口的测度

   

设置接口的测度

   

获取接口MTU

   

(还有很多取决于系统的实现)

   
   

struct ifconf

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   

struct ifreq

   
   

ARP

   
   

SIOCSARP

   

SIOCGARP

   

SIOCDARP

   
   

创建/ 修改ARP 表项

   

获取ARP 表项

   

删除ARP 表项

   
   

struct arpreq

   

struct arpreq

   

struct arpreq

   
   

   

   
   

SIOCADDRT

   

SIOCDELRT

   
   

增加路径

   

删除路径

   
   

struct rtentry

   

struct rtentry

   
   

   
   

I_xxx

   
   

 

对于路由操作来说,完成ioctl的函数就是

int ip_rt_ioctl(unsigned int cmd, void *arg),这个函数会根据传入的cmd是SIOCADDRT,还是SIOCDELRT,来决定是创建一个路由表项,还是删除一个路由表项。

 

posted @ 2017-08-05 14:14  _小百  阅读(2111)  评论(0编辑  收藏  举报