home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / sbin / ipchains-save < prev    next >
Text File  |  1998-12-05  |  4KB  |  174 lines

  1. #! /bin/bash
  2.  
  3. MYVERSION="1.0.3"
  4.  
  5. help()
  6. {
  7.     exec 1>&2
  8.     echo `basename $0` v$MYVERSION: Script to save firewall chains to stdout.
  9.     echo
  10.     echo "   Takes an optional chain-name (used to save a single chain), otherwise"
  11.     echo "      it saves all chains."
  12.     echo "   With the -v option, prints out every rule."
  13.  
  14.     exit 1
  15. }
  16.  
  17. dotted()
  18. {
  19.     echo $((($1 >> 24) & 0xFF)).$((($1 >> 16) & 0xFF)).$((($1 >> 8) & 0xFF)).$(($1 & 0xFF))
  20. }
  21.  
  22. genip()
  23. {
  24.     IP=0x`echo $1 | sed 's:/.*::'`
  25.     MASK=0x`echo $1 | sed 's:.*/::'`
  26.     echo `dotted $IP`/`dotted $MASK`
  27. }
  28.  
  29. WHICHCHAIN=""
  30. VERBOSE=0
  31. IP_CHAINS_FILE=/proc/net/ip_fwchains
  32. #IP_CHAINS_FILE=ip_fwchains.dummy
  33.  
  34. IP_CHAINNAMES_FILE=/proc/net/ip_fwnames
  35. #IP_CHAINNAMES_FILE=ip_fwnames.dummy
  36.  
  37. for arg
  38. do
  39.     case "$arg"
  40.     in
  41.     -v) VERBOSE=1 ;;
  42.     -*) help ;;
  43.     *) if [ x"$WHICHCHAIN" != x ]; then help; fi; WHICHCHAIN="$arg" ;;
  44.     esac
  45. done
  46.  
  47. if [ ! -f $IP_CHAINS_FILE ]
  48. then
  49.     exec 1>&2
  50.     echo \`$IP_CHAINS_FILE\' does not exist.
  51.     echo \(Does this kernel support IP Firewall Chains\?\)
  52.     exit 1
  53. fi
  54.  
  55. # "%9s "            /* Chain name */
  56. # "%08lX/%08lX->%08lX/%08lX "    /* Source & Destination IPs */
  57. # "%.16s "            /* Interface */
  58. # "%hX %hX "            /* fw_flg and fw_invflg fields */
  59. # "%hu "            /* Protocol */
  60. # "%-9lu %-9lu %-9lu %-9lu "    /* Packet & byte counters */
  61. # "%hu-%hu %hu-%hu "        /* Source & Dest port ranges */
  62. # "A%02X X%02X "        /* TOS and and xor masks */
  63. # "%08X "            /* Redirection port */
  64. # "%hu "            /* fw_mark field */
  65. # "%hu "            /* output size */
  66. # "%9s\n",            /* Target */
  67.  
  68. LASTCHAIN=" "
  69.  
  70. # Do chain names first.
  71. dd if=$IP_CHAINNAMES_FILE bs=1024 2>/dev/null | while read CHN POL REFCNT
  72. do
  73.     if [ -z "$WHICHCHAIN" -o x"$WHICHCHAIN" = x"$CHN" ]
  74.     then
  75.     echo ":$CHN $POL"
  76.     fi
  77. done
  78.  
  79. dd if=$IP_CHAINS_FILE bs=1024 2>/dev/null |
  80. while read CHAIN SRCDST IFACE FLG INVFLG PROTO IGN1 IGN2 IGN3 IGN4 SRCPT DSTPT TOSAND TOSXOR REDIR MARK OUTSIZE TARGET
  81. do
  82.     if [ -z "$WHICHCHAIN" -o x"$WHICHCHAIN" = x"$CHAIN" ]
  83.     then
  84.     if [ "$CHAIN" != "$LASTCHAIN" ]
  85.     then
  86.         echo Saving \`$CHAIN\'. 1>&2
  87.         LASTCHAIN=$CHAIN
  88.     fi
  89.  
  90.     echo -n "-A $CHAIN "
  91.     LINE=""
  92.     if [ "$SRCPT" = "0-65535" ]
  93.     then 
  94.         SRCPT=""
  95.     else 
  96.         SRCPT=`echo $SRCPT | sed s/-/:/`
  97.         let $((0x$INVFLG & 0x0008)) && SRCPT="! $SRCPT"
  98.     fi
  99.     LINE="$LINE -s"
  100.     let $((0x$INVFLG & 0x0001)) && LINE="$LINE !"
  101.     IPADDR=`genip \`echo $SRCDST | sed 's/->.*//'\``
  102.     LINE="$LINE $IPADDR $SRCPT "
  103.  
  104.     if [ "$DSTPT" = "0-65535" ]
  105.     then 
  106.         DSTPT=""
  107.     else 
  108.         DSTPT=`echo $DSTPT | sed s/-/:/`
  109.         let $((0x$INVFLG & 0x0010)) && DSTPT="! $DSTPT"
  110.     fi
  111.     LINE="$LINE -d"
  112.     let $((0x$INVFLG & 0x0002)) && LINE="$LINE !"
  113.     IPADDR=`genip \`echo $SRCDST | sed 's/.*->//'\``
  114.     LINE="$LINE $IPADDR $DSTPT"
  115.  
  116.     if [ x"$IFACE" != x- ]
  117.     then
  118.         LINE="$LINE -i"
  119.         let $((0x$INVFLG & 0x0020)) && LINE="$LINE !"
  120.         let $((0x$FLG & 0x0010)) && IFACE=${IFACE}+
  121.         LINE="$LINE $IFACE "
  122.     fi
  123.     if [ $PROTO -ne 0 ]
  124.     then
  125.         LINE="$LINE -p"
  126.         let $((0x$INVFLG & 0x0004)) && LINE="$LINE !"
  127.         LINE="$LINE $PROTO"
  128.     fi
  129.     if [ "$TOSAND $TOSXOR" != "AFF X00" ]
  130.     then
  131.         LINE="$LINE -t `echo $TOSAND $TOSXOR | sed 's/.\([0-9A-Fa-f][0-9A-Fa-f]\)/\1/g'`"
  132.     fi
  133.     if [ x"$TARGET" = xREDIRECT ]
  134.     then
  135.         LINE="$LINE -j $TARGET $((0x$REDIR))"
  136.     elif [ x"$TARGET" != x- ]
  137.     then 
  138.         LINE="$LINE -j $TARGET"
  139.     fi
  140.  
  141.     # Flag analysis.  Thank Gnu for bash.
  142.     let $((0x$FLG & 0x0001)) && LINE="$LINE -l"
  143.     if let $((0x$FLG & 0x0002))
  144.     then
  145.         let $((0x$INVFLG & 0x0040)) && LINE="$LINE !"
  146.         LINE="$LINE -y"
  147.     fi
  148.     if let $((0x$FLG & 0x0004))
  149.     then
  150.         let $((0x$INVFLG & 0x0080)) && LINE="$LINE !"
  151.         LINE="$LINE -f"
  152.     fi
  153.     if let $((0x$FLG & 0x0008))
  154.     then
  155.         LINE="$LINE -m $MARK"
  156.     elif [ "$MARK" -ne 0 ]
  157.     then
  158.         # Bash `feature'.  Woohoo!
  159.         if let $(($MARK < 0))
  160.         then 
  161.         LINE="$LINE -m $(($MARK))"
  162.         else
  163.         LINE="$LINE -m +$(($MARK))"
  164.         fi
  165.     fi
  166.     if let $((0x$FLG & 0x0020))
  167.     then
  168.         LINE="$LINE -o $OUTSIZE"
  169.     fi
  170.     echo $LINE
  171.     if [ $VERBOSE != 0 ]; then echo $LINE 1>&2; fi
  172.     fi
  173. done
  174.