C 发送数据包时如何设置iptables标记?
Linux的iptable和iproute允许我们标记数据包并在以后匹配标记(fwmark),从而在配置路由和防火墙时具有极大的灵活性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
在从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");
}