防火墙已开放端口却telnet不通

cross-fire 2017-03-20 06:01:10
B机器上的/etc/sysconfig/iptables文件开放了如下端口:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2793 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

在A机器上telnet6379是可以的,但是telnet2793就不行了。报错是:
Trying 133.64.36.249...
telnet: connect to address 133.64.36.249: Connection refused

各位大虾帮忙看看什么原因。
PS:6379上有个在用的服务;2793端口是其他系统向这个端口推送UDP协议数据,需要开放用来做socket监听,监听代码里指定了要监听2793,但是在源头上都telnet不通。即便是A/B两台机器的防火墙都关了,也还是一样的结果。
...全文
43794 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小杰8025 2018-01-17
  • 打赏
  • 举报
回复
遇到了同样的问题,老铁,解决不了了
cross-fire 2017-03-28
  • 打赏
  • 举报
回复
思路和代码都没问题。原因在于云资源虚拟机的上层管理做了限制,具体我也不懂,把限制去掉,防火墙里加上一条规则:-A INPUT -m state --state NEW -m udp -p udp --dport 2793 -j ACCEPT。就好了
cross-fire 2017-03-27
  • 打赏
  • 举报
回复 1
引用 7 楼 renwotao2009 的回复:
难道有其他程序也是用2793端口,你换个端口号试试。
端口是空闲的。
cross-fire 2017-03-27
  • 打赏
  • 举报
回复
引用 8 楼 shnulaa 的回复:

new DatagramSocket(PORT, InetAddress.getByName("0.0.0.0"));   -> bind any ip

DatagramSocket(int port) 
javadoc The socket will be bound to the wildcard address, an IP address chosen by the kernel.
加或不加0.0.0.0我都试了,在实体物理机上是没问题的,有问题的是在云资源虚拟机,是不是虚拟机上要做什么配置才行。
renwotao2009 2017-03-27
  • 打赏
  • 举报
回复
不应该啊,程序正常跑的话,没问题的
晓风吹雾 2017-03-22
  • 打赏
  • 举报
回复

new DatagramSocket(PORT, InetAddress.getByName("0.0.0.0"));   -> bind any ip

DatagramSocket(int port) 
javadoc The socket will be bound to the wildcard address, an IP address chosen by the kernel.
renwotao2009 2017-03-22
  • 打赏
  • 举报
回复
难道有其他程序也是用2793端口,你换个端口号试试。
renwotao2009 2017-03-21
  • 打赏
  • 举报
回复
telnet走的是tcp协议,看你的iptable允许了2379端口的走tcp协议,按说可以联通,但你的2379为什么用作udp端口
cross-fire 2017-03-21
  • 打赏
  • 举报
回复
引用 5 楼 renwotao2009 的回复:
wireshark抓包看下你的udp确定发出来了吗?
抓包命令监控2793上的udp数据:tcpdump -vnn udp dst port 2793。模拟测试发送时,可以看到收到数据了。
[root@ddd-app btfb]# tcpdump -vnn udp dst port 2793 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:54:51.830036 IP (tos 0x0, ttl 56, id 19846, offset 0, flags [none], proto UDP (17), length 29)
    1.80.2.130.33598 > 10.173.16.123.2793: UDP, length 1
19:54:54.349588 IP (tos 0x0, ttl 56, id 19848, offset 0, flags [none], proto UDP (17), length 29)
    1.80.2.130.33598 > 10.173.16.123.2793: UDP, length 1
19:54:55.513648 IP (tos 0x0, ttl 56, id 19850, offset 0, flags [none], proto UDP (17), length 29)
    1.80.2.130.33598 > 10.173.16.123.2793: UDP, length 1
19:54:58.482348 IP (tos 0x0, ttl 56, id 19852, offset 0, flags [none], proto UDP (17), length 33)
    1.80.2.130.33598 > 10.173.16.123.2793: UDP, length 5
是不是可以认为是代码写错了?但是我测试的时候代码都没问题。。 Main类
package aaa;


public class Main {
	
	public static void main(String[] args) {
		
		ServerUDP t = new ServerUDP();
		if(t.socket != null){
			t.start();   //启动线程
		}
	}

}
ServerUDP类
package aaa;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

class ServerUDP extends Thread{
	private int i=0;
	public DatagramSocket socket = null;
	public ServerUDP(){
		try {
			socket = new DatagramSocket(2793);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("服务端初始化scoket失败!");
		}
	}
	/**
	 * 继承父类方法
	 */
	public void run(){
		byte[] buff = null;
		DatagramPacket packet = null;
		byte data[] = null;
		
		while(true){
			i++;
			try {
				buff = new byte[4096];		//接收数据的buf数组并指定大小
				packet = new DatagramPacket(buff, buff.length);//创建接收数据包,存储在buf中
				System.out.println(i+"次");
				socket.receive(packet);			//接收操作
				data = packet.getData();		//接收的数据
				InetAddress address = packet.getAddress();// 接收的地址  
				System.out.println("接收的ip地址:::" + address.toString());
				System.out.println("接收的端口::" + packet.getPort());
				System.out.println(i+"次,接收的文本:::" + new String(data));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
renwotao2009 2017-03-21
  • 打赏
  • 举报
回复
wireshark抓包看下你的udp确定发出来了吗?
cross-fire 2017-03-21
  • 打赏
  • 举报
回复
引用 2 楼 renwotao2009 的回复:
telnet走的是tcp协议,看你的iptable允许了2379端口的走tcp协议,按说可以联通,但你的2379为什么用作udp端口
嗯,我改了,请看我给2楼的回复,问题依旧。谢谢
cross-fire 2017-03-21
  • 打赏
  • 举报
回复
引用 1 楼 twintiger 的回复:
telnet协议是基于TCP的,你可以从/etc/services看到,如果你的2793端口是UDP服务端口,telnet是不可能通的。 你可以用 netstat -l 看系统在听哪些端口,如果iptable要把2793的udp允许吧。
说得对,我加的规则是tcp的。下面是我修改时的操作: 1、删掉原来iptables文件中的2793规则 2、执行命令iptables -A INPUT -p udp --dport 2793 -j ACCEPT。重启防火墙服务。 3、启动监听2793端口的程序 4、命令netstat -nao的结果中有了udp的2793
# netstat -nao
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       Timer
udp        0      0 :::2793                     :::*                                    off (0.00/0/0)
但是模拟发送udp包,程序还是收不到。
twintiger 2017-03-20
  • 打赏
  • 举报
回复
telnet协议是基于TCP的,你可以从/etc/services看到,如果你的2793端口是UDP服务端口,telnet是不可能通的。 你可以用 netstat -l 看系统在听哪些端口,如果iptable要把2793的udp允许吧。
相关推荐
发帖
Linux/Unix社区

2.2w+

社区成员

Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
帖子事件
创建了帖子
2017-03-20 06:01
社区公告
暂无公告