FreeBSD下查询路由

FreeBSD小版本升级实战:freebsd-update原理与零停机回滚 FreeBSD小版本升级是系统运维中高频、低风险但高价值的基础操作,其核心在于二进制补丁分发机制与引导环境隔离设计。freebsd-update并非简单文件覆盖,而是基于元数据校验、指纹比对和双根目录切换的原子化升级工具,天然支持GPG签名验证、增量下载与秒级回滚。它与make buildworld的本质区别在于:前者保障官方二进制一致性与生产环境可预测性,后者侧重源码定制灵活性。在ZFS、Postfix、Dovecot等典型服务场景中,该方案可实现90秒内服务中断控制,并通过beadm实现真正零停机切换。 阅读详情

我们的程序参数中有一个需要查询路由ipv4的地址,程序把ipv4地址使用RTM_GET发送到系统内核,内核在路由表中查询这个ipv4地址的路由信息,然后把路由信息返回。
例如:
freebsd % reqroute 206.168.112.219
dest: 0.0.0.0
gateway: 12.106.32.1
netmask: 0.0.0.0
可以运行在freebsd上,也可以运行在macos10.4/5/6上。

#include <stdio.h>
#include <stdlib.h>
#include <net/route.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <net/if_dl.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <string.h>

#define BUFLEN   (sizeof(struct rt_msghdr) + 512)
                      /* sizeof(struct sockaddr_in6) * 8 = 192 */
#define SEQ      9999

void get_rtaddrs(int addrs, struct sockaddr  *sa, struct sockaddr  **rti_info);
const char * sock_masktop(struct sockaddr *sa, socklen_t salen);
char *sock_ntop_host(const struct sockaddr *sa, socklen_t salen);

int main(int argc, char **argv){
 int     sockfd;
 char   *buf;
 pid_t   pid;
 size_t n;
 struct rt_msghdr *rtm;
 struct sockaddr *sa, *rti_info[RTAX_MAX];
 struct sockaddr_in *sin;

 if (argc != 2){
  printf("usage: reqroute <IPaddress>");
  exit(0);
 }

 sockfd = socket(AF_ROUTE, SOCK_RAW, 0); /* need superuser privileges */

 buf = calloc(1, BUFLEN);     /* and initialized to 0 */

 rtm = (struct rt_msghdr *) buf;
 rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
 rtm->rtm_version = RTM_VERSION;
 rtm->rtm_type = RTM_GET;
 rtm->rtm_addrs = RTA_DST;
 rtm->rtm_pid = pid = getpid();
 rtm->rtm_seq = SEQ;/*compared with reply to get correct value*/

 sin = (struct sockaddr_in *) (rtm + 1);
 sin->sin_len = sizeof(struct sockaddr_in);
 sin->sin_family = AF_INET;
 inet_pton(AF_INET, argv[1], &sin->sin_addr);

 write(sockfd, rtm, rtm->rtm_msglen);

 /*Since other processes may have routing sockets open, and since
  the kernel passes a copy of all routing messages to all routing
  sockets, we must check the message type, sequence number, and
  process ID to verify that the message received is the one we are waiting for.
 */
 do {
  n = read(sockfd, rtm, BUFLEN);
 } while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != SEQ ||
  rtm->rtm_pid != pid);
 rtm = (struct rt_msghdr *) buf;
 sa = (struct sockaddr *) (rtm + 1);
 get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
 if ( (sa = rti_info[RTAX_DST]) != NULL){
  printf("dest: %s/n", sock_ntop_host(sa, sa->sa_len));
 }

 if ( (sa = rti_info[RTAX_GATEWAY]) != NULL){
  printf("gateway: %s/n", sock_ntop_host(sa, sa->sa_len));
 }

 if ( (sa = rti_info[RTAX_NETMASK]) != NULL){
  printf("netmask: %s/n", sock_masktop(sa, sa->sa_len));
 }

 if ( (sa = rti_info[RTAX_GENMASK]) != NULL){
  printf("genmask: %s/n", sock_masktop(sa, sa->sa_len));
 }

 exit(0);
}

/*
 * Round up 'a' to next multiple of 'size', which must be a power of 2
 */
#define ROUNDUP(a, size) (((a) & ((size)-1)) ? (1 + ((a) | ((size)-1))) : (a))
/*
 * Step to next socket address structure;
 * if sa_len is 0, assume it is sizeof(u_long).
 */
#define NEXT_SA(ap) ap = (struct sockaddr  *) /
    ((caddr_t) ap + (ap->sa_len ? ROUNDUP(ap->sa_len, sizeof (u_long)) : /
                                       sizeof(u_long)))

void get_rtaddrs(int addrs, struct sockaddr  *sa, struct sockaddr  **rti_info){
 int     i;

 for (i = 0; i < RTAX_MAX; i++) {
  if (addrs & (1 << i)) {
   rti_info[i] = sa;
   NEXT_SA(sa);
  }else{
   rti_info[i] = NULL;
  }
 }
}

const char * sock_masktop(struct sockaddr *sa, socklen_t salen){
 static char str[INET6_ADDRSTRLEN];
 unsigned char *ptr = &sa->sa_data[2];

 if (sa->sa_len == 0){
  return ("0.0.0.0");
 }else if (sa->sa_len == 5){
  snprintf(str, sizeof(str), "%d.0.0.0", *ptr);
 }else if (sa->sa_len == 6){
  snprintf(str, sizeof(str), "%d.%d.0.0", *ptr, *(ptr + 1));
 }else if (sa->sa_len == 7){
  snprintf(str, sizeof(str), "%d.%d.%d.0", *ptr, *(ptr + 1),
   *(ptr + 2));
 }else if (sa->sa_len == 8){
  snprintf(str, sizeof(str), "%d.%d.%d.%d",
   *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3));
 }else{
  snprintf(str, sizeof(str), "(unknown mask, len = %d, family = %d)",
   sa->sa_len, sa->sa_family);
 }
 return (str);
}

char *sock_ntop_host(const struct sockaddr *sa, socklen_t salen){
 static char str[128]; /* Unix domain is largest */

 switch (sa->sa_family) {
  case AF_INET: {
   struct sockaddr_in *sin = (struct sockaddr_in *) sa;

   if (!inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str))){
    return(NULL);
   }
   return(str);
  } 
  case AF_INET6: {
   struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;

   if (!inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str))){
    return(NULL);
   }
   return(str);
  }

  case AF_UNIX: {
   struct sockaddr_un *unp = (struct sockaddr_un *) sa;

   /* OK to have no pathname bound to the socket: happens on
      every connect() unless client calls bind() first. */
   if (!unp->sun_path[0]){
    strcpy(str, "(no pathname bound)");
   }else{
    snprintf(str, sizeof(str), "%s", unp->sun_path);
   }
   return(str);
  } 

  case AF_LINK: {
   struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa;

   if (sdl->sdl_nlen > 0){
    snprintf(str, sizeof(str), "%*s",
      sdl->sdl_nlen, &sdl->sdl_data[0]);
   }else{
    char ifname[128] = {0};
    if_indextoname(sdl->sdl_index,ifname);
    snprintf(str, sizeof(str), "AF_LINK, index=%d,%s", sdl->sdl_index,ifname);
   }
   return(str);
  }

  default:
   snprintf(str, sizeof(str), "sock_ntop_host: unknown AF_xxx: %d, len %d",
      sa->sa_family, salen);
   return(str);
 }
 return (NULL);
}

 

FreeBSD 15.1 四大核心工具实战:freebsd-update、portsnap、pkg 与 portmaster 深度解析 FreeBSD 是一套以稳定性、安全性和 ABI 兼容性为核心设计原则的类 Unix 操作系统。其维护体系不同于 Linux 发行版,依赖 freebsd-update 实现基础系统的原子化二进制更新,依托 portsnap 保障 Ports Tree 的确定性快照同步,通过 pkg 构建基于 SQLite 与签名验证的零信任二进制包管理,再以 portmaster 精准处理源码级循环依赖与配置继承。这些机制共同支撑 ZFS 文件系统之上的高可用生产环境,广泛应用于邮件网关、CDN 边缘节点及金融基础设施等 阅读详情

相关推荐

FreeBSD 入门实战:从安装配置到 pkg/ports 深度掌控

FreeBSD 是一套独立演进的类 Unix 操作系统,其核心设计强调可预测性、长期稳定性与安全默认策略。它采用 ZFS 文件系统、rc.conf 服务管理体系和 pkg/ports 双轨软件生态,与 Linux 在哲学、工具链和运维逻辑上存在本质差异。理解这些底层原理,是避免‘装完就吃灰’的关键。本文围绕 FreeBSD 安装验证、ZFS 分区实践、SSH 安全启用、tcsh/bash 环境适配、pkg 包管理机制及 ports 源码构建等真实场景展开,覆盖新手最易踩坑的五大环节,并融入 rehash 命

weixin_33827731的博客 358

FreeBSD 配置路由

在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机 -路由器来完成连通。路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,具有一个这个网络上的IP地址,因此,网络内部的计算机可以和路 由器本身相互通信。 当网络内部的计算机要向外连接的时候,数据包实际是交给路由器的,路由器再将数据包从连接外部网络的网络界面上转发出去,数据包经

北溟居 6093

FreeBSD 10.1 部署 Unbound DNS 缓存服务器实战指南

DNS 缓存服务器是提升系统网络响应速度与解析稳定性的基础组件,其核心原理是通过本地递归解析、结果缓存及 DNSSEC 验证,减少对外部 DNS 的依赖并增强安全性。技术价值体现在毫秒级响应、抗上游故障、隐私保护(如 QNAME 最小化)和合规性(如 DNSSEC 强制验证)。典型应用场景包括 FreeBSD 系统优化、pkg 包管理加速、容器化环境 DNS 可靠性加固,以及家庭 NAS 或开发主机的自主解析需求。本文聚焦于在 FreeBSD 10.1 这一经典稳定版本上,基于 Unbound 实现轻量、安

csdn785029689的博客 500

FreeBSD网络配置

网络配置 ## IP地址 默认网络 主机名 是否启动sshd # vi /etc/rc.conf hostname="FreeBSD-12.1" ifconfig_vmx0="inet 192.168.11.10 netmask 255.255.254.0" defaultrouter="192.168.10.1" sshd_enable="YES" ## 静态路由配置 # vi /etc/rc.conf static_routes="entry1 entry2" route_entry1="-n..

刘元林的博客 2073

FreeBSD高级网络实战:pf防火墙、CARP高可用与Netgraph虚拟化

FreeBSD并非Linux替代品,而是源自BSD学术传统的完整操作系统,其TCP/IP协议栈、pf有状态防火墙、CARP+pfsync高可用机制及Netgraph内核级网络图框架,共同构成企业级确定性网络的底层基石。相比Linux依赖eBPF+tc+XDP的多层叠加方案,FreeBSD在QoS调度、连接状态同步、零拷贝隧道等场景提供更精简、更低延迟、更高一致性的原生支持。它适用于对吞吐、抖动、调度确定性有严苛要求的CDN边缘、金融低延迟网关、教育专网骨干等场景,尤其适合已掌握Linux netfilter

dfu65065的博客 819

在FreeBSD下用vrrp实现基于DNS轮询的冗余服务

在FreeBSD下用vrrp实现基于DNS轮询的冗余服务 在FreeBSD下实现基于DNS Robin Round的冗余服务 在传统的基于DNS Robin Round的web load balance解决方案下,有一个明显的缺点,那就是万一其中一个服务器死了(服务宕了,或者断电、硬盘坏之类的硬故障),那轮转到该服务器上的web服务将是一个死点,所有定向到该服务器上的web request都将返

VAN BLOOD 1257

FreeBSD下如何进行添加路由等配置?

FreeBSD系统可以当作一台路由器来使用,实际上当年路由器刚刚出来的时候,有很大一部分就是用主机安装FreeBSD来提供路由功能的。

skywalk8163的专栏 1242

基于PDF文档结构的数字隐写

PDF隐写

xiongshivigor的博客 1426

FreeBSD基本网络设置

网络配置,临时设置,即时生效: ifconfig em0 delete | alias 删除网络接口上的IP地址 ifconfig em0 192.168.1.111 netmask 0xffffff00 route add default 192.168.0.1 ee /etc/resolv.conf nameserver 8.8.8.8 nameserver 114.114.114.114 ...

icquu的博客 1179

Claude Code VSCode集成开发指南:AI编程助手完整配置

Claude Code与Visual Studio Code的深度集成为开发者提供了强大的AI编程支持。本文详细介绍Claude Code VSCode扩展的安装配置、功能特性和实际应用方法。通过完整的配置流程和代码示例,帮助开发者充分利用Claude AI的智能编程能力。文章涵盖从环境搭建到高级功能应用的完整指南,包括代码自动补全、智能重构、实时代码分析等核心功能的使用技巧,以及与现有开发工作流的整合方案。

2501_93058131的博客 5984

gephi生成网络关系图_路网拓扑重建专题 (3) 网络图生成

城市道路网建模在获得基础路网之后,需要考虑道路交通网络的描述与表达问题。网络是将现实世界中的事物及其关系进行适当的抽象,构造成由节点和边按照一定规则组成的形式。一个实体网络可以由有限个“节点”集合与“边”集合构成的图表示,即网络表示为。对于一个由个节点组成的无权复杂网络,该图有邻接矩阵,这里。根据研究对象不同,建模方法主要包括原始法[1]和对偶法[2]两种,见图1,字母a-j为交叉口编号...

weixin_39761195的博客 3504

运维人员必须了解的Linux基础网络命令

摘要: 这个列表并不是一个教你如何使用这些命令的教程,而是一个命令合集和他们的简短解释。所以,如果你已经使用过这些命令,你可以用它来快速记住命令。我在计算机网络课程上使用FreeBSD,不过这些UNIX命令应… 这个列表并不是一个教你如何使用这些命令的教程,而是一个命令合集和他们的简短解释。所以,如果你已经使用过这些命令,你可以用它来快速记住命令。我在计算机网络课程上使用 FreeBSD,不过这些 UNIX 命令应该也能在 Linux 上同样工作。 连通性 ping :发送 ICMP echo 消息(一个包

YOKEhn的博客 230

win11一直弹出用户账户控制怎么解决

用户帐户控制简称UAC,是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。近期有部分Win11用户想要关闭UAC,但是不知道应该如何操作,对此下面我就教给大家操作方法,大家可以去尝试看看。...

xitongzhijia_abc的博客 5万+

门户网站镜像站以及CDN技术

原来喜欢登录到华军网站去下载一些常用软件,在当时的华军网的首页,即可看到让用户选择镜像站的菜单。 随着网民数量的越来越大,同时访问某网站的人数越来越多,出现了CDN技术。在BSD下,可以看到 在第一次ping 163网站时,DNS反向查询,得到的是以下IP地址 从上图可以看得出来,当在FreeBSD上禁止所有的数据到163的某个IP后...

weixin_30436101的博客 159

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

WW、forever的博客 488

YOLO26改进 - C3k2 | C3k2 融合 ARConv 自适应矩形卷积:动态调整卷积核形状与采样点 | CVPR 2025

本文介绍了将自适应矩形卷积(ARConv)模块与YOLO26相结合的方法。ARConv是针对遥感图像全色锐化任务设计的创新卷积模块,可自适应调整卷积核形状与采样点数量,解决传统卷积刚性限制,实现高效特征提取。其工作流程包括学习卷积核高度和宽度、选择采样点数量、生成采样图、卷积实现与空间自适应增强。我们将集成ARConv的C3k2_ARConv模块引入YOLO26,对相关代码进行修改和注册,并配置了YOLO26 - C3k2_ARConv.yaml文件。实验脚本显示,该结合方式应用于目标检测任务。

魔改工程师的博客 496

FreeBSD系统管理命令-很实用

转自:http://my.oschina.net/huxuanhui/blog/14816 1、freebsd下如何查看程序所占用的端口? #sockstat #netstat -na 2 、route相关命令 查询 routing table #netstat -rn 查询网络接口流量统计 #netstat -I 查询 TCP网络联机情形 #...

weixin_34297300的博客 292

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1686

FreeBSD 8.0 release 命令行下的网络配置

<br />最近折腾了一下berkeley 大学的unix 的一个版本freebsd .<br />安装完之后想练习一下手动配置ip地址。<br />我的电脑室dell insprion 1420的本本,当初装了一个opensolaris网卡驱动没有装好。<br />没想到装FreeBSD时;<br />less /var/run/dmesg.root <br />显示看见了我的bge0网卡驱动已经装好了。<br />由于是在命令行下进行的,也没有在sysinstall中用配置,只能手动修改文件来配置。<b

-------MYNUX--------- lengerfulluse 1306

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数本文禁止转载!项目简介:YOLOv5检测器:DeepSort追踪器:运行demo:训练自己的模型:调用接口:创建检测器:调用检测接口: 本文禁止转载! 项目简介: 使用YOLOv5+Deepsort实现车辆行人追踪和计数,代码封装成一个Detector类,更容易嵌入到自己的项目中。 代码地址(欢迎star): https://github.com/Sharpiless/Yolov5-deepsort-inference 最终效果:

梁瑛平的博客 5万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

FreeBSD网卡配置

FreeBSD版本为7.1版,基本配置网卡IP与网关的配置文件是目录/etc下面的rc.conf文件.在配置之前请使用ifconfig -a来查看正确的网卡名,本人的是le0, 网络地址是:10.22.60.0/24的网络,IP地址为10.22.60.32,因此在rc.conf文件中添加:ifconfig_bge0="inet 10.22.60.32 n...

weixin_33721344的博客 1356

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

FreeBSD使用总结(更新:20240111)

目录 包管理 升级openssh 系统管理 开启telnet 用户密码文件/etc/master.passwd 系统升级 FreeBSD 13.0升级失败(强制升级后启动失败--未解决) 其他 安装虚拟机 使用VMware ESXi虚拟化平台安装FreeBSD虚拟机:VMware 安装FreeBSD 11不支持VMware半虚拟化磁盘驱动。默认文件系统FreeBSD 13.0开始推荐安装ZFS,看来在该版本对ZFS优化支持较好,其余版本扔推荐UFS,这里也仍然使用UFS。默认shell

刘元林的博客 5158

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

freebsd 启用网关

系统版本 freebsd12.2 方法1 在 /etc/rc.conf中添加 gateway_enable=“YES” ,之后重启网络 /etc/netstart restart 。 方法2 临时开启:执行 sysctl net.inet.ip.forwarding=1 永久开启: 在 /etc/sysctl.conf 中添加 net.inet.ip.forwarding=1 检测 使用sysctl查询net.inet.ip.forwarding,值为1表示生效 (即使使用方式1,配置后net.in

qq_26478893的博客 737

macos下载的安装包在哪里_mac os (freebsd)的路由规则学习

原文发表于我的博客, 特此作版权声明Noosphere.site: mac os (freebsd)的路由规则学习MacOS的路由表查询不是用我们熟知的route命令,而是使用命令 netstat -r 或者netstat -nr(不做域名解释)来查看 netstat -r Routing tablesInternet: Destination Gateway ...

weixin_39805409的博客 236

FreeBSD 10.1 下 Sendmail 对接外部 SMTP 的完整配置指南

SMTP(简单邮件传输协议)是互联网邮件投递的基础通信标准,其核心在于安全、可信的端到端传输。现代邮箱服务(如Gmail、Outlook、腾讯企业邮)强制要求TLS加密通道与SASL身份认证协同工作,否则拒绝接收——这并非技术限制,而是反垃圾邮件与零信任架构的必然要求。在FreeBSD这类强调稳定性的类Unix系统中,原生Sendmail虽语法古老,却因深度集成、可审计性强、版本兼容性高,成为对接外部SMTP服务的理想MSA(邮件提交代理)。本文聚焦Sendmail如何通过SASL凭据管理、TLS证书信任链

weixin_30666401的博客 766
上一篇: Ubuntu9.04安装使用 用户名和密码 的squid代理服务器
下一篇: 在linux下查询路由
Kernel_RDMA
Kernel_RDMA 新星创作者: 操作系统技术领域 新星创作者: 操作系统技术领域
博客等级 码龄19年 2613粉丝 970原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kernel_RDMA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值