做linux下iptables规则,特别是nat规则时,有时候增加的规则并没有立刻生效,其中原因多半是配置的规则已经连接跟踪表
里了,这时候需要手动清空一下连接表,linux提供的连接表操作库比较复杂,我写了一个简单的清空跟踪表的方法。
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/netfilter/nfnetlink.h>
#include <linux/netfilter/nfnetlink_conntrack.h>
int main()
{
char buf[64]={0};
int fd;
struct sockaddr_nl sa;
struct nlmsghdr *nh=(struct nlmsghdr *)buf;
fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER);
nh->nlmsg_len = NLMSG_SPACE(sizeof(struct nfgenmsg));
struct iovec iov = { nh, nh->nlmsg_len };
struct msghdr msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
nh->nlmsg_type = (NFNL_SUBSYS_CTNETLINK<<8 |IPCTNL_MSG_CT_DELETE);
nh->nlmsg_flags |= NLM_F_REQUEST;
sendmsg(fd, &msg, 0);
}