有效端口号
时间:2022-04-21 18:06 | 分类: 句子大全 | 作者:追逐仰望星空 | 评论: 次 | 点击: 次
有效端口号
1. 计算机各网络端口的具体作用是什么
什么是端口 在网络技术中,端口(Port)有好几种意思。
集线器、交换机、路由 器的端口指的是连接其他网络设备的接口,如RJ-45端口、Serial端口等。我们 这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻 辑意义上的端口。
那么TCP/IP协议中的端口指的是什么呢?如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口 可以有65536个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535。
端口有什么用呢?我们知道,一台拥有IP地址的主机可以提供许多服 务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来 实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。
实际上是通过“IP地址+端口号”来区分不同的服务的。 需要注意的是,端口并不是一一对应的。
比如你的电脑作为客户机访 问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口,如图1所示。 按对应的协议类型,端口有两种:TCP端口和UDP端口。
由于TCP和UDP两个协议是独立的,因此各自的端口号也相互独立,比如TCP有235端口,UDP也 可以有235端口,两者并不冲突。 端口是怎样分配的 与IP地址一样,端口号也不是随意使用的,而是按照一定的规定进行 分配。
端口的分类标准有好几种,我们这里不做详细讲解,只介绍一下周知端口 和动态端口。 1.周知端口(Well Known Ports) 周知端口是众所周知的端口号,范围从0到1023,其中80端口分配给W WW服务,21端口分配给FTP服务等。
我们在IE的地址栏里输入一个网址的时候( 比如.cn)是不必指定端口号的,因为在默认情况下WWW服务的端口 号是“80”。 网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在 地址栏上指定端口号,方法是在地址后面加上冒号“:”(半角),再加上端口号。
比如使用“8080”作为WWW服务的端口,则需要在地址栏里输入“:8080”。 但是有些系统协议使用固定的端口号,它是不能被改变的,比如139 端口专门用于NetBIOS与TCP/IP之间的通信,不能手动改变。
2.动态端口(Dynamic Ports) 动态端口的范围是从1024到65535。之所以称为动态端口,是因为它 一般不固定分配某种服务,而是动态分配。
动态分配是指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配 一个供它使用。当这个进程关闭时,同时也就释放了所占用的端口号。
怎样查看端口 一台服务器有大量的端口在使用,怎么来查看端口呢?有两种方式: 一种是利用系统内置的命令,一种是利用第三方端口扫描软件。 1.用“netstat -an”查看端口状态 在Windows 2000/XP中,可以在命令提示符下使用“netstat -an”查看系统端口状态,可以列出系统正在开放的端口号及其状态,如图2所示。
2.用第三方端口扫描软件 第三方端口扫描软件有许多,界面虽然千差万别,但是功能却是类似 的。这里以“Fport” (可到 /soft/cce下载)为例讲解。
“Fport”在命令提示符下使用,运行结果 与“netstat-an”相似,但是它不仅能够列出正在使用的端口号及类型,还可 以列出端口被哪个应用程序使用, 怎样管理端口 黑客程序是通过系统的端口漏洞来入侵系统的,因此对端口的管理是 网管工作的一个非常重要的方面。怎样来管理端口呢?可以采用两种方法:一种方法是利用系统内置的管理工具,另一种方法是利用第三方软件来实现。
1.用“TCP/IP筛选”管理端口 在Windows 2000 Server中,双击任务栏右下角的网络连接图标,再双击打开“本地连接状态”对话框,点击[属性]按钮,再选中“Internet协议( TCP/IP)”,然后点击[属性]按钮,在弹出的“Internet协议(TCP/IP)”对话 框中点击[高级]按钮。在“高级TCP/IP设置”中选择“选项”标签,选中“TCP/IP筛选”,然后点击[属性]按钮。
在“TCP/IP筛选”对话框里选择“启用TCP/IP筛选”的复选框,然后把左边“TCP端口”上的“只允许”选上。增加你允许使用的端口,如“80”、“21”、“25” 等(如图4所示),重新启动以 2.用第三方软件管理端口 管理端口最常用的第三方软件就是防火墙软件了。
其实防火墙就是一 整套制定好的IP地址及其端口的访问规则,你可以改变这些规则来打开和关闭指定的端口。 千万注意:如果不理解参数的意思,切勿自行修改!否则可能会在系 统中增加漏洞,或者导致系统无法进行正常通信。
2. 怎样理解端口和端口号
有过一些黑客攻击方面知识的读者都会知道,其实那些所谓的黑客并不是像人们想象那样从天而降,而是实实在在从您的计算机"大门"中自由出入。
计算机的"大门"就是我们平常所说的"端口",它包括计算机的物理端口,如计算机的串口、并口、输入/输出设备以及适配器接口等(这些端口都是可见的),但更多的是不可见的软件端口,在本文中所介绍的都是指"软件端口",但为了说明方便,仍统称为"端口"。本文仅就端口的基础知识进行介绍, 一、端口简介 随着计算机网络技术的发展,原来物理上的接口(如键盘、鼠标、网卡、显示卡等输入/输出接口)已不能满足网络通信的要求,TCP/IP协议作为网络通信的标准协议就解决了这个通信难题。
TCP/IP协议集成到操作系统的内核中,这就相当于在操作系统中引入了一种新的输入/输出接口技术,因为在TCP/IP协议中引入了一种称之为"Socket(套接字)"应用程序接口。有了这样一种接口技术,一台计算机就可以通过软件的方式与任何一台具有Socket接口的计算机进行通信。
端口在计算机编程上也就是"Socket接口"。 有了这些端口后,这些端口又是如何工作呢?例如一台服务器为什么可以同时是Web服务器,也可以是FTP服务器,还可以是邮件服务器等等呢?其中一个很重要的原因是各种服务采用不同的端口分别提供不同的服务,比如:通常TCP/IP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。
这样,通过不同端口,计算机就可以与外界进行互不干扰的通信。 据专家们分析,服务器端口数最大可以有65535个,但是实际上常用的端口才几十个,由此可以看出未定义的端口相当多。
这是那么多黑客程序都可以采用某种方法,定义出一个特殊的端口来达到入侵的目的的原因所在。为了定义出这个端口,就要依靠某种程序在计算机启动之前自动加载到内存,强行控制计算机打开那个特殊的端口。
这个程序就是"后门"程序,这些后门程序就是常说的木马程序。简单的说,这些木马程序在入侵前是先通过某种手段在一台个人计算机中植入一个程序,打开某个(些)特定的端口,俗称"后门"(BackDoor),使这台计算机变成一台开放性极高(用户拥有极高权限)的FTP服务器,然后从后门就可以达到侵入的目的。
二、端口的分类 端口的分类根据其参考对象不同有不同划分方法,如果从端口的性质来分,通常可以分为以下三类: (1)公认端口(Well Known Ports):这类端口也常称之为"常用端口"。这类端口的端口号从0到1024,它们紧密绑定于一些特定的服务。
通常这些端口的通信明确表明了某种服务的协议,这种端口是不可再重新定义它的作用对象。例如:80端口实际上总是HTTP通信所使用的,而23号端口则是Telnet服务专用的。
这些端口通常不会像木马这样的黑客程序利用。为了使大家对这些常用端口多一些认识,在本章后面将详细把这些端口所对面应的服务进行列表,供各位理解和参考。
(2) 注册端口(Registered Ports):端口号从1025到49151。它们松散地绑定于一些服务。
也是说有许多服务绑定于这些端口,这些端口同样用于许多其他目的。这些端口多数没有明确的定义服务对象,不同程序可根据实际需要自己定义,如后面要介绍的远程控制软件和木马程序中都会有这些端口的定义的。
记住这些常见的程序端口在木马程序的防护和查杀上是非常有必要的。常见木马所使用的端口在后面将有详细的列表。
(3) 动态和/或私有端口(Dynamic and/or Private Ports):端口号从49152到65535。理论上,不应把常用服务分配在这些端口上。
实际上,有些较为特殊的程序,特别是一些木马程序就非常喜欢用这些端口,因为这些端口常常不被引起注意,容易隐蔽。 如果根据所提供的服务方式的不同,端口又可分为"TCP协议端口"和"UDP协议端口"两种。
因为计算机之间相互通信一般采用这两种通信协议。前面所介绍的"连接方式"是一种直接与接收方进行的连接,发送信息以后,可以确认信息是否到达,这种方式大多采用TCP协议;另一种是不是直接与接收方进行连接,只管把信息放在网上发出去,而不管信息是否到达,也就是前面所介绍的"无连接方式"。
这种方式大多采用UDP协议,IP协议也是一种无连接方式。对应使用以上这两种通信协议的服务所提供的端口,也就分为"TCP协议端口"和"UDP协议端口"。
使用TCP协议的常见端口主要有以下几种: (1) FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。
下载文件,上传主页,都要用到FTP服务。 (2) Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。
如以前的BBS是纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。 (3) SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。
如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置中常看到有这么SMTP端口设置这个栏,服务器开。
3. 计算机上最常用的端口
股票软件的端口你需要自己去侦测端口大概分为三类 : 1:公认端口(well known ports):从0-1023,他们是绑定于一些服务。
通常这些端口的通信明确表明了某种服务的协议。比如,21端口是FTP服务所开放的。
2:注册端口(registrerd ports):从1024-49151,他们松散的绑定于一些服务也就是说有许多服务绑定于这些端口,这些端口同样用于许多其他目的。比如,许多系统处理动态端口是从1024开始的。
3:动态或私有端口(dynamic and/or private ports):从49512-65535,理论上不应该为服务分配这些端口。实际上,计算机通常从1024开始分配动态端口。
当然也有例外的,SUN的RPC端口从32768开始。 下边附常用端口列表: 端口大全 不同的端口有不同的作用希望大家能有所收获。
0 通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用一种通常的闭合端口连接它时将产生不同的结果。
一种典型的扫描:使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。 1 tcpmux 这显示有人在寻找SGI Irix机器。
Irix是实现tcpmux的主要提供者,缺省情况下tcpmux在这种系统中被打开。Iris机器在发布时含有几个缺省的无密码的帐户,如lp, guest, uucp, nuucp, demos, tutor, diag, EZsetup, OutOfBox, 和4Dgifts。
许多管理员安装后忘记删除这些帐户。因此Hacker们在Internet上搜索tcpmux并利用这些帐户。
7 Echo 你能看到许多人们搜索Fraggle放大器时,发送到x.x.x.0和x.x.x.255的信息。常见的一种DoS攻击是echo循环(echo-loop),攻击者伪造从一个机器发送到另一个机器的UDP数据包,而两个机器分别以它们最快的方式回应这些数据包。
另一种东西是由DoubleClick在词端口建立的TCP连接。有一种产品叫做“Resonate Global Dispatch”,它与DNS的这一端口连接以确定最近的路由。
Harvest/squid cache将从3130端口发送UDP echo:“如果将cache的source_ping on选项打开,它将对原始主机的UDP echo端口回应一个HIT reply。”这将会产生许多这类数据包。
11 sysstat 这是一种UNIX服务,它会列出机器上所有正在运行的进程以及是什么启动了这些进程。这为入侵者提供了许多信息而威胁机器的安全,如暴露已知某些弱点或帐户的程序。
这与UNIX系统中“ps”命令的结果相似。再说一遍:ICMP没有端口,ICMP port 11通常是ICMP type=11。
19 chargen 这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。
TCP连接时,会发送含有垃圾字符的数据流知道连接关闭。Hacker利用IP欺骗可以发动DoS攻击。
伪造两个chargen服务器之间的UDP包。由于服务器企图回应两个服务器之间的无限的往返数据通讯一个chargen和echo将导致服务器过载。
同样fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。 21 ftp 最常见的攻击者用于寻找打开“anonymous”的ftp服务器的方法。
这些服务器带有可读写的目录。Hackers或Crackers 利用这些服务器作为传送warez (私有程序) 和pron的节点。
22 ssh PcAnywhere 建立TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点。
如果配置成特定的模式,许多使用RSAREF库的版本有不少漏洞。(建议在其它端口运行ssh)。
还应该注意的是ssh工具包带有一个称为make-ssh-known-hosts的程序。它会扫描整个域的ssh主机。
你有时会被使用这一程序的人无意中扫描到。UDP(而不是TCP)与另一端的5632端口相连意味着存在搜索pcAnywhere的扫描。
5632(十六进制的0x1600)位交换后是0x0016(使进制的22)。 23 Telnet 入侵者在搜索远程登陆UNIX的服务。
大多数情况下入侵者扫描这一端口是为了找到机器运行的操作系统。此外使用其它技术,入侵者会找到密码。
25 smtp 攻击者(spammer)寻找SMTP服务器是为了传递他们的spam。入侵者的帐户总被关闭,他们需要拨号连接到高带宽的e-mail服务器上,将简单的信息传递到不同的地址。
SMTP服务器(尤其是sendmail)是进入系统的最常用方法之一,因为它们必须完整的暴露于Internet且邮件的路由是复杂的(暴露+复杂=弱点)。 53 DNS Hacker或crackers可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其它通讯。
因此防火墙常常过滤或记录53端口。需要注意的是你常会看到53端口做为UDP源端口。
不稳定的防火墙通常允许这种通讯并假设这是对DNS查询的回复。Hacker常使用这种方法穿透防火墙。
67&68 Bootp和DHCP UDP上的Bootp/DHCP:通过DSL和cable-modem的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些机器在向DHCP服务器请求一个地址分配。
Hacker常进入它们分配一个地址把自己作为局部路由器而发起大量的“中间人”(man-in-middle)攻击。客户端向68端口(bootps)广播请求配置,服务器向67端口(bootpc)广播回应请求。
这种回应使用广播是因为客户端还不知道可以发送的IP地址。 69 TFTP(UDP) 许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。
但是它们常常。
Spring Boot随机端口你都不会,怎么动态扩容?
推荐学习
二本渣渣被炒,18天脱产学飞SpringBoot,逆袭腾讯涨薪18K!微服务架构之春招总结:SpringCloud、Docker、Dubbo与SpringBoot一般情况下每个spring boot工程启动都有固定的端口,但是固定端口不利用服务的动态扩容,如果在一台服务器上需要对同一个服务进行多实例部署,很容易出现端口冲突,那么怎么解决这个问题呢?
random随机端口
在spring boot中,可以通过${random}来生成随机数字,我们可以在配置文件中,这么设置端口:
server.port=${random.int(2000,8000)}
通过random.int方法,指定生成2000~8000的随机端口。这样每次启动的端口都不一样。
多次启动,发现每次的端口都不一致说明配置成功。
注意事项:
这里需要注意spring boot项目启动属性文件的加载顺序,spring boot的属性是由里向外加载,所以最外层的最后被加载,会覆盖里层的属性。
所以如果主动在启动命令中使用–server.port配置了项目的端口号,那么属性文件中配置的随机端口属性就不会生效。
通过System.setProperty设置有效随机端口
上面的方法虽然暂时达到了想要的效果,但是有个问题:如果生成的这个随机端口已经被使用了,那么项目启动就会出现端口冲突。
那么,我们能否通过一个检测机制,让生成的随机端口一定是一个没有被占用的有效的随机端口呢?
有效端口检测原理:
通过建立socket连接,Socket socket = new Socket(Address,port);#address代表主机的IP地址,port代表端口号
如果对该主机的特定端口号能建立一个socket,则说明该主机的该端口在使用。
Socket socket = new Socket(Address,port);#address代表主机的IP地址,port代表端口号
如果对该主机的特定端口号能建立一个socket,则说明该主机的该端口在使用。
实现思路:
通过在项目启动前,获取有效的随机端口并通过System.setProperty将变量设置到系统的全局变量中,这样项目启动时就可以从全局变量中获取到server.port变量的值。
这里的system,系统指的是 JRE (runtime)system,即设置jvm运行时的全局变量。
工具类:
@Slf4jpublic class NetUtils { /** * 测试本机端口是否被使用 * @param port * @return */ public static boolean isLocalPortUsing(int port){ boolean flag = true; try { //如果该端口还在使用则返回true,否则返回false,127.0.0.1代表本机 flag = isPortUsing("127.0.0.1", port); } catch (Exception e) { } return flag; } /*** * 测试主机Host的port端口是否被使用 * @param host * @param port * @throws UnknownHostException */ public static boolean isPortUsing(String host,int port) { boolean flag = false; try { InetAddress Address = InetAddress.getByName(host); Socket socket = new Socket(Address,port); //建立一个Socket连接 flag = true; } catch (IOException e) { //log.info(e.getMessage(),e); } return flag; } //start--end是所要检测的端口范围 static int start=0; static int end=1024; /** * 由于本机上安装了mysql,采用3306端口去验证 * @param args */ public static void main(String args[]){ int testPost =3306; if(isLocalPortUsing(testPost)){ System.out.println("端口 "+testPost+" 已被使用"); }else{ System.out.println("端口 "+testPost+"未使用"); } }}
public class ServerPortUtils { /** * 获取可用端口 * @return */ public static int getAvailablePort(){ int max = 65535; int min = 2000; Random random = new Random(); int port = random.nextInt(max)%(max-min +1) + min; boolean using = NetUtils.isLocalPortUsing(port); if(using){ return getAvailablePort(); }else{ return port; } }}
项目启动前设置server.port环境变量
/** * 开始命令 */@Slf4jpublic class StartCommand { public StartCommand(String[] args){ Boolean isServerPort = false; String serverPort = ""; if(args != null){ for (String arg:args){ if(StringUtils.hasText(arg) && arg.startsWith("--server.port") ){ isServerPort = true; serverPort = arg; break; } } } //没有指定端口,则随机生成一个可用的端口 if(!isServerPort){ int port = ServerPortUtils.getAvailablePort(); log.info("current server.port=" + port); System.setProperty("server.port",String.valueOf(port)); }else{//指定了端口,则以指定的端口为准 log.info("current server.port=" + serverPort.split("=")[1]); System.setProperty("server.port",serverPort.split("=")[1]); } }}
启动类调用方法:
@SpringBootApplication@EnableUserClient@RestControllerpublic class DemoApplication { @Autowired Environment environment; public static void main(String[] args) { new StartCommand(args); SpringApplication.run(DemoApplication.class, args); }}
通过自定义PropertiesPropertySource属性源实现
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { //MapPropertySource Properties properties = new Properties(); properties.put("server.port", ServerPortUtils.getAvailablePort()); System.out.println(properties.get("server.port")); PropertiesPropertySource source = new PropertiesPropertySource("myCustom", properties); environment.getPropertySources().addLast(source); //environment.getPropertySources().addAfter(); }}
通过配置在resources/META-INF/spring.factories文件中使用全名注册
org.springframework.boot.env.EnvironmentPostProcessor=com.laowan.demo.command.MyEnvironmentPostProcessor
这样在项目启动后,就会将该属性源加载到Environment中。
server.port=0随机端口 (推荐)
通过设置server.port=0,在spring boot项目启动时,会自动去寻找一个空闲的端口,避免端口冲突。
扩展:server.port=-1
设置为-1是为了完全关闭HTTP端点,但仍创建一个WebApplicationContext, 主要是在单元测试时使用。
验证: 执行单元测试,获取server.port属性
@SpringBootTest@Slf4jclass DemoApplicationTests { @Autowired Environment environment; @Test void getProperties() { System.out.println(environment.getProperty("server.port")); }}
执行结果为:-1
总结
为什么要设置随机端?主要是为了解决动态扩容时出现端口冲突的问题。怎么获取一个有效的随机端口号spring boot下实现随机端口的三种方式。关于方式三的自定义属性源的实现方式可以多多品味,实践一下,更好的体会属性文件的加载顺序。补充通过server.port=0,设置一个有效的随机端口,推荐做法作者:斗者_2013
原文链接:https://blog.csdn.net/w1014074794/article/details/106184883
- 上一篇:学校安全名言警句大全
- 下一篇:有钱时和没钱时名言