def main(): if len(sys.argv) != 3: print("Usage: %s [ifname] [up|down]" % sys.argv[0]) sys.exit(-1) change = 0 flags = 0 if sys.argv[2].lower() == "up": change |= ifh.IFF_UP flags |= ifh.IFF_UP elif sys.argv[2].lower() == "down": change |= ifh.IFF_UP flags &= ~ifh.IFF_UP else: print("%s is not `up' nor 'down'" % sys.argv[2], file=sys.stderr) sys.exit(-1) nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE) nlh.nlmsg_type = rtnl.RTM_NEWLINK nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK seq = int(time.time()) nlh.nlmsg_seq = seq ifm = nlh.put_extra_header_as(rtnl.Ifinfomsg) ifm.ifi_family = socket.AF_UNSPEC ifm.ifi_change = change ifm.ifi_flags = flags nlh.put_str(if_link.IFLA_IFNAME, sys.argv[1]) with mnl.Socket(netlink.NETLINK_ROUTE) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() nlh.fprint(rtnl.Ifinfomsg.csize(), out=sys.stdout) try: nl.send_nlmsg(nlh) except Exception as e: print("mnl_socket_sendto: %s" % e, file=sys.stderr) raise try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise # cb_run will raise OSException in case of error try: mnl.cb_run(buf, seq, portid, None, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def nursfd_cb(fd, when, producer): buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE) ret = fd.recv_into(buf) ret = mnl.cb_run(buf[:ret], 0, 0, data_cb, producer) if ret == mnl.MNL_CB_OK: return nurs.NURS_RET_OK return nurs.NURS_RET_ERROR
def main(): if len(sys.argv) != 2: print("Usage: %s [queue_num]" % sys.argv[0]) sys.exit(-1) qnum = int(sys.argv[1]) buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE) with mnl.Socket(netlink.NETLINK_NETFILTER) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() nlh = nflog_build_cfg_pf_request(buf, nfulnl.NFULNL_CFG_CMD_PF_UNBIND) nl.send_nlmsg(nlh) nlh = nflog_build_cfg_pf_request(buf, nfulnl.NFULNL_CFG_CMD_PF_BIND) nl.send_nlmsg(nlh) nlh = nflog_build_cfg_request(buf, nfulnl.NFULNL_CFG_CMD_BIND, qnum) nl.send_nlmsg(nlh) nlh = nflog_build_cfg_params(buf, nfulnl.NFULNL_COPY_PACKET, 0xFFFF, qnum) nl.send_nlmsg(nlh) ret = mnl.MNL_CB_OK while ret >= mnl.MNL_CB_STOP: try: nrecv = nl.recv_into(buf) if nrecv == 0: break ret = mnl.cb_run(buf[:nrecv], 0, portid, log_cb, None) except Exception as e: raise
def main(): if len(sys.argv) > 2: print("%s [family name]" % sys.argv[0]) sys.exit(-1) nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE) nlh.nlmsg_type = genl.GENL_ID_CTRL nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK seq = int(time.time()) nlh.nlmsg_seq = seq genlh = nlh.put_extra_header_as(genl.Genlmsghdr) genlh.cmd = genl.CTRL_CMD_GETFAMILY genlh.version = 1 nlh.put_u32(genl.CTRL_ATTR_FAMILY_ID, genl.GENL_ID_CTRL) if len(sys.argv) >= 2: nlh.put_strz(genl.CTRL_ATTR_FAMILY_NAME, sys.argv[1]) else: nlh.nlmsg_flags |= netlink.NLM_F_DUMP with mnl.Socket(netlink.NETLINK_GENERIC) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() nl.send_nlmsg(nlh) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) ret = mnl.cb_run(buf, seq, portid, data_cb, None) except Exception as e: raise
def main(): nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE) nlh.nlmsg_type = (nfnl.NFNL_SUBSYS_CTNETLINK << 8) | nfnlct.IPCTNL_MSG_CT_GET nlh.nlmsg_flags = netlink.NLM_F_REQUEST|netlink.NLM_F_DUMP seq = int(time.time()) nlh.nlmsg_seq = seq nfh = nlh.put_extra_header_as(nfnl.Nfgenmsg) nfh.nfgen_family = socket.AF_INET nfh.version = nfnl.NFNETLINK_V0 nfh.res_id = 0 with mnl.Socket(netlink.NETLINK_NETFILTER) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) nl.send_nlmsg(nlh) portid = nl.get_portid() ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) if len(buf) == 0: break except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise try: ret = mnl.cb_run(buf, seq, portid, data_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def main(): nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE) nlh.nlmsg_type = rtnl.RTM_GETLINK nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_DUMP seq = int(time.time()) nlh.nlmsg_seq = seq rt = nlh.put_extra_header_as(rtnl.Rtgenmsg) rt.rtgen_family = socket.AF_PACKET with mnl.Socket(netlink.NETLINK_ROUTE) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() nl.send_nlmsg(nlh) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise if len(buf) == 0: break try: ret = mnl.cb_run(buf, nlh.nlmsg_seq, portid, data_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def main(): if len(sys.argv) != 2: print("Usage: %s <inet|inet6>" % sys.argv[0]) sys.exit(-1) nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE) nlh.nlmsg_type = rtnl.RTM_GETROUTE nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_DUMP seq = int(time.time()) nlh.nlmsg_seq = seq rtm = nlh.put_extra_header_as(rtnl.Rtmsg) if sys.argv[1] == "inet": rtm.rtm_family = socket.AF_INET elif sys.argv[1] == "inet6": rtm.rtm_family = socket.AF_INET6 with mnl.Socket(netlink.NETLINK_ROUTE) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() nl.send_nlmsg(nlh) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise if len(buf) == 0: break try: ret = mnl.cb_run(buf, seq, portid, data_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def nfq_send_accept(queue_num, qid): global nl buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE) nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_VERDICT, queue_num) nlh.nlmsg_flags |= netlink.NLM_F_ACK nfq.nlmsg_verdict_put(nlh, qid, nf.NF_ACCEPT) nl.send_nlmsg(nlh) nrecv = nl.recv_into(buf) return mnl.cb_run(buf[:nrecv], 0, 0, None, None)
def main(): frame_size = 16384 with mnl.Socket(netlink.NETLINK_ROUTE) as nl: nl.set_ringopt(mnl.MNL_RING_RX, mnl.MNL_SOCKET_BUFFER_SIZE * 16, 64, frame_size, int(64 * mnl.MNL_SOCKET_BUFFER_SIZE * 16 / frame_size)) nl.set_ringopt(mnl.MNL_RING_TX, mnl.MNL_SOCKET_BUFFER_SIZE * 16, 64, frame_size, int(64 * mnl.MNL_SOCKET_BUFFER_SIZE * 16 / frame_size)) nl.map_ring(mmap.MAP_SHARED) txring = nl.get_ring(mnl.MNL_RING_TX) frame = txring.current_frame() buf = mnl.MNL_FRAME_PAYLOAD(frame, frame_size) nlh = mnl.nlmsg_put_header(buf, mnl.Nlmsg) nlh.nlmsg_type = rtnl.RTM_GETLINK nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_DUMP seq = int(time.time()) nlh.nlmsg_seq = seq rt = nlh.put_extra_header_as(rtnl.Rtgenmsg) rt.rtm_family = socket.AF_PACKET frame.nm_len = nlh.nlmsg_len frame.nm_status = netlink.NL_MMAP_STATUS_VALID nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() # ??? commit a8866ff6a5bce7d0ec465a63bc482a85c09b0d39 # nl.sendto(None) nl.send_nlmsg(nlh) txring.advance() rxring = nl.get_ring(mnl.MNL_RING_RX) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: # XXX: no try / except mnl_socket_poll(nl) frame = rxring.current_frame() if frame.nm_status == netlink.NL_MMAP_STATUS_VALID: buf = mnl.MNL_FRAME_PAYLOAD(frame, frame.nm_len) elif frame.nm_status == netlink.NL_MMAP_STATUS_COPY: buf = nl.recv(frame_size * 2) else: frame.nm_status = netlink.NL_MMAP_STATUS_UNUSED rxring.advance() continue try: ret = mnl.cb_run(buf, seq, portid, data_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise frame.nm_status = netlink.NL_MMAP_STATUS_UNUSED rxring.advance()
def nfq_send_repeat(queue_num, qid, mark, payload): global nl buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE + len(payload)) nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_VERDICT, queue_num) nlh.nlmsg_flags |= netlink.NLM_F_ACK nfq.nlmsg_verdict_put(nlh, qid, nf.NF_REPEAT) nlh.put_u32(nfqnl.NFQA_MARK, socket.htonl(mark)); nlh.put(nfqnl.NFQA_PAYLOAD, payload) nl.send_nlmsg(nlh) nrecv = nl.recv_into(buf) return mnl.cb_run(buf[:nrecv], 0, 0, None, None)
def main(): with mnl.Socket(netlink.NETLINK_ROUTE) as nl: nl.bind(rtnl.RTMGRP_LINK, mnl.MNL_SOCKET_AUTOPID) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise if len(buf) == 0: break try: ret = mnl.cb_run(buf, 0, 0, data_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def main(): if len(sys.argv) != 2: print("Usage: %s [queue_num]" % sys.argv[0]) sys.exit(-1) queue_num = int(sys.argv[1]) with mnl.Socket(netlink.NETLINK_NETFILTER) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() buf = bytearray(mnl.MNL_SOCKET_BUFFER_SIZE) nlh = nfq_build_cfg_pf_request(buf, nfqnl.NFQNL_CFG_CMD_PF_UNBIND) nl.send_nlmsg(nlh) nlh = nfq_build_cfg_pf_request(buf, nfqnl.NFQNL_CFG_CMD_PF_BIND) nl.send_nlmsg(nlh) nlh = nfq_build_cfg_request(buf, nfqnl.NFQNL_CFG_CMD_BIND, queue_num) nl.send_nlmsg(nlh) nlh = nfq_build_cfg_params(buf, nfqnl.NFQNL_COPY_PACKET, 0xFFFF, queue_num) nl.send_nlmsg(nlh) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: nrecv = nl.recv_into(buf) if nrecv == 0: break except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise try: ret = mnl.cb_run(buf[:nrecv], 0, portid, queue_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise packet_id = ret - mnl.MNL_CB_OK nlh = nfq_build_verdict(buf, packet_id, queue_num, nf.NF_ACCEPT) try: nl.send_nlmsg(nlh) except Exception as e: print("mnl_socket_sendto: %s" % e, file=sys.stderr)
def main(): if len(sys.argv) != 2: print("%s [group]" % sys.argv[0]) sys.exit(-1) global group group = int(sys.argv[1]) with mnl.Socket(netlink.NETLINK_GENERIC) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) nl.setsockopt(netlink.NETLINK_ADD_MEMBERSHIP, struct.pack("i", group)) ret = mnl.MNL_CB_OK while ret > mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) ret = mnl.cb_run(buf, 0, 0, data_cb, None) except Exception as e: raise
def main(): with mnl.Socket(netlink.NETLINK_NETFILTER) as nl: nl.bind(nfnlcm.NF_NETLINK_CONNTRACK_NEW | \ nfnlcm.NF_NETLINK_CONNTRACK_UPDATE | \ nfnlcm.NF_NETLINK_CONNTRACK_DESTROY, mnl.MNL_SOCKET_AUTOPID) ret = mnl.MNL_CB_OK while ret >= mnl.MNL_CB_STOP: try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) if len(buf) == 0: break except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise try: ret = mnl.cb_run(buf, 0, 0, data_cb, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def main(): if len(sys.argv) != 2: print("Usage: %s [queue_num]" % sys.argv[0]) sys.exit(-1) queue_num = int(sys.argv[1]) nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() buf = bytearray(0xffff + (mnl.MNL_SOCKET_BUFFER_SIZE / 2)) # PF_(UN)BIND is not needed with kernels 3.8 and later nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, 0) nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_PF_UNBIND) nl.send_nlmsg(nlh) nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, 0) nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_PF_BIND) nl.send_nlmsg(nlh) nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, queue_num) nfq.nlmsg_cfg_put_cmd(nlh, socket.AF_INET, nfqnl.NFQNL_CFG_CMD_BIND) nl.send_nlmsg(nlh) nlh = nfq_hdr_put(buf, nfqnl.NFQNL_MSG_CONFIG, queue_num) nfq.nlmsg_cfg_put_params(nlh, nfqnl.NFQNL_COPY_PACKET, 0xffff) nlh.put_u32(nfqnl.NFQA_CFG_FLAGS, socket.htonl(nfqnl.NFQA_CFG_F_GSO)) nlh.put_u32(nfqnl.NFQA_CFG_MASK, socket.htonl(nfqnl.NFQA_CFG_F_GSO)) nl.send_nlmsg(nlh) # ENOBUFS is signalled to userspace when packets were lost # on kernel side. In most cases, userspace isn't interested # in this information, so turn it off. nl.setsockopt(netlink.NETLINK_NO_ENOBUFS, bytearray([1])) while True: ret = nl.recv_into(buf) ret = mnl.cb_run(buf[:ret], 0, portid, queue_cb, None) nl.close()
def handle(nl): try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) except OSError as e: if e.errno == ENOBUFS: print("The daemon has hit ENOBUFS, you can " \ + "increase the size of your receiver " \ + "buffer to mitigate this or enable " \ + "reliable delivery.", file=sys.stderr) else: print("mnl_socket_recvfrom: %s" % e) return -1 try: ret = mnl.cb_run(buf, 0, 0, data_cb, None) except OSError as e: print("mnl_cb_run: %s" % e, file=sys.stderr) return -1 return ret
def main(): if len(sys.argv) <= 3: print("Usage: %s iface destination cidr [gateway]" % sys.argv[0]) print("Example: %s eth0 10.0.1.12 32 10.0.1.11" % sys.argv[0]) print(" %s eth0 ffff::10.0.1.12 128 fdff::1" % sys.argv[0]) sys.exit(-1) iface = if_nametoindex(sys.argv[1]) try: # dst = struct.unpack("I", socket.inet_pton(socket.AF_INET, sys.argv[2]))[0] dst = bytearray(socket.inet_pton(socket.AF_INET, sys.argv[2])) family = socket.AF_INET except OSError as e: dst = bytearray(socket.inet_pton(socket.AF_INET6, sys.argv[2])) family = socket.AF_INET6 prefix = int(sys.argv[3]) if len(sys.argv) == 5: gw = bytearray(socket.inet_pton(family, sys.argv[4])) nlh = mnl.Nlmsg.put_new_header(mnl.MNL_SOCKET_BUFFER_SIZE) nlh.nlmsg_type = rtnl.RTM_NEWROUTE nlh.nlmsg_flags = netlink.NLM_F_REQUEST | netlink.NLM_F_CREATE | netlink.NLM_F_ACK seq = int(time.time()) nlh.nlmsg_seq = seq rtm = nlh.put_extra_header_as(rtnl.Rtmsg) rtm.rtm_family = family rtm.rtm_dst_len = prefix rtm.rtm_src_len = 0 rtm.rtm_tos = 0 rtm.rtm_protocol = rtnl.RTPROT_STATIC rtm.rtm_table = rtnl.RT_TABLE_MAIN rtm.rtm_type = rtnl.RTN_UNICAST # is there any gateway? rtm.rtm_scope = len(sys.argv) == 4 and rtnl.RT_SCOPE_LINK or rtnl.RT_SCOPE_UNIVERSE rtm.rtm_flags = 0 log.debug("family: %d, dst len: %d" % (family, len(dst))) nlh.put(rtnl.RTA_DST, dst) nlh.put_u32(rtnl.RTA_OIF, iface) if len(sys.argv) == 5: log.info("family: %d, gw len: %d" % (family, len(gw))) nlh.put(rtnl.RTA_GATEWAY, gw) with mnl.Socket(netlink.NETLINK_ROUTE) as nl: nl.bind(0, mnl.MNL_SOCKET_AUTOPID) portid = nl.get_portid() try: nl.send_nlmsg(nlh) except Exception as e: print("mnl_socket_sendto: %s" % e, file=sys.stderr) raise try: buf = nl.recv(mnl.MNL_SOCKET_BUFFER_SIZE) except Exception as e: print("mnl_socket_recvfrom: %s" % e, file=sys.stderr) raise try: mnl.cb_run(buf, seq, portid, None, None) except Exception as e: print("mnl_cb_run: %s" % e, file=sys.stderr) raise
def test_cb_run(self): self.assertEqual(mnl.cb_run(self.nlmsghdr_noop, 1, 1, None, None), mnl.MNL_CB_OK) self.assertEqual(mnl.cb_run(self.nlmsghdr_mintype, 1, 1, None, None), mnl.MNL_CB_OK) try: mnl.cb_run(self.nlmsghdr_error, 1, 1, None, None) except OSError as e: self.assertEquals(e.errno, errno.EPERM) else: self.fail("not raise OSError") @mnl.mnl_cb_t def cb_data(h, d): d is not None and d.append(h.nlmsg_type) if h.nlmsg_type == 0xff: ctypes.set_errno(errno.ENOBUFS) return mnl.MNL_CB_ERROR elif h.nlmsg_type == 0x7f: return mnl.MNL_CB_STOP else: return mnl.MNL_CB_OK l = [] try: mnl.cb_run(self.nlmsghdr_typeFF, 1, 1, cb_data, l) except OSError as e: self.assertEquals(e.errno, errno.ENOBUFS) else: self.fail("not raise OSError") l = [] ret = mnl.cb_run(self.nlmsghdr_type7F, 1, 1, cb_data, l) self.assertEqual(ret, mnl.MNL_CB_STOP) self.assertEqual(l[0], netlink.NLMSG_MIN_TYPE) self.assertEqual(l[1], 0x7f) try: mnl.cb_run(self.nlmsghdr_pid2, 1, 1, cb_data, None) except OSError as e: self.assertEqual(e.errno, errno.ESRCH) else: self.fail("not raise OSError") try: mnl.cb_run(self.nlmsghdr_seq2, 1, 1, cb_data, None) except OSError as e: self.assertEqual(e.errno, errno.EPROTO) else: self.fail("not raise OSError") # Python2.5 returns -1 but could not get EINTR? if sys.version_info < (2, 6): ret = mnl.cb_run2(self.nlmsghdr_intr, 1, 1, cb_data, None) self.assertEquals(ret, mnl.MNL_CB_ERROR) else: try: mnl.cb_run2(self.nlmsghdr_intr, 1, 1, cb_data, None) except OSError as e: self.assertEqual(e.errno, errno.EINTR) else: self.fail("not raise OSError")