1 /* 2 * Copyright (c) 1993 Daniel Boulet 3 * Copyright (c) 1994 Ugen J.S.Antsilevich 4 * 5 * Redistribution and use in source forms, with and without modification, 6 * are permitted provided that this entire comment appears intact. 7 * 8 * Redistribution in binary form may occur without any restrictions. 9 * Obviously, it would be nice if you gave credit where credit is due 10 * but requiring it would be too onerous. 11 * 12 * This software is provided ``AS IS'' without any warranties of any kind. 13 * 14 * $FreeBSD$ 15 */ 16 17 #ifndef _IP_FW_H 18 #define _IP_FW_H 19 20 #include <sys/queue.h> 21 22 /* 23 * This union structure identifies an interface, either explicitly 24 * by name or implicitly by IP address. The flags IP_FW_F_IIFNAME 25 * and IP_FW_F_OIFNAME say how to interpret this structure. An 26 * interface unit number of -1 matches any unit number, while an 27 * IP address of 0.0.0.0 indicates matches any interface. 28 * 29 * The receive and transmit interfaces are only compared against the 30 * the packet if the corresponding bit (IP_FW_F_IIFACE or IP_FW_F_OIFACE) 31 * is set. Note some packets lack a receive or transmit interface 32 * (in which case the missing "interface" never matches). 33 */ 34 35 union ip_fw_if { 36 struct in_addr fu_via_ip; /* Specified by IP address */ 37 struct { /* Specified by interface name */ 38 #define FW_IFNLEN 10 /* need room ! was IFNAMSIZ */ 39 char name[FW_IFNLEN]; 40 short unit; /* -1 means match any unit */ 41 } fu_via_if; 42 }; 43 44 /* 45 * Format of an IP firewall descriptor 46 * 47 * fw_src, fw_dst, fw_smsk, fw_dmsk are always stored in network byte order. 48 * fw_flg and fw_n*p are stored in host byte order (of course). 49 * Port numbers are stored in HOST byte order. 50 */ 51 52 struct ip_fw { 53 LIST_ENTRY(ip_fw) next; /* bidirectional list of rules */ 54 u_int fw_flg; /* Operational Flags word */ 55 u_int64_t fw_pcnt; /* Packet counters */ 56 u_int64_t fw_bcnt; /* Byte counters */ 57 struct in_addr fw_src; /* Source IP address */ 58 struct in_addr fw_dst; /* Destination IP address */ 59 struct in_addr fw_smsk; /* Mask for source IP address */ 60 struct in_addr fw_dmsk; /* Mask for destination address */ 61 u_short fw_number; /* Rule number */ 62 u_char fw_prot; /* IP protocol */ 63 #if 1 64 u_char fw_nports; /* # of src/dst port in array */ 65 #define IP_FW_GETNSRCP(rule) ((rule)->fw_nports & 0x0f) 66 #define IP_FW_SETNSRCP(rule, n) do { \ 67 (rule)->fw_nports &= ~0x0f; \ 68 (rule)->fw_nports |= (n); \ 69 } while (0) 70 #define IP_FW_GETNDSTP(rule) ((rule)->fw_nports >> 4) 71 #define IP_FW_SETNDSTP(rule, n) do { \ 72 (rule)->fw_nports &= ~0xf0; \ 73 (rule)->fw_nports |= (n) << 4;\ 74 } while (0) 75 #define IP_FW_HAVEPORTS(rule) ((rule)->fw_nports != 0) 76 #else 77 u_char __pad[1]; 78 u_int _nsrcp; 79 u_int _ndstp; 80 #define IP_FW_GETNSRCP(rule) (rule)->_nsrcp 81 #define IP_FW_SETNSRCP(rule,n) (rule)->_nsrcp = n 82 #define IP_FW_GETNDSTP(rule) (rule)->_ndstp 83 #define IP_FW_SETNDSTP(rule,n) (rule)->_ndstp = n 84 #define IP_FW_HAVEPORTS(rule) ((rule)->_ndstp + (rule)->_nsrcp != 0) 85 #endif 86 #define IP_FW_MAX_PORTS 10 /* A reasonable maximum */ 87 union { 88 u_short fw_pts[IP_FW_MAX_PORTS]; /* port numbers to match */ 89 #define IP_FW_ICMPTYPES_MAX 128 90 #define IP_FW_ICMPTYPES_DIM (IP_FW_ICMPTYPES_MAX / (sizeof(unsigned) * 8)) 91 unsigned fw_icmptypes[IP_FW_ICMPTYPES_DIM]; /*ICMP types bitmap*/ 92 } fw_uar; 93 94 u_int fw_ipflg; /* IP flags word */ 95 u_short fw_iplen; /* IP length */ 96 u_short fw_ipid; /* Identification */ 97 u_char fw_ipopt; /* IP options set */ 98 u_char fw_ipnopt; /* IP options unset */ 99 u_char fw_iptos; /* IP type of service set */ 100 u_char fw_ipntos; /* IP type of service unset */ 101 u_char fw_ipttl; /* IP time to live */ 102 u_int fw_ipver:4; /* IP version */ 103 u_char fw_tcpopt; /* TCP options set */ 104 u_char fw_tcpnopt; /* TCP options unset */ 105 u_char fw_tcpf; /* TCP flags set */ 106 u_char fw_tcpnf; /* TCP flags unset */ 107 u_short fw_tcpwin; /* TCP window size */ 108 u_int32_t fw_tcpseq; /* TCP sequence */ 109 u_int32_t fw_tcpack; /* TCP acknowledgement */ 110 long timestamp; /* timestamp (tv_sec) of last match */ 111 union ip_fw_if fw_in_if; /* Incoming interfaces */ 112 union ip_fw_if fw_out_if; /* Outgoing interfaces */ 113 union { 114 u_short fu_divert_port; /* Divert/tee port (options IPDIVERT) */ 115 u_short fu_pipe_nr; /* queue number (option DUMMYNET) */ 116 u_short fu_skipto_rule; /* SKIPTO command rule number */ 117 u_short fu_reject_code; /* REJECT response code */ 118 struct sockaddr_in fu_fwd_ip; 119 } fw_un; 120 void *pipe_ptr; /* flow_set ptr for dummynet pipe */ 121 void *next_rule_ptr; /* next rule in case of match */ 122 uid_t fw_uid; /* uid to match */ 123 gid_t fw_gid; /* gid to match */ 124 int fw_logamount; /* amount to log */ 125 u_int64_t fw_loghighest; /* highest number packet to log */ 126 127 long dont_match_prob; /* 0x7fffffff means 1.0, always fail */ 128 u_char dyn_type; /* type for dynamic rule */ 129 130 #define DYN_KEEP_STATE 0 /* type for keep-state rules */ 131 #define DYN_LIMIT 1 /* type for limit connection rules */ 132 #define DYN_LIMIT_PARENT 2 /* parent entry for limit connection rules */ 133 134 /* following two fields are used to limit number of connections 135 * basing on either src, srcport, dst, dstport. 136 */ 137 u_char limit_mask; /* mask type for limit rule, can 138 * have many. 139 */ 140 #define DYN_SRC_ADDR 0x1 141 #define DYN_SRC_PORT 0x2 142 #define DYN_DST_ADDR 0x4 143 #define DYN_DST_PORT 0x8 144 145 u_short conn_limit; /* # of connections for limit rule */ 146 }; 147 148 #define fw_divert_port fw_un.fu_divert_port 149 #define fw_skipto_rule fw_un.fu_skipto_rule 150 #define fw_reject_code fw_un.fu_reject_code 151 #define fw_pipe_nr fw_un.fu_pipe_nr 152 #define fw_fwd_ip fw_un.fu_fwd_ip 153 154 /* 155 * 156 * rule_ptr -------------+ 157 * V 158 * [ next.le_next ]---->[ next.le_next ]---- [ next.le_next ]---> 159 * [ next.le_prev ]<----[ next.le_prev ]<----[ next.le_prev ]<--- 160 * [ <ip_fw> body ] [ <ip_fw> body ] [ <ip_fw> body ] 161 * 162 */ 163 164 /* 165 * Flow mask/flow id for each queue. 166 */ 167 struct ipfw_flow_id { 168 u_int32_t dst_ip; 169 u_int32_t src_ip; 170 u_int16_t dst_port; 171 u_int16_t src_port; 172 u_int8_t proto; 173 u_int8_t flags; /* protocol-specific flags */ 174 }; 175 176 /* 177 * dynamic ipfw rule 178 */ 179 struct ipfw_dyn_rule { 180 struct ipfw_dyn_rule *next; 181 struct ipfw_flow_id id; /* (masked) flow id */ 182 struct ip_fw *rule; /* pointer to rule */ 183 struct ipfw_dyn_rule *parent; /* pointer to parent rule */ 184 u_int32_t expire; /* expire time */ 185 u_int64_t pcnt; /* packet match counters */ 186 u_int64_t bcnt; /* byte match counters */ 187 u_int32_t bucket; /* which bucket in hash table */ 188 u_int32_t state; /* state of this rule (typically a 189 * combination of TCP flags) 190 */ 191 u_int16_t dyn_type; /* rule type */ 192 u_int16_t count; /* refcount */ 193 }; 194 195 /* 196 * Values for "flags" field . 197 */ 198 #define IP_FW_F_COMMAND 0x000000ff /* Mask for type of chain entry: */ 199 #define IP_FW_F_DENY 0x00000000 /* This is a deny rule */ 200 #define IP_FW_F_REJECT 0x00000001 /* Deny and send a response packet */ 201 #define IP_FW_F_ACCEPT 0x00000002 /* This is an accept rule */ 202 #define IP_FW_F_COUNT 0x00000003 /* This is a count rule */ 203 #define IP_FW_F_DIVERT 0x00000004 /* This is a divert rule */ 204 #define IP_FW_F_TEE 0x00000005 /* This is a tee rule */ 205 #define IP_FW_F_SKIPTO 0x00000006 /* This is a skipto rule */ 206 #define IP_FW_F_FWD 0x00000007 /* This is a "change forwarding 207 * address" rule 208 */ 209 #define IP_FW_F_PIPE 0x00000008 /* This is a dummynet rule */ 210 #define IP_FW_F_QUEUE 0x00000009 /* This is a dummynet queue */ 211 212 #define IP_FW_F_IN 0x00000100 /* Check inbound packets */ 213 #define IP_FW_F_OUT 0x00000200 /* Check outbound packets */ 214 #define IP_FW_F_IIFACE 0x00000400 /* Apply inbound interface test */ 215 #define IP_FW_F_OIFACE 0x00000800 /* Apply outbound interface test */ 216 #define IP_FW_F_PRN 0x00001000 /* Print if this rule matches */ 217 #define IP_FW_F_SRNG 0x00002000 /* The first two src ports are a min 218 * and max range (stored in host byte 219 * order). 220 */ 221 #define IP_FW_F_DRNG 0x00004000 /* The first two dst ports are a min 222 * and max range (stored in host byte 223 * order). 224 */ 225 #define IP_FW_F_FRAG 0x00008000 /* Fragment */ 226 #define IP_FW_F_IIFNAME 0x00010000 /* In interface by name/unit (not IP) */ 227 #define IP_FW_F_OIFNAME 0x00020000 /* Out interface by name/unit (not IP)*/ 228 #define IP_FW_F_INVSRC 0x00040000 /* Invert sense of src check */ 229 #define IP_FW_F_INVDST 0x00080000 /* Invert sense of dst check */ 230 #define IP_FW_F_ICMPBIT 0x00100000 /* ICMP type bitmap is valid */ 231 #define IP_FW_F_UID 0x00200000 /* filter by uid */ 232 #define IP_FW_F_GID 0x00400000 /* filter by gid */ 233 #define IP_FW_F_RND_MATCH 0x00800000 /* probabilistic rule match */ 234 #define IP_FW_F_SMSK 0x01000000 /* src-port + mask */ 235 #define IP_FW_F_DMSK 0x02000000 /* dst-port + mask */ 236 #define IP_FW_BRIDGED 0x04000000 /* only match bridged packets */ 237 #define IP_FW_F_KEEP_S 0x08000000 /* keep state */ 238 #define IP_FW_F_CHECK_S 0x10000000 /* check state */ 239 #define IP_FW_F_SME 0x20000000 /* source = me */ 240 #define IP_FW_F_DME 0x40000000 /* destination = me */ 241 242 #define IP_FW_F_MASK 0x7FFFFFFF /* All possible flag bits mask */ 243 244 /* 245 * Flags for the 'fw_ipflg' field, for comparing values 246 * of ip and its protocols. 247 */ 248 #define IP_FW_IF_TCPOPT 0x00000001 /* tcp options */ 249 #define IP_FW_IF_TCPFLG 0x00000002 /* tcp flags */ 250 #define IP_FW_IF_TCPSEQ 0x00000004 /* tcp sequence number */ 251 #define IP_FW_IF_TCPACK 0x00000008 /* tcp acknowledgement number */ 252 #define IP_FW_IF_TCPWIN 0x00000010 /* tcp window size */ 253 #define IP_FW_IF_TCPEST 0x00000020 /* established TCP connection */ 254 #define IP_FW_IF_TCPMSK 0x0000003f /* mask of all tcp values */ 255 #define IP_FW_IF_IPOPT 0x00000100 /* ip options */ 256 #define IP_FW_IF_IPLEN 0x00000200 /* ip length */ 257 #define IP_FW_IF_IPID 0x00000400 /* ip identification */ 258 #define IP_FW_IF_IPTOS 0x00000800 /* ip type of service */ 259 #define IP_FW_IF_IPTTL 0x00001000 /* ip time to live */ 260 #define IP_FW_IF_IPVER 0x00002000 /* ip version */ 261 #define IP_FW_IF_IPMSK 0x00003f00 /* mask of all ip values */ 262 #define IP_FW_IF_MSK 0x0000ffff /* All possible bits mask */ 263 264 /* 265 * For backwards compatibility with rules specifying "via iface" but 266 * not restricted to only "in" or "out" packets, we define this combination 267 * of bits to represent this configuration. 268 */ 269 270 #define IF_FW_F_VIAHACK (IP_FW_F_IN|IP_FW_F_OUT|IP_FW_F_IIFACE|IP_FW_F_OIFACE) 271 272 /* 273 * Definitions for REJECT response codes. 274 * Values less than 256 correspond to ICMP unreachable codes. 275 */ 276 #define IP_FW_REJECT_RST 0x0100 /* TCP packets: send RST */ 277 278 /* 279 * Definitions for IP option names. 280 */ 281 #define IP_FW_IPOPT_LSRR 0x01 282 #define IP_FW_IPOPT_SSRR 0x02 283 #define IP_FW_IPOPT_RR 0x04 284 #define IP_FW_IPOPT_TS 0x08 285 286 /* 287 * Definitions for TCP option names. 288 */ 289 #define IP_FW_TCPOPT_MSS 0x01 290 #define IP_FW_TCPOPT_WINDOW 0x02 291 #define IP_FW_TCPOPT_SACK 0x04 292 #define IP_FW_TCPOPT_TS 0x08 293 #define IP_FW_TCPOPT_CC 0x10 294 295 /* 296 * Definitions for TCP flags. 297 */ 298 #define IP_FW_TCPF_FIN TH_FIN 299 #define IP_FW_TCPF_SYN TH_SYN 300 #define IP_FW_TCPF_RST TH_RST 301 #define IP_FW_TCPF_PSH TH_PUSH 302 #define IP_FW_TCPF_ACK TH_ACK 303 #define IP_FW_TCPF_URG TH_URG 304 305 /* 306 * Main firewall chains definitions and global var's definitions. 307 */ 308 #ifdef _KERNEL 309 310 #define IP_FW_PORT_DYNT_FLAG 0x10000 311 #define IP_FW_PORT_TEE_FLAG 0x20000 312 #define IP_FW_PORT_DENY_FLAG 0x40000 313 314 /* 315 * Function definitions. 316 */ 317 void ip_fw_init __P((void)); 318 319 /* Firewall hooks */ 320 struct ip; 321 struct sockopt; 322 typedef int ip_fw_chk_t (struct ip **, int, struct ifnet *, u_int16_t *, 323 struct mbuf **, struct ip_fw **, struct sockaddr_in **); 324 typedef int ip_fw_ctl_t (struct sockopt *); 325 extern ip_fw_chk_t *ip_fw_chk_ptr; 326 extern ip_fw_ctl_t *ip_fw_ctl_ptr; 327 extern int fw_one_pass; 328 extern int fw_enable; 329 extern struct ipfw_flow_id last_pkt; 330 #define IPFW_LOADED (ip_fw_chk_ptr != NULL) 331 #endif /* _KERNEL */ 332 333 #endif /* _IP_FW_H */ 334