1
votes

I have a mini listener/daemon to catch SNMP trap. This will listener executed while running the main project (spring web) on tomcat7. But I always got error java.net.BindException: Permission denied

I have try to use authbind (http://java-notes.com/), but my problem not solved. I also had tried to change the port to greater one, but I got error java.net.BindException: Cannot assign requested address

This is my application/trap-receiver code:

@Component
public class TrapReceiver extends Thread implements CommandResponder {

    @Inject
    private ApplicationContext applicationContext;

    @Inject
    private Executor executor;

    public TrapReceiver(){
    }

    List<PDUv1> listPdu = new ArrayList<PDUv1>();
    String message = "";
    long totReceivedTrap = 0;

    @PostConstruct
    public void init() {
        System.out.println("Running trap listener");
        this.start();
    }

    public synchronized void processPdu(CommandResponderEvent cmdRespEvent) {
        PDUv1 pdu = (PDUv1) cmdRespEvent.getPDU();
        listPdu.add(pdu);
        if (pdu != null) {
            if(listPdu.size() == 10){ //10 trap per thread
                List<PDUv1> temp = new ArrayList<PDUv1>();
                temp.addAll(listPdu);
                TrapInsertor trapInsertor = (TrapInsertor) applicationContext.getBean("trapInsertor");
                trapInsertor.setProperty(temp);
                executor.execute(trapInsertor);
                listPdu.clear();
            }
        }
    }

    public void run() {
        while (true) {
            try {
                this.listen(new UdpAddress(getIp()+"/162")); //alamat PDU akan listen
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
    }

    public synchronized void listen(TransportIpAddress address)
            throws IOException {
        AbstractTransportMapping transport;
        if (address instanceof TcpAddress) {
            transport = new DefaultTcpTransportMapping((TcpAddress) address);
        } else {
            transport = new DefaultUdpTransportMapping((UdpAddress) address);
        }

        ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10);
        MessageDispatcher mDispathcher = new MultiThreadedMessageDispatcher(
                threadPool, new MessageDispatcherImpl());

        // add message processing models
        mDispathcher.addMessageProcessingModel(new MPv1());
        mDispathcher.addMessageProcessingModel(new MPv2c());

        // add all security protocols
        SecurityProtocols.getInstance().addDefaultProtocols();
        SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());

        // Create Target
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));

        Snmp snmp = new Snmp(mDispathcher, transport);
        snmp.addCommandResponder(this);

        transport.listen();
        System.out.println("Listening on " + address);

        try {
            this.wait();
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

    //fungsi untuk mendapatkan real ip local (bukan 127.0.0.1)
    public static String getIp(){
        String ipAddress = null;
        Enumeration<NetworkInterface> net = null;
        try {
            net = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            throw new RuntimeException(e);
        }

        while(net.hasMoreElements()){
            NetworkInterface element = net.nextElement();
            Enumeration<InetAddress> addresses = element.getInetAddresses();
            while (addresses.hasMoreElements()){
                InetAddress ip = addresses.nextElement();
                if (ip instanceof Inet4Address){
                    if (ip.isSiteLocalAddress()){
                        ipAddress = ip.getHostAddress();
                    }
                }
            }
        }
        return ipAddress;
    }

}
3
Have you actually changed or added the port in Tomcat's server.xml? otherwise you probably only have 8080 availableDragondraikk
The problem is on my snmp-listener, I want it on at port 162. There is no problem with my tomcat. Or is it also configured in server.xml?Mahadi Siregar
Assuming your TrapReceiver registers with the SNMP server, it will supply its listening address and port number so it doesn't have to be 162. Though if for some other reason, you need to use that port, then I agree with existing answer from @atafar.k1eran
Is it mean that I must configure it in server.xml? Adding port maybe? Sorry newbie :)Mahadi Siregar
How do you today tell the SNMP agent to send traps to your traphandler (SNMP-manager) application ?k1eran

3 Answers

1
votes

You need to be root to bind to a low port on Linux systems. Be sure to run your Java application with sufficient privileges. When connecting to a high port be sure it is not already in use by some other process/service.

See also Binding to a Privileged Port on Debian/Ubuntu about enabling AUTHBIND on Ubuntu.

0
votes

You should be using a port beyond the range of 1024 since they are privileged ports. Try using 1048 and configure the same port in the application when you are providing SNMP Manager details.

0
votes

Permission denied is a common exception, which means that the current user does not have enough accesses to open a port. One solution can be if you change you port number greater than 1024, Ports below 1024 are called Privileged Ports and in Linux (and most UNIX flavors and UNIX-like systems), they are not allowed to be opened by any non-root user.