conntrack_linux.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package nl
  2. import "unsafe"
  3. // Track the message sizes for the correct serialization/deserialization
  4. const (
  5. SizeofNfgenmsg = 4
  6. SizeofNfattr = 4
  7. SizeofNfConntrack = 376
  8. SizeofNfctTupleHead = 52
  9. )
  10. var L4ProtoMap = map[uint8]string{
  11. 6: "tcp",
  12. 17: "udp",
  13. }
  14. // From https://git.netfilter.org/libnetfilter_conntrack/tree/include/libnetfilter_conntrack/libnetfilter_conntrack_tcp.h
  15. // enum tcp_state {
  16. // TCP_CONNTRACK_NONE,
  17. // TCP_CONNTRACK_SYN_SENT,
  18. // TCP_CONNTRACK_SYN_RECV,
  19. // TCP_CONNTRACK_ESTABLISHED,
  20. // TCP_CONNTRACK_FIN_WAIT,
  21. // TCP_CONNTRACK_CLOSE_WAIT,
  22. // TCP_CONNTRACK_LAST_ACK,
  23. // TCP_CONNTRACK_TIME_WAIT,
  24. // TCP_CONNTRACK_CLOSE,
  25. // TCP_CONNTRACK_LISTEN, /* obsolete */
  26. // #define TCP_CONNTRACK_SYN_SENT2 TCP_CONNTRACK_LISTEN
  27. // TCP_CONNTRACK_MAX,
  28. // TCP_CONNTRACK_IGNORE
  29. // };
  30. const (
  31. TCP_CONNTRACK_NONE = 0
  32. TCP_CONNTRACK_SYN_SENT = 1
  33. TCP_CONNTRACK_SYN_RECV = 2
  34. TCP_CONNTRACK_ESTABLISHED = 3
  35. TCP_CONNTRACK_FIN_WAIT = 4
  36. TCP_CONNTRACK_CLOSE_WAIT = 5
  37. TCP_CONNTRACK_LAST_ACK = 6
  38. TCP_CONNTRACK_TIME_WAIT = 7
  39. TCP_CONNTRACK_CLOSE = 8
  40. TCP_CONNTRACK_LISTEN = 9
  41. TCP_CONNTRACK_SYN_SENT2 = 9
  42. TCP_CONNTRACK_MAX = 10
  43. TCP_CONNTRACK_IGNORE = 11
  44. )
  45. // All the following constants are coming from:
  46. // https://github.com/torvalds/linux/blob/master/include/uapi/linux/netfilter/nfnetlink_conntrack.h
  47. // enum cntl_msg_types {
  48. // IPCTNL_MSG_CT_NEW,
  49. // IPCTNL_MSG_CT_GET,
  50. // IPCTNL_MSG_CT_DELETE,
  51. // IPCTNL_MSG_CT_GET_CTRZERO,
  52. // IPCTNL_MSG_CT_GET_STATS_CPU,
  53. // IPCTNL_MSG_CT_GET_STATS,
  54. // IPCTNL_MSG_CT_GET_DYING,
  55. // IPCTNL_MSG_CT_GET_UNCONFIRMED,
  56. //
  57. // IPCTNL_MSG_MAX
  58. // };
  59. const (
  60. IPCTNL_MSG_CT_NEW = 0
  61. IPCTNL_MSG_CT_GET = 1
  62. IPCTNL_MSG_CT_DELETE = 2
  63. )
  64. // #define NFNETLINK_V0 0
  65. const (
  66. NFNETLINK_V0 = 0
  67. )
  68. const (
  69. NLA_F_NESTED uint16 = (1 << 15) // #define NLA_F_NESTED (1 << 15)
  70. NLA_F_NET_BYTEORDER uint16 = (1 << 14) // #define NLA_F_NESTED (1 << 14)
  71. NLA_TYPE_MASK = ^(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
  72. NLA_ALIGNTO uint16 = 4 // #define NLA_ALIGNTO 4
  73. )
  74. // enum ctattr_type {
  75. // CTA_UNSPEC,
  76. // CTA_TUPLE_ORIG,
  77. // CTA_TUPLE_REPLY,
  78. // CTA_STATUS,
  79. // CTA_PROTOINFO,
  80. // CTA_HELP,
  81. // CTA_NAT_SRC,
  82. // #define CTA_NAT CTA_NAT_SRC /* backwards compatibility */
  83. // CTA_TIMEOUT,
  84. // CTA_MARK,
  85. // CTA_COUNTERS_ORIG,
  86. // CTA_COUNTERS_REPLY,
  87. // CTA_USE,
  88. // CTA_ID,
  89. // CTA_NAT_DST,
  90. // CTA_TUPLE_MASTER,
  91. // CTA_SEQ_ADJ_ORIG,
  92. // CTA_NAT_SEQ_ADJ_ORIG = CTA_SEQ_ADJ_ORIG,
  93. // CTA_SEQ_ADJ_REPLY,
  94. // CTA_NAT_SEQ_ADJ_REPLY = CTA_SEQ_ADJ_REPLY,
  95. // CTA_SECMARK, /* obsolete */
  96. // CTA_ZONE,
  97. // CTA_SECCTX,
  98. // CTA_TIMESTAMP,
  99. // CTA_MARK_MASK,
  100. // CTA_LABELS,
  101. // CTA_LABELS_MASK,
  102. // __CTA_MAX
  103. // };
  104. const (
  105. CTA_TUPLE_ORIG = 1
  106. CTA_TUPLE_REPLY = 2
  107. CTA_STATUS = 3
  108. CTA_PROTOINFO = 4
  109. CTA_TIMEOUT = 7
  110. CTA_MARK = 8
  111. CTA_COUNTERS_ORIG = 9
  112. CTA_COUNTERS_REPLY = 10
  113. CTA_USE = 11
  114. CTA_ID = 12
  115. CTA_ZONE = 18
  116. CTA_TIMESTAMP = 20
  117. CTA_LABELS = 22
  118. CTA_LABELS_MASK = 23
  119. )
  120. // enum ctattr_tuple {
  121. // CTA_TUPLE_UNSPEC,
  122. // CTA_TUPLE_IP,
  123. // CTA_TUPLE_PROTO,
  124. // CTA_TUPLE_ZONE,
  125. // __CTA_TUPLE_MAX
  126. // };
  127. // #define CTA_TUPLE_MAX (__CTA_TUPLE_MAX - 1)
  128. const (
  129. CTA_TUPLE_IP = 1
  130. CTA_TUPLE_PROTO = 2
  131. )
  132. // enum ctattr_ip {
  133. // CTA_IP_UNSPEC,
  134. // CTA_IP_V4_SRC,
  135. // CTA_IP_V4_DST,
  136. // CTA_IP_V6_SRC,
  137. // CTA_IP_V6_DST,
  138. // __CTA_IP_MAX
  139. // };
  140. // #define CTA_IP_MAX (__CTA_IP_MAX - 1)
  141. const (
  142. CTA_IP_V4_SRC = 1
  143. CTA_IP_V4_DST = 2
  144. CTA_IP_V6_SRC = 3
  145. CTA_IP_V6_DST = 4
  146. )
  147. // enum ctattr_l4proto {
  148. // CTA_PROTO_UNSPEC,
  149. // CTA_PROTO_NUM,
  150. // CTA_PROTO_SRC_PORT,
  151. // CTA_PROTO_DST_PORT,
  152. // CTA_PROTO_ICMP_ID,
  153. // CTA_PROTO_ICMP_TYPE,
  154. // CTA_PROTO_ICMP_CODE,
  155. // CTA_PROTO_ICMPV6_ID,
  156. // CTA_PROTO_ICMPV6_TYPE,
  157. // CTA_PROTO_ICMPV6_CODE,
  158. // __CTA_PROTO_MAX
  159. // };
  160. // #define CTA_PROTO_MAX (__CTA_PROTO_MAX - 1)
  161. const (
  162. CTA_PROTO_NUM = 1
  163. CTA_PROTO_SRC_PORT = 2
  164. CTA_PROTO_DST_PORT = 3
  165. )
  166. // enum ctattr_protoinfo {
  167. // CTA_PROTOINFO_UNSPEC,
  168. // CTA_PROTOINFO_TCP,
  169. // CTA_PROTOINFO_DCCP,
  170. // CTA_PROTOINFO_SCTP,
  171. // __CTA_PROTOINFO_MAX
  172. // };
  173. // #define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1)
  174. const (
  175. CTA_PROTOINFO_UNSPEC = 0
  176. CTA_PROTOINFO_TCP = 1
  177. CTA_PROTOINFO_DCCP = 2
  178. CTA_PROTOINFO_SCTP = 3
  179. )
  180. // enum ctattr_protoinfo_tcp {
  181. // CTA_PROTOINFO_TCP_UNSPEC,
  182. // CTA_PROTOINFO_TCP_STATE,
  183. // CTA_PROTOINFO_TCP_WSCALE_ORIGINAL,
  184. // CTA_PROTOINFO_TCP_WSCALE_REPLY,
  185. // CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
  186. // CTA_PROTOINFO_TCP_FLAGS_REPLY,
  187. // __CTA_PROTOINFO_TCP_MAX
  188. // };
  189. // #define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1)
  190. const (
  191. CTA_PROTOINFO_TCP_STATE = 1
  192. CTA_PROTOINFO_TCP_WSCALE_ORIGINAL = 2
  193. CTA_PROTOINFO_TCP_WSCALE_REPLY = 3
  194. CTA_PROTOINFO_TCP_FLAGS_ORIGINAL = 4
  195. CTA_PROTOINFO_TCP_FLAGS_REPLY = 5
  196. )
  197. // enum ctattr_counters {
  198. // CTA_COUNTERS_UNSPEC,
  199. // CTA_COUNTERS_PACKETS, /* 64bit counters */
  200. // CTA_COUNTERS_BYTES, /* 64bit counters */
  201. // CTA_COUNTERS32_PACKETS, /* old 32bit counters, unused */
  202. // CTA_COUNTERS32_BYTES, /* old 32bit counters, unused */
  203. // CTA_COUNTERS_PAD,
  204. // __CTA_COUNTERS_M
  205. // };
  206. // #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1)
  207. const (
  208. CTA_COUNTERS_PACKETS = 1
  209. CTA_COUNTERS_BYTES = 2
  210. )
  211. // enum CTA TIMESTAMP TLVs
  212. // CTA_TIMESTAMP_START /* 64bit value */
  213. // CTA_TIMESTAMP_STOP /* 64bit value */
  214. const (
  215. CTA_TIMESTAMP_START = 1
  216. CTA_TIMESTAMP_STOP = 2
  217. )
  218. // /* General form of address family dependent message.
  219. // */
  220. // struct nfgenmsg {
  221. // __u8 nfgen_family; /* AF_xxx */
  222. // __u8 version; /* nfnetlink version */
  223. // __be16 res_id; /* resource id */
  224. // };
  225. type Nfgenmsg struct {
  226. NfgenFamily uint8
  227. Version uint8
  228. ResId uint16 // big endian
  229. }
  230. func (msg *Nfgenmsg) Len() int {
  231. return SizeofNfgenmsg
  232. }
  233. func DeserializeNfgenmsg(b []byte) *Nfgenmsg {
  234. return (*Nfgenmsg)(unsafe.Pointer(&b[0:SizeofNfgenmsg][0]))
  235. }
  236. func (msg *Nfgenmsg) Serialize() []byte {
  237. return (*(*[SizeofNfgenmsg]byte)(unsafe.Pointer(msg)))[:]
  238. }