9#include <libmnl/libmnl.h>
10#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
12#include <linux/netfilter/nf_conntrack_tcp.h>
16 struct sockaddr_storage * ext;
20static int data_cb(
const struct nlmsghdr *nlh,
void *
data)
22 struct nf_conntrack *ct;
23 struct data_cb_s *
d = (
struct data_cb_s*)
data;
24 struct sockaddr_in* ext4 = (
struct sockaddr_in*)
d->ext;
29 nfct_nlmsg_parse(nlh, ct);
32 ext4->sin_addr.s_addr = nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST);
33 ext4->sin_port = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
42 struct sockaddr_storage* ret_ext)
44 struct mnl_socket *nl;
47 char buf[MNL_SOCKET_BUFFER_SIZE];
48 unsigned int seq, portid;
49 struct nf_conntrack *ct;
51 struct data_cb_s
data;
57 if (src->sa_family != dst->sa_family) {
61 nl = mnl_socket_open(NETLINK_NETFILTER);
67 if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
71 portid = mnl_socket_get_portid(nl);
73 memset(
buf, 0,
sizeof(
buf));
74 nlh = mnl_nlmsg_put_header(
buf);
75 nlh->nlmsg_type = (NFNL_SUBSYS_CTNETLINK << 8) | IPCTNL_MSG_CT_GET;
76 nlh->nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK;
77 nlh->nlmsg_seq = seq =
time(NULL);
79 nfh = mnl_nlmsg_put_extra_header(nlh,
sizeof(
struct nfgenmsg));
80 nfh->nfgen_family = src->sa_family;
81 nfh->version = NFNETLINK_V0;
89 nfct_set_attr_u8(ct, ATTR_L3PROTO, src->sa_family);
90 if (src->sa_family == AF_INET) {
91 struct sockaddr_in *src4 = (
struct sockaddr_in *)src;
92 struct sockaddr_in *dst4 = (
struct sockaddr_in *)dst;
93 nfct_set_attr_u32(ct, ATTR_IPV4_SRC, src4->sin_addr.s_addr);
94 nfct_set_attr_u32(ct, ATTR_IPV4_DST, dst4->sin_addr.s_addr);
95 nfct_set_attr_u16(ct, ATTR_PORT_SRC, src4->sin_port);
96 nfct_set_attr_u16(ct, ATTR_PORT_DST, dst4->sin_port);
97 }
else if (src->sa_family == AF_INET6) {
98 struct sockaddr_in6 *src6 = (
struct sockaddr_in6 *)src;
99 struct sockaddr_in6 *dst6 = (
struct sockaddr_in6 *)dst;
100 nfct_set_attr(ct, ATTR_IPV6_SRC, &src6->sin6_addr);
101 nfct_set_attr(ct, ATTR_IPV6_DST, &dst6->sin6_addr);
102 nfct_set_attr_u16(ct, ATTR_PORT_SRC, src6->sin6_port);
103 nfct_set_attr_u16(ct, ATTR_PORT_DST, dst6->sin6_port);
105 nfct_set_attr_u8(ct, ATTR_L4PROTO, proto);
107 nfct_nlmsg_build(nlh, ct);
109 ret = mnl_socket_sendto(nl, nlh, nlh->nlmsg_len);
114 ret = mnl_socket_recvfrom(nl,
buf,
sizeof(
buf));
118 ret = mnl_cb_run(
buf, ret, seq, portid, data_cb, &
data);
119 if (ret <= MNL_CB_STOP)
121 ret = mnl_socket_recvfrom(nl,
buf,
sizeof(
buf));
127 mnl_socket_close(nl);
134#define DST_PORT "dport="
136#define SRC_PORT "sport="
137#define IP_CONNTRACK_LOCATION "/proc/net/ip_conntrack"
138#define NF_CONNTRACK_LOCATION "/proc/net/nf_conntrack"
141 struct sockaddr_storage* ret_ext)
153 printf(
"could not read info about connections from the kernel, "
154 "make sure netfilter is enabled in kernel or by modules.\n");
160 char line[256], *
str;
161 memset(line, 0,
sizeof(line));
162 str = fgets(line,
sizeof(line), f);
164 char *token, *saveptr;
166 uint8_t src_f, src_port_f, dst_f, dst_port_f;
167 src_f=src_port_f=dst_f=dst_port_f=0;
169 for (j = 1; ; j++,
str = NULL) {
170 token = strtok_r(
str,
" ", &saveptr);
174 if ((j==2)&&(af!=atoi(token)))
176 if ((j==4)&&(proto!=atoi(token)))
181 if (strncmp(token,
SRC,
sizeof(
SRC) - 1) == 0) {
182 char *srcip = token +
sizeof(
SRC) - 1;
184 memset(
buf,0,
sizeof(
buf));
186 if (inet_pton(af, srcip,
buf)!=1)
190 struct sockaddr_in *src4=(
struct sockaddr_in*)src;
192 if (src4->sin_addr.s_addr !=
buf[0])
199 char *src_port = token +
sizeof(
SRC_PORT) - 1;
203 struct sockaddr_in *src4=(
struct sockaddr_in*)src;
205 if (ntohs(src4->sin_port) != port)
212 if (strncmp(token,
DST,
sizeof(
DST) - 1) == 0) {
213 char *dstip = token +
sizeof(
DST) - 1;
215 memset(
buf,0,
sizeof(
buf));
216 if (inet_pton(af, dstip,
buf)!=1)
219 struct sockaddr_in *dst4=(
struct sockaddr_in*)dst;
221 if (dst4->sin_addr.s_addr !=
buf[0])
225 struct sockaddr_in*ret4=(
struct sockaddr_in*)ret_ext;
226 ret_ext->ss_family = AF_INET;
227 ret4->sin_addr.s_addr =
buf[0];
232 char *dst_port = token +
sizeof(
DST_PORT) - 1;
235 struct sockaddr_in *dst4=(
struct sockaddr_in*)dst;
237 if (ntohs(dst4->sin_port) != port)
241 struct sockaddr_in*ret4=(
struct sockaddr_in*)ret_ext;
242 ret_ext->ss_family = AF_INET;
243 ret4->sin_port = htons(port);
248 if (src_f && src_port_f && dst_f && dst_port_f) {
int time
Definition gen_wide_data.py:40
#define SRC
Definition nfct_get.c:135
#define SRC_PORT
Definition nfct_get.c:136
int get_nat_ext_addr(struct sockaddr *src, struct sockaddr *dst, uint8_t proto, struct sockaddr_storage *ret_ext)
Definition nfct_get.c:140
#define DST
Definition nfct_get.c:133
#define DST_PORT
Definition nfct_get.c:134
#define IP_CONNTRACK_LOCATION
Definition nfct_get.c:137
#define NF_CONNTRACK_LOCATION
Definition nfct_get.c:138
const char *const str
Definition portlistingparse.c:23
const char * buf
Definition slow_memmem.cpp:73
unsigned short uint16_t
Definition stdint.h:125
unsigned int uint32_t
Definition stdint.h:126
unsigned char uint8_t
Definition stdint.h:124
std::string data
Definition base58.cpp:37