TUT:source spoofing
From Net-SNMP Wiki
Revision as of 16:01, 21 March 2012 by Rstory (Talk | contribs) (Created page with "If you need to send traps with an address other than one configured on one of your interfaces, you need to use a firewall to change the address in the packet once it has been sen...")
If you need to send traps with an address other than one configured on one of your interfaces, you need to use a firewall to change the address in the packet once it has been sent. On Linux, this can be done with iptables NAT rules.
A user has contributed the following script, which dynamically creates/removes iptables rules as needed.
$ snmptrap-from [Source address] [snmpTrapOID] and possible parameter(s)
where snmptrap-from is a script which :
- adds POSTROUTING chain rules to set the give source ip for a trap sent to a (harcoded) destination
- calls snmptrap to send the trap
The script is:
#!/bin/bash # ---------------------------------------------------------------------------------------- # This is a quick and dirty solution to allow sending snmp # version 2 traps pretending that the trap comes from the equipment supposed # to send it (The receiver MUST beleive that it comes from the real equipment). # # The only solution that was proposed (and possible) was source IP spoofing. # As suggested by other contributors, the solution would be in using iptables # (Mangle tables were proposed but this would not work) on the linux box # where we originate the trap. # # The solution was to write a little front-end script that would take the required snmptrap # parameters (the default values needed by Zeljko being hard coded in the script) + the # required source IP address for the trap (the IP address that we will do spoofing with). # # The script must be run by 'root' user because it must manipulate the iptables. # The snmptrap command path must be in the calling user $PATH variable. # # The script is overly simple, does not properly handle STRING parameters that should # contain spaces and is certainly lacking other 'features'. It should, however, give # you the idea ... # # ---------------------------------------------------------------------------------------- TRAP_RECEIVER="10.140.20.69" TRAP_FIXED_PARAMS="-v 2c -c public" # For some cloured outputs .... ESC=`echo -e "\e"` red="${ESC}[31m" green="${ESC}[32m" norm="${ESC}[0m" # Must be run as root because it must modify ip tables if [ `whoami` != "root" ] then cat <<EOF $red Error: You must be root to use this command ! Please execute 'sudo bash' first... $norm EOF exit 1 fi if [ $# -lt 2 ] then cat <<EOF $red Error: This command requires arguments ! Arg 1: should be the trap source address (equipment address) Arg 2 to Arg n: should be arguments valid for the 'snmptrap -v 2c' command $norm EOF exit 1 fi # Simple, no checks on the parameter ! If it is not a proper IP, the iptables command will choke # and give an error description. SRC=$1 shift # get rid of the first parameter (Source IP) # and let the snmptrap check the rest # Note: parameters like 's "This is a string"' or # 's \"This is a string\"' will not work. # Use 's This_is_a_string' or, if you need spaces, then correct this script ... # Rule insertion iptables -t nat -A POSTROUTING -d $TRAP_RECEIVER -p udp --dport 162 -j SNAT --to $SRC rc=$? if [ $rc -ne 0 ] then cat <<EOF $red Error: iptables rules installation failed. You probably did not supply a proper source IP address. Please refer to the error messages from the iptables command above ... $norm EOF # for extra safety ! iptables -t nat -A POSTROUTING -d $TRAP_RECEIVER -p udp --dport 162 -j SNAT --to $SRC &>/dev/null exit 1 fi snmptrap $TRAP_FIXED_PARAMS $TRAP_RECEIVER '' $* rc=$? if [ $rc -ne 0 ] then cat <<EOF $red Error: snmptrap command failed !!! Trap was not sent. Please refer to the error messages from the snmptrap command above ... $norm EOF else cat <<EOF $green Command OK. It was sent as: snmptrap $TRAP_FIXED_PARAMS $TRAP_RECEIVER '' $* $norm EOF fi # Leave some time to be sure snmptrap went thru iptables filters [ $rc -eq 0 ] && sleep 2 # Remove the current rules iptables -t nat -D POSTROUTING -d ${TRAP_RECEIVER} -p udp --dport 162 -j SNAT --to $SRC exit $rc