如何UNIX/Linux打开TCP/UDP端口

时间:2020-01-09 10:42:19  来源:igfitidea点击:

如何在UNIX/Linux之类的操作系统下打开TCP或者UDP端口?
端口是用作通信端点的特定于应用程序或者特定于过程的软件构造,并通过其端口号(例如TCP端口号80)进行标识。

Internet协议套件的TCP和UDP使用它。
端口号是16位无符号整数,范围为0到65535。

UNIX / Linux 
    +------------------+
    | Networking stack |
    |      eth0        |
    +------------------+
           |
    +------------------+
    |  Apache process  |--> Binding port 80 @ 192.54.1.1 IP 
    +------------------+

在上面的示例中,Apache进程将其输入和输出通道文件描述符(fd)与端口号80和IP地址192.54.1.1关联。
这称为绑定。
它用于通过UNIX/Linux操作系统网络堆栈(软件)发送和接收网页。
换句话说,使用应用程序端口进行通信。
启动Apache时,打开端口80进行通信。
诸如Web,邮件,pop3等通用服务均使用专门保留的众所周知的端口号来接收来自客户端主机的服务请求。
众所周知的端口定义为Internet号码分配机构(IANA)。
执行以下命令,以查看众所周知的TCP和UDP端口号列表:

$ less /etc/services
grep -w 80 /etc/services

输出示例:

www		80/tcp		http		# WorldWideWeb HTTP
www		80/udp				# HyperText Transfer Protocol

特权端口

通常,众所周知的网络服务器(例如Apache)使用的端口号小于1024。
在UNIX和Linux下,例如oses的root(超级用户)特权需要打开特权端口。
几乎所有客户端都将较高的端口号用于短期使用。
这也称为临时端口。
例如Apache使用TCP端口80

Server                         Client w/ Firefox
+----------+                    +----------------+       
| Apache   |                    | connects using | 
| TCP Port |                    | an ephemeral   |
| 80 @     | eth0  | port #         |  
|192.54.1.2|                    | 46025          | 
+----------+                    +----------------+

端口号分为三个范围:

  • 知名端口:从0到1023的端口。
  • 注册端口:从1024到49151的端口
  • 动态和/或者专用端口:从49152到65535的那些端口

您可以通过执行以下命令来增加本地端口范围(Linux特定示例):

# echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range

您还可以增加或者减少套接字超时(Linux特定示例):

# echo 2000 > /proc/sys/net/ipv4/tcp_keepalive_time

常见的知名端口号

UNIX/Windows/Linux/BSD/OS X和所有其他服务器操作系统或者网络设备使用以下命令(请参见/etc/services文件):

  • 21:FTP服务器
  • 22:SSH服务器(远程登录)
  • 25:SMTP(邮件服务器)
  • 53:域名系统(绑定9服务器)
  • 80:万维网(HTTPD服务器)
  • 110:POP3邮件服务器
  • 143:IMAP邮件服务器
  • 443:传输层安全性/安全套接字层上的HTTP(HTTPDS服务器)
  • 445:microsoft-ds,TCP上的服务器消息块

如何在UNIX或者Linux下查看打开的端口和套接字信息?

您可以使用netstat命令:

# netstat -tulpn

FreeBSD的特定示例:

# sockstat -l

要列出打开的IPv4连接,请使用lsof命令:

# lsof -Pnl +M -i4

ss命令用于转储套接字统计信息。
它允许显示类似于netstat命令的信息。
它可以显示比其他工具更多的TCP和状态信息

# ss -s
# ss -l
# ss -pl
# ss -o state established '( dport = :smtp or sport = :smtp )'

例子

使用UNIX服务或者守护程序(例如Apache Web服务器)打开每个TCP或者UDP端口。
您也可以使用C,C ++,Perl,Shell或者Bash编写程序来打开任何端口。
您也可以使用nc命令之类的实用程序。

Apache服务器示例(打开TCP端口80)

如下所示在FreeBSD下启动Apache Web服务器以打开TCP端口80:

# /usr/local/etc/rc.d/apache22 forcestart

或者

# /usr/local/etc/rc.d/apache22 start

要在FreeBSD下显示监听套接字(开放端口),请执行:

# sockstat -l

或者

# netstat -nat | grep LISTEN

您应该看到在FreeBSD下打开了端口80。
在CentOS或者Redhat(RHEL)Linux下,您可以使用以下命令打开端口80:

# service httpd start
# chkconfig httpd on
# netstat -tulpn | grep :80

防火墙配置

所有端口号都编码在传输协议数据包报头中,并且可以由网络堆栈的其他组件(如防火墙)读取。
防火墙可用于端口转发或者拒绝对开放端口的访问。
例如,使用UNIX防火墙阻止名为1.2.3.4的滥用IP地址。
换句话说,Apache端口是开放的,但可能被UNIX(pf)或者Linux(iptables)防火墙阻止。
您还需要在防火墙级别打开端口。
在此示例中,使用Linux iptables防火墙工具打开tcp端口80:

# /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# service iptables save

nc命令示例

nc(或者netcat实用程序)几乎在阳光下用于涉及TCP或者UDP的任何事物。
它可以打开TCP连接,发送UDP数据包,侦听任意TCP和UDP端口,进行端口扫描以及处理IPv4和IPv6。
在此示例中,使用nc命令打开端口5000:

$ nc -l 5000

在第二个控制台上或者从第二台UNIX/Linux机器上,连接到正在监听的机器和端口:

$ nc localhost 5000

或者

$ nc unix.system.ip.here 5000

在此示例中,将数据从一台计算机发送到另一台计算机:

$ nc -l 5555 > output.txt

使用第二台计算机,连接到侦听nc进程(@端口5555),并向其提供要传输的文件:

$ nc your.unix.systems.ip.here 5555 < input.txt

您可以运行netstat命令查看打开的端口:

$ netstat -a
$ netstat -nat | grep LISTEN

输出示例:

tcp4       0      0  *.5555                 *.*                    LISTEN
tcp4       0      0  10.1.3.29.53           *.*                    LISTEN
tcp4       0      0  192.168.56.1.53        *.*                    LISTEN
tcp4       0      0  115.242.47.238.53      *.*                    LISTEN
tcp4       0      0  127.0.0.1.953          *.*                    LISTEN
tcp4       0      0  127.0.0.1.53           *.*                    LISTEN
tcp4       0      0  127.0.0.1.631          *.*                    LISTEN
tcp6       0      0  ::1.631                *.*                    LISTEN

Python示例

创建一个名为echo_server.py的文件:

#!/usr/bin/python
 
# Demo server to open port 8888
# Modified from Python tutorial docs
import socket
 
HOST = '127.0.0.1'       # Hostname to bind
PORT = 8888              # Open non-privileged port 8888
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

创建一个名为echo_client.py的文件:

#!/usr/bin/python
 
# Demo client program
# Modified from Python tutorial docs
import socket
 
HOST = '127.0.0.1'    	# Set the remote host, for testing it is localhost
PORT = 8000            # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Where there is love there is life')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

保存并关闭文件。
如下运行:

$ chmod +x *.py

启动服务器,执行:

$ ./echo_server.py
$ netstat -nat | grep LISTEN

在第二个控制台上,使用echo_client.py连接到正在监听的本地主机和端口:

$ ./echo_client.py