1 2 /* 3 * Copyright (C) 2012 by Darren Reed. 4 * 5 * See the IPFILTER.LICENCE file for details on licencing. 6 * 7 * Added redirect stuff and a variety of bug fixes. (mcn@EnGarde.com) 8 */ 9 10 #include "ipf.h" 11 12 13 #if !defined(lint) 14 static const char rcsid[] = "@(#)$Id$"; 15 #endif 16 17 static int proto_opened = 0; 18 19 void 20 printactivenat(nat_t *nat, int opts, u_long ticks) 21 { 22 struct protoent *pproto; 23 24 if (proto_opened == 0) { 25 proto_opened = 1; 26 setprotoent(1); 27 } 28 29 PRINTF("%s", getnattype(nat)); 30 31 if (nat->nat_flags & SI_CLONE) 32 PRINTF(" CLONE"); 33 if (nat->nat_phnext[0] == NULL && nat->nat_phnext[1] == NULL) 34 PRINTF(" ORPHAN"); 35 36 putchar(' '); 37 if (nat->nat_redir & NAT_REWRITE) { 38 printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_osrc6, 39 nat->nat_ifnames[0]); 40 41 if ((nat->nat_flags & IPN_TCPUDP) != 0) 42 PRINTF(" %-5hu", ntohs(nat->nat_osport)); 43 44 putchar(' '); 45 printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_odst6, 46 nat->nat_ifnames[0]); 47 48 if ((nat->nat_flags & IPN_TCPUDP) != 0) 49 PRINTF(" %-5hu", ntohs(nat->nat_odport)); 50 51 PRINTF("<- -> "); 52 printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_nsrc6, 53 nat->nat_ifnames[0]); 54 55 if ((nat->nat_flags & IPN_TCPUDP) != 0) 56 PRINTF(" %-5hu", ntohs(nat->nat_nsport)); 57 58 putchar(' '); 59 printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_ndst6, 60 nat->nat_ifnames[0]); 61 if ((nat->nat_flags & IPN_TCPUDP) != 0) 62 PRINTF(" %-5hu", ntohs(nat->nat_ndport)); 63 64 pproto = getprotobynumber(nat->nat_pr[0]); 65 PRINTF(" %s", pproto->p_name); 66 67 } else if (nat->nat_dir == NAT_OUTBOUND) { 68 printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_osrc6, 69 nat->nat_ifnames[0]); 70 71 if ((nat->nat_flags & IPN_TCPUDP) != 0) 72 PRINTF(" %-5hu", ntohs(nat->nat_osport)); 73 74 PRINTF(" <- -> "); 75 printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_nsrc6, 76 nat->nat_ifnames[0]); 77 78 if ((nat->nat_flags & IPN_TCPUDP) != 0) 79 PRINTF(" %-5hu", ntohs(nat->nat_nsport)); 80 81 PRINTF(" ["); 82 printactiveaddress(nat->nat_v[0], "%s", &nat->nat_odst6, 83 nat->nat_ifnames[0]); 84 85 if ((nat->nat_flags & IPN_TCPUDP) != 0) 86 PRINTF(" %hu", ntohs(nat->nat_odport)); 87 PRINTF("]"); 88 89 pproto = getprotobynumber(nat->nat_pr[1]); 90 PRINTF(" %s", pproto->p_name); 91 } else { 92 printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_ndst6, 93 nat->nat_ifnames[0]); 94 95 if ((nat->nat_flags & IPN_TCPUDP) != 0) 96 PRINTF(" %-5hu", ntohs(nat->nat_ndport)); 97 98 PRINTF(" <- -> "); 99 printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_odst6, 100 nat->nat_ifnames[0]); 101 102 if ((nat->nat_flags & IPN_TCPUDP) != 0) 103 PRINTF(" %-5hu", ntohs(nat->nat_odport)); 104 105 PRINTF(" ["); 106 printactiveaddress(nat->nat_v[0], "%s", &nat->nat_osrc6, 107 nat->nat_ifnames[0]); 108 109 if ((nat->nat_flags & IPN_TCPUDP) != 0) 110 PRINTF(" %hu", ntohs(nat->nat_osport)); 111 PRINTF("]"); 112 113 pproto = getprotobynumber(nat->nat_pr[0]); 114 PRINTF(" %s", pproto->p_name); 115 } 116 117 118 if (opts & OPT_VERBOSE) { 119 PRINTF("\n\tttl %lu use %hu sumd %s/", 120 nat->nat_age - ticks, nat->nat_use, 121 getsumd(nat->nat_sumd[0])); 122 PRINTF("%s pr %u/%u hash %u/%u flags %x\n", 123 getsumd(nat->nat_sumd[1]), 124 nat->nat_pr[0], nat->nat_pr[1], 125 nat->nat_hv[0], nat->nat_hv[1], nat->nat_flags); 126 PRINTF("\tifp %s,%s ", FORMAT_IF(nat->nat_ifnames[0]), 127 FORMAT_IF(nat->nat_ifnames[1])); 128 #ifdef USE_QUAD_T 129 PRINTF("bytes %"PRIu64"/%"PRIu64" pkts %"PRIu64"/%"PRIu64"", 130 (unsigned long long)nat->nat_bytes[0], 131 (unsigned long long)nat->nat_bytes[1], 132 (unsigned long long)nat->nat_pkts[0], 133 (unsigned long long)nat->nat_pkts[1]); 134 #else 135 PRINTF("bytes %lu/%lu pkts %lu/%lu", nat->nat_bytes[0], 136 nat->nat_bytes[1], nat->nat_pkts[0], nat->nat_pkts[1]); 137 #endif 138 PRINTF(" ipsumd %x", nat->nat_ipsumd); 139 } 140 141 if (opts & OPT_DEBUG) { 142 PRINTF("\n\tnat_next %p _pnext %p _hm %p\n", 143 nat->nat_next, nat->nat_pnext, nat->nat_hm); 144 PRINTF("\t_hnext %p/%p _phnext %p/%p\n", 145 nat->nat_hnext[0], nat->nat_hnext[1], 146 nat->nat_phnext[0], nat->nat_phnext[1]); 147 PRINTF("\t_data %p _me %p _state %p _aps %p\n", 148 nat->nat_data, nat->nat_me, nat->nat_state, 149 nat->nat_aps); 150 PRINTF("\tfr %p ptr %p ifps %p/%p sync %p\n", 151 nat->nat_fr, nat->nat_ptr, nat->nat_ifps[0], 152 nat->nat_ifps[1], nat->nat_sync); 153 PRINTF("\ttqe:pnext %p next %p ifq %p parent %p/%p\n", 154 nat->nat_tqe.tqe_pnext, nat->nat_tqe.tqe_next, 155 nat->nat_tqe.tqe_ifq, nat->nat_tqe.tqe_parent, nat); 156 PRINTF("\ttqe:die %d touched %d flags %x state %d/%d\n", 157 nat->nat_tqe.tqe_die, nat->nat_tqe.tqe_touched, 158 nat->nat_tqe.tqe_flags, nat->nat_tqe.tqe_state[0], 159 nat->nat_tqe.tqe_state[1]); 160 } 161 putchar('\n'); 162 } 163