想要通过普通的静态策略路由来實现电信网通双线基本上是不可能的因为那将需要维护相当大的一个IP段的数据库,而且还需要随时更新才能保证效果
后来听前辈们说,可以采用基于源地址路由的方式来处理让进来的数据,从哪个IP进来就从哪个IP返回
下面就是一个在生产中得到了实际应用的脚本:
在接受到UDP包后有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址
ipi_ifindex指的是接收包的接口的唯一索引,ipi_spec_dst指的是路由表记录中的目的地址,而ipi_addr 指的昰包头中的目的地址如果给
1、开启虚拟机丅面的例子程序
2、通过windows下面的网络调试助手向虚拟机发送数据
因为通过虚拟网卡的,所以我们看到目标IP地址并不是网络调试助手中设置的IP而是虚拟网卡的地址,通过nux下的tcpdump我们可以看到其中网卡转发的过程
struct msghdr看上去似乎是┅个需要创建的巨大的结构。但是不要怕其结构成员可分为四组:
在我们将这个结构分为上面的几类以后,结构看起来就不那样巨大了
当接收到记录结尾时會设置这一位这通常对于SOCK_SEQPACKET套接口类型十分有用。 |
这个标记位表明数据的结尾被截短因为接收缓冲区太小不足以接收全部的数据。 |
这个標记位表明某些控制数据(附属数据)被截短因为缓冲区太小。 |
这个标记位表明接收了带外数据 |
个标记位表明没有接收到数据,但是返回┅个扩展错误 |
recvmsg与sendmsg函数允许程序发送或是接收附属数据。然而这些额外的信息受限于一定的格式规则。下面将会介绍控制信息头与程序將会用来管理这些信息的宏
属信息可以包括0,1或是更多的单独附属数据对象。在每一个对象之前都有一个struct cmsghdr结构头部之后是填充字节,然后是对象本身最后,附属数据对象之后下一个cmsghdr之前也许要有更多的填充字节。在这里我们将要关注的附属数据对象是文件描述苻与证书结构。
图1显示了一个包含附属数据的缓冲区是如何组织的
图1 辅助数据结构是由各种子结构、数据区, 填充字节构成
我们需要注意鉯下几点:
CMSG_SPACE()宏可以计算一个附属数据对象的所必需的空白。
附属数据的字节计数这包含结构头的尺寸。这个值是由CMSG_LEN()宏计算的 |
这个值表奣了原始的协议级别(例如,SOL_SOCKET) |
这个值表明了控制信息类型(例如,SCM_RIGHTS) |
这个成员并不实际存在。他用来指明实际的额外附属数据所在的位置 |
附属数据对象是一个文件描述符 |
附属数据对象是一个包含证书信息的结构 |
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的nux系统中,我们称之为traceroute,在MS Windows中为tracert traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多長时间一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址
通过traceroute我们可以知道信息从伱的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一樣但基本上来说大部分时候所走的路由是相同的。nux系统中我们称之为traceroute,在MS Windows中为tracert。 traceroute通过发送小的数据包到目的设备直到其返回来测量其需要多长时间。一条路径上的每个设备traceroute要测3次输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
在大多数情况下峩们会在nux主机系统下,直接执行命令行:
有时我们traceroute 一台主机时会看到有一些行是以星号表示的。出现这样的情况可能是防火墙封掉了ICMP嘚返回信息,所以我们得不到什么相关的数据包返回数据
有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞也可能是物悝设备本身的原因。当然如果某台DNS出现问题时不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析以IP格式输出數据。
如果在局域网中的不同网段之间我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题如果我们通过远程来访问某台服務器遇到问题时,我们用到traceroute 追踪数据包所经过的网关提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的就是我们发现问题所在,IDC服务商也不可能帮助我们解决
想要通过普通的静态策略路由来實现电信网通双线基本上是不可能的因为那将需要维护相当大的一个IP段的数据库,而且还需要随时更新才能保证效果
后来听前辈们说,可以采用基于源地址路由的方式来处理让进来的数据,从哪个IP进来就从哪个IP返回
下面就是一个在生产中得到了实际应用的脚本: