2016-11-10 344 views
0

我寫了一些代碼在162端口上偵聽。它看起來像以下如何將162端口重定向到1024以上的snmp陷阱的自定義端口?

listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "udp:0.0.0.0/162")); 
TransportMapping transport; 
if (listenAddress instanceof UdpAddress) { 
    transport = new DefaultUdpTransportMapping((UdpAddress) listenAddress); 
} else { 
    transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress); 
} 
snmp = new Snmp(dispatcher, transport); 
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); 
snmp.listen(); 

但是,代碼只能由非root用戶啓動。所以當我運行程序時,出現錯誤。 java.net.bindexception permission denied.

我想162端口重定向到16200。而在我的代碼,我可以這樣調用

listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "udp:0.0.0.0/16200")); 

然後我修改的/ etc/SYSCONFIG/iptables的,但它didn`t工作。以下是iptables的配置。

*nat 
:PREROUTING ACCEPT [1379:235423] 
:POSTROUTING ACCEPT [6:680] 
:OUTPUT ACCEPT [6:680] 
-A PREROUTING -p udp -m udp --dport 162 -j REDIRECT --to-ports 16200 
COMMIT 
# Completed on Thu Nov 10 18:07:25 2016 
# Generated by iptables-save v1.3.5 on Thu Nov 10 18:07:25 2016 
*filter 
:INPUT ACCEPT [38534:3129869] 
:FORWARD ACCEPT [0:0] 
:OUTPUT ACCEPT [2052:284032] 
-A INPUT -p tcp -m tcp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p udp -m udp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 162 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p udp -m udp --dport 162 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p udp -m udp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 162 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p udp -m udp --dport 162 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 16200 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p udp -m udp --dport 16200 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 161 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p udp -m udp --sport 161 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 162 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p udp -m udp --sport 162 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 161 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p udp -m udp --sport 161 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 162 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p udp -m udp --sport 162 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 16200 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p udp -m udp --sport 16200 -m state --state ESTABLISHED -j ACCEPT 
COMMIT 
# Completed on Thu Nov 10 18:07:25 2016 
# Generated by iptables-save v1.3.5 on Thu Nov 10 18:07:25 2016 
*mangle 
:PREROUTING ACCEPT [39240:3206748] 
:INPUT ACCEPT [38535:3129909] 
:FORWARD ACCEPT [0:0] 
:OUTPUT ACCEPT [2052:284032] 
:POSTROUTING ACCEPT [2052:284032] 
COMMIT 

如何配置iptables,以便我可以在16200端口獲得陷阱消息?或者有沒有其他方法可以做到這一點?

我很困惑。請給我一些建議。謝謝!

回答

0

您必須正確配置iptables才能將所有傳入的UDP數據包從端口162轉發到用戶定義的端口(>1024)。

sudo iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 162 -j REDIRECT --to-port 5678 

您應該用正確的網絡接口名稱替換enp0s3。使用ifconfig查找以太網接口的名稱。通常 - eth0。在這個例子中,來自端口162的所有傳入UDP數據包將被轉發到UDP端口5678

+0

是的,在我的測試環境中,一切正常。但在我的雙網卡綁定環境中,它並不奏效。我想我應該爲iptables命令添加「-i bound0」。當我們的環境可用時,我會在下週嘗試。 – Wendy