C 发送数据包时如何设置iptables标记?

C 发送数据包时如何设置iptables标记?,c,linux,sockets,networking,iptables,C,Linux,Sockets,Networking,Iptables,Linux的iptable和iproute允许我们标记数据包并在以后匹配标记(fwmark),从而在配置路由和防火墙时具有极大的灵活性 在从C程序发送数据包时,有没有一种方法可以通过普通套接字接口或特定的linux系统调用来设置这些标记?我在socket(7)手册页中找到了SO\u MARKsocket选项: 正如我最初问的那样,不是每包都适合我的目的。您可以使用setsockopt()进行设置: int-fwmark; //fwmark=; if(-1==setsockopt(sockfd、S

Linux的iptable和iproute允许我们标记数据包并在以后匹配标记(fwmark),从而在配置路由和防火墙时具有极大的灵活性


在从C程序发送数据包时,有没有一种方法可以通过普通套接字接口或特定的linux系统调用来设置这些标记?

我在socket(7)手册页中找到了
SO\u MARK
socket选项:

正如我最初问的那样,不是每包都适合我的目的。您可以使用
setsockopt()
进行设置:

int-fwmark;
//fwmark=;
if(-1==setsockopt(sockfd、SOL_-SOCKET、SO_-MARK和fwmark、sizeof-fwmark)){
perror(“套接字数据包设置标记失败”);
}

操作标记是需要root权限的事情之一。@BenVoigt有许多事情需要root权限,许多程序需要以root身份运行。你的观点是什么?如果你的“C程序”不是以root用户身份运行,你可能永远也找不到办法。
   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.
int fwmark;
//fwmark = <some value>;
if(-1 == setsockopt(sockfd, SOL_SOCKET, SO_MARK, &fwmark, sizeof fwmark)) {
    perror("failed setting mark for socket packets");
}