记录一个设备旁挂ikuai后收不到回包TTL为1的问题

如上图所示,在ikuai上旁挂一个路由器,然后在ikuai上做策略路由,将源地址为192.168.1.1的数据下一跳指向192.168.2.2,然后在 192.168.2.2上默认路由下一跳为192.168.3.1,目的为192.168.1.1的路由下一跳为192.168.2.1,在192.168.3.2接口上做了NAT,按照正常情况下192.168.1.1访问公网数据会绕道右边的路由器一圈再送给ikuai,然后回包也是按照原路返回,但是结果发现数据回包在右边的路由器192.168.3.2接口上收到包后就没有往ikuai上送了,通过抓包发现是TTL变为1了所以不会再往下转,那么为什么TTL会变为1呢,也没有环路!最后经检查为在ikuai上设置了一个参数,禁止二级路由,最后通过关闭该功能恢复正常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C 语言程序,可以一直 ping 一个 IP 地址,如果 ping 不通则返回 1: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip_icmp.h> #include <netdb.h> #define PACKET_SIZE 4096 #define MAX_WAIT_TIME 5 #define MAX_NO_PACKETS 3 struct packet { struct icmphdr hdr; char msg[PACKET_SIZE-sizeof(struct icmphdr)]; }; unsigned short checksum(void *b, int len) { unsigned short *buf = (unsigned short *)b; unsigned int sum = 0; unsigned short result; for (sum = 0; len > 1; len -= 2) sum += *buf++; if (len == 1) sum += *(unsigned char*)buf; sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); result = ~sum; return result; } int ping(char *host) { struct hostent *hname; struct sockaddr_in addr_ping; int sockfd, i, len, flag = 1, flag_recv = 1; struct packet pkt; struct timeval tv_begin, tv_end, tv_interval; float rtt = 0; memset(&addr_ping, 0, sizeof(addr_ping)); addr_ping.sin_family = AF_INET; if ((hname = gethostbyname(host)) == NULL) { printf("Unknown host %s\n", host); return 1; } memcpy(&addr_ping.sin_addr, hname->h_addr, sizeof(addr_ping.sin_addr)); printf("PING %s (%s): %d bytes data in ICMP packets.\n", hname->h_name, inet_ntoa(addr_ping.sin_addr), (int)sizeof(struct packet)); if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) { printf("socket error\n"); return 1; } while (flag) { flag_recv = 1; memset(&pkt, 0, sizeof(pkt)); pkt.hdr.type = ICMP_ECHO; pkt.hdr.code = 0; pkt.hdr.checksum = checksum(&pkt, sizeof(pkt)); if (sendto(sockfd, &pkt, sizeof(pkt), 0, (struct sockaddr *)&addr_ping, sizeof(addr_ping)) < 0) { printf("sendto error\n"); continue; } gettimeofday(&tv_begin, NULL); len = sizeof(addr_ping); if (recvfrom(sockfd, &pkt, sizeof(pkt), 0, (struct sockaddr *)&addr_ping, (socklen_t *)&len) < 0) { printf("recvfrom error\n"); flag_recv = 0; } else { gettimeofday(&tv_end, NULL); tv_interval.tv_sec = tv_end.tv_sec - tv_begin.tv_sec; tv_interval.tv_usec = tv_end.tv_usec - tv_begin.tv_usec; rtt = tv_interval.tv_sec * 1000.0 + tv_interval.tv_usec / 1000.0; printf("%d bytes from %s: icmp_seq=%u ttl=%d time=%.1f ms\n", sizeof(pkt), inet_ntoa(addr_ping.sin_addr), pkt.hdr.un.echo.sequence, pkt.hdr.un.echo.sequence, rtt); flag_recv = 1; } sleep(1); if (!flag_recv) { flag = 0; printf("ping %s fail\n", host); close(sockfd); return 1; } if (i >= MAX_NO_PACKETS) { flag = 0; } } close(sockfd); return 0; } int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s <hostname>\n", argv[0]); return 1; } return ping(argv[1]); } ``` 注意:该程序需要在 Linux 环境下运行,并且需要 root 权限才能发送 ICMP 包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值