Linux的IPTABLE和IPROUTE允许我们标记数据包并匹配后面的标记(FWMark),从而允许在配置路由和防火墙方面具有很大的灵活性。
当从C程序发送数据包时,有没有办法设置这些标记,可以通过普通的sockets接口,也可以通过特定的linux系统调用?

最佳答案

我在socket(7)手册页中找到了SO_MARKsocket选项:

   SO_MARK (since Linux 2.6.25)
          Set the mark for each packet sent through this socket (similar
          to the netfilter MARK target but socket-based).  Changing the
          mark can be used for mark-based routing without netfilter or
          for packet filtering.  Setting this option requires the
          CAP_NET_ADMIN capability.

它不是每包,因为我最初的要求,适合我的目的。您可以使用setsockopt()设置它:
int fwmark;
//fwmark = <some value>;
if(-1 == setsockopt(sockfd, SOL_SOCKET, SO_MARK, &fwmark, sizeof fwmark)) {
    perror("failed setting mark for socket packets");
}

10-08 06:23