通过命令修改网络参数

配置网络接口命令ifconfig

  • ifconfig是Linux系统中最常见的网络配置命令之一,它通常来设置IP地址和子网掩码以及查看网卡相关配置。

查看网卡配置信息

  • 当ifconfig名不带任何选项和参数时,将显示在当前系统中有效(活动)的网卡配置信息,如IP地址,MAC地址,收发数据包情况等。
[root@localhost ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.133  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::d460:db5a:da92:ddc  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:5a:65:9b  txqueuelen 1000  (Ethernet)
        RX packets 140021  bytes 181680293 (173.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 37250  bytes 2978907 (2.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 17  bytes 1176 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 1176 (1.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 在CentOS7系统中,网卡不再统一命令为ethx,而是会检查主机的硬件网卡以及插槽位置等信息,然后以网卡做不同的命名,因而在不同的Linux服务器中,网卡的名称都是不同的。在VMware虚拟机中的网卡,大都被命名为ens32。
  • 另外系统中会有一块命名为lo的网卡,“lo”是loopback的缩写,它并不代表真正的网卡,而是一个虚拟的网卡,其IP地址默认是127.0.0.1。回环地址通常用于本机的网络测试。

配置IP地址

  • ifconfig命令最主要的用途就是设置IP地址,命令格式:
[root@localhost ~]# ifconfig 网卡名 IP地址 netmask 子网掩码
  • 例如,将网卡ens32的IP地址设置为192.168.10.10/24。
[root@localhost ~]# ifconfig ens32 192.168.10.120 netmask 255.255.255.0
  • 子网掩码也可以用简化的形式表示。
[root@localhost ~]# ifconfig ens32 192.168.10.120/24

禁用或启用网卡

  • 使用ifconfig命令还可以禁用或重新激活网卡,相当于网卡重启。命令格式:
[root@localhost ~]# ifconfig ens32 down #禁用网卡
[root@localhost ~]# ifconfig ens32 up #启用网卡

配置虚拟网络接口

  • 在实际工作中,有时可能需要为一块网卡配置多个IP接口,这可以通过配置虚拟网卡接口实现。命令格式:
[root@localhost ~]# ifconfig 网卡名:虚拟网络接口id IP地址 netmask 子网掩码
  • 例如,为网卡ens32设置一个虚拟网卡接口ens32:1,IP地址为192.168.10.20。
[root@localhost ~]# ifconfig ens32:1 192.168.10.20/24
  • 根据需要还可以添加更多的虚拟接口,如ens32:2,ens32:3等等…
  • 可以通过执行“ifconfig ens32:1 down”命令将虚拟网卡接口停用。

设置路由命令route

  • route命令的本意是用来查看设置路由表,但主要是用它设置默认网关。

查看/设置路由表

  • 直接执行route命令可以显示主机的路由表。通常都会带”-n“选项route命令,可以将路由记录中的地址显示为数字形式,减少解析主机名的过程,加快命令的执行过程。
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.2    0.0.0.0         UG    100    0        0 ens32
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens32
  • 上面所输出的路由表中,各项信息的含义如下。
    • Destination:目的网络地址,可以是一个网络地址也是一个主机地址。Destination为0.0.0.0表示这是一条默认路由。
    • Gateway:网关地址,即该路由条目下一跳的路由器IP地址,该项如果为0.0.0.0,则表示的地址就在本网络中,不需要网关。
    • Genmask:路由项的子网掩码,与Destnation信息进行“与”运算得出目标地址。
    • Flags:路由标志。其中U(up)表示该路由项是启用状态;H(host)表示目标是单台主机;G(gateway)表示该路由像需要使用网关。
    • Metric:路由开销值,用以衡量路径的代价。
    • Ref:依赖于本路由的其他路由条目。
    • Use:该路由项被使用的次数。
    • Iface:该路由项发送数据包使用的网络接口。
  • 也可以手工向路由表中添加记录,例如添加一条指向192.168.0.0/24网络的路由条目。
[root@localhost ~]# route add -net 192.168.0.0/24 gw 192.168.10.20
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.2    0.0.0.0         UG    100    0        0 ens32
192.168.0.0     192.168.10.20   255.255.255.0   UG    0      0        0 ens32
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens32
  • 删除到192.168.0.0/24网络的路由条目。
[root@localhost ~]# route del -net 192.168.0.0/24

设置默认网关

  • 对于如何增删路由条目,只需勒脚即可,对于route命令关键是要掌握如何设置默认网关。命令格式:
[root@localhost ~]# route add default dw IP地址 #添加默认网关
[root@localhost ~]# route del default gw IP地址 #删除默认网关
  • 例如,将Linux主机的默认网关设置为192.168.10.2。
[root@localhost ~]# route add default gw 192.168.10.2
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.2    0.0.0.0         UG    0      0        0 ens32
0.0.0.0         192.168.10.2    0.0.0.0         UG    100    0        0 ens32
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens32

网络参数设置命令ip

  • ifconfig是Linux系统中一个比较古老的命令,在CentOS7系统中,推荐采用ip命令来替代ifconfig。
  • ip命令可以实现ifconfig和route命令的所有功能,只需要通过ip命令就可以对IP地址以及默认网关等网络参数进行设置。ip命令功能虽然更为强大,但用法相对也要复杂一些。
  • ip命令的语法格式:
ip [ OPTIONS ] OBJECT { COMMAND | help }
  • 其中OBJECT是操作对象,主要是“link,address,route”三类对象。link主要用于对网络连接也就是网卡进行配置,address主要用于对IP地址进行配置,route主要用于路由表进行配置。
  • 每一类对象都有很多相应的子命令可以使用,可以通过下面的方法查看每个对象包含的子命令以间要帮助信息。
[root@localhost ~]# ip link help
Usage: ip link add [link DEV] [ name ] NAME
                   [ txqueuelen PACKETS ]
                   [ address LLADDR ]
                   [ broadcast LLADDR ]
                   [ mtu MTU ] [index IDX ]
                   [ numtxqueues QUEUE_COUNT ]
                   [ numrxqueues QUEUE_COUNT ]
                   type TYPE [ ARGS ]

       ip link delete { DEVICE | dev DEVICE | group DEVGROUP } type TYPE [ ARGS ]

       ip link set { DEVICE | dev DEVICE | group DEVGROUP }
                      [ { up | down } ]
                      [ type TYPE ARGS ]
                      [ arp { on | off } ]
                      [ dynamic { on | off } ]
                      [ multicast { on | off } ]
                      [ allmulticast { on | off } ]
                      [ promisc { on | off } ]
                      [ trailers { on | off } ]
                      [ carrier { on | off } ]
                      [ txqueuelen PACKETS ]
                      [ name NEWNAME ]
                      [ address LLADDR ]
                      [ broadcast LLADDR ]
                      [ mtu MTU ]
                      [ netns { PID | NAME } ]
                      [ link-netnsid ID ]
              [ alias NAME ]
                      [ vf NUM [ mac LLADDR ]
                   [ vlan VLANID [ qos VLAN-QOS ] [ proto VLAN-PROTO ] ]
                   [ rate TXRATE ]
                   [ max_tx_rate TXRATE ]
                   [ min_tx_rate TXRATE ]
                   [ spoofchk { on | off} ]
                   [ query_rss { on | off} ]
                   [ state { auto | enable | disable} ] ]
                   [ trust { on | off} ] ]
                   [ node_guid { eui64 } ]
                   [ port_guid { eui64 } ]
              [ xdp { off |
                  object FILE [ section NAME ] [ verbose ] |
                  pinned FILE } ]
              [ master DEVICE ][ vrf NAME ]
              [ nomaster ]
              [ addrgenmode { eui64 | none | stable_secret | random } ]
                      [ protodown { on | off } ]

       ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE]

       ip link xstats type TYPE [ ARGS ]

       ip link afstats [ dev DEVICE ]

       ip link help [ TYPE ]

TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | team | ipoib | ip6tnl | ipip | sit | vxlan |
          gre | gretap | ip6gre | ip6gretap | vti | nlmon | team_slave |
          bond_slave | ipvlan | geneve | bridge_slave | vrf | macsec }
  • 执行命令“ip link show up”可以只显示处于活动状态的网卡信息。执行命令“ip link show ens32”可以只显示指定的名为ens32网卡信息。
  • 子命令set用于对网卡的第二层(数据链路层)配置,比较常见的主要是禁用或启用网卡。
  • 例如:将网卡ens32禁用,然后查看网卡状态为DOWN。
[root@localhost ~]# ip link set ens32 down

  • 例如:将网卡ens32启用。
[root@localhost ~]# ip link set ens32 up
  • 对于addr对象,常用的子命令主要有show,add,del,flush等。
  • 执行命令“ip addr show”可以显示所有网卡的IP地址配置信息,执行命令“ip addr show ens32”可以显示指定网卡IP地址信息。
  • 执行命令“ipaddr add 192.168.10.130/24 ens32”可以指定网卡添加IP地址,需要注意的是这条命令是在原有的IP地址基础之上再添加一个新IP,原有的IP地址依然会保留下来。
[root@localhost ~]# ip addr add 192.168.10.135/24 dev ens32 
[root@localhost ~]# ip addr show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5a:65:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.133/24 brd 192.168.10.255 scope global noprefixroute dynamic ens32
       valid_lft 1040sec preferred_lft 1040sec
    inet 192.168.10.135/24 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::d460:db5a:da92:ddc/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  • 执行命令“ip addr del 192.168.10.135/23 ens32”可以删除指定的IP地址。执行命令“ip addr flush dev ens32”可以清除指定网卡的所有IP地址。
[root@localhost ~]# ip addr del 192.168.10.135/24 dev ens32
[root@localhost ~]# ip addr show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5a:65:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.133/24 brd 192.168.10.255 scope global noprefixroute dynamic ens32
       valid_lft 1674sec preferred_lft 1674sec
    inet6 fe80::d460:db5a:da92:ddc/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  • 对于route对象,常用的子命令主要有show,add,del等。用法和含义都与addr对象差不多。
  • 执行命令“ip route show”可以查看路由表。
[root@localhost ~]# ip route show
default via 192.168.10.2 dev ens32 proto dhcp metric 100 
192.168.10.0/24 dev ens32 proto kernel scope link src 192.168.10.133 metric 100
  • 添加一条指向目的的网络192.168.0.0/24的路由条目,网关为192.168.10.2,网络接口为ens32。
[root@localhost ~]# ip route add 192.168.0.0/24 via 192.168.10.2 dev ens32
[root@localhost ~]# ip route show
default via 192.168.10.2 dev ens32 proto dhcp metric 100 
192.168.0.0/24 via 192.168.10.2 dev ens32 
192.168.10.0/24 dev ens32 proto kernel scope link src 192.168.10.133 metric 100 
  • 删除指向目的网络192.168.0.0/24的路由条目。
[root@localhost ~]# ip route show
default via 192.168.10.2 dev ens32 proto dhcp metric 100 
192.168.10.0/24 dev ens32 proto kernel scope link src 192.168.10.133 metric 100 
  • 添加默认网关:
[root@localhost ~]# ip route add default via 192.168.10.2
[root@localhost ~]# ip route show
default via 192.168.10.2 dev ens32 
default via 192.168.10.2 dev ens32 proto dhcp metric 100 
192.168.10.0/24 dev ens32 proto kernel scope link src 192.168.10.133 metric 100
  • 删除默认网关:
[root@localhost ~]# ip route show
default via 192.168.10.2 dev ens32 proto dhcp metric 100 
192.168.10.0/24 dev ens32 proto kernel scope link src 192.168.10.133 metric 100 

设置主机名称命令hostname

  • 许多网络应用程序都是通过主机名的方式其他主机之间进行连接和通信,因而最好要确保主机名在网络中是唯一的,否则通信可能将受到影响。建议在设置主机名时要有规划进行设置,比如按照主机功能进行划分等。
  • 使用hostname名可以查看或修改计算机名,大多数Linux主机的默认主机名为“localhost.localdomain”。
  • 例如:查看当前计算机的主机名。
[root@localhost ~]# hostname
localhost.localdomain
  • 例如:将主机名设置为Linux。
[root@localhost ~]# hostname Linux
[root@localhost ~]# bash
[root@Linux ~]# 
  • 用hostname命令设置的主机名当时即可生效,但是命令提示符并没有随之改变。可以将当前登录的shell关闭然后重新打开,此时命令提示符也会有相应变化。
  • 在CentOS7系统中新增加了一个hostnamectl命令,也可以用于设置主机名。
[root@Linux ~]# hostnamectl set-hostname Server

修改配置文件设置网络参数

  • 之前通过命令所做的网络配置都是临时性的,只要系统重启就会失效。要想使用网络配置永久有效还得需要配置文件。对于Linux服务器,一般都是通过修改配置进行网络配置。

网卡配置文件

  • Linux中的网卡配置问价位于“/etc/sysconfig/network-scripts”目录下,网卡配置文件的文件名格式“ifcfg-XXX“,其中”XXX“是网卡的名,例如网卡ens32的配置文件是”ifcfg-ens32“。
  • 在Linux中修改文件之前,建议最好先将该文件进行备份,然后再进行修改。
[root@Linux network-scripts]# cp ifcfg-ens32 ifcfg-ens32.bak
  • 打开ifcfg-ens32文件。
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens32"
UUID="402b4c28-6a88-4ed3-93b6-6616e5f55f43"
DEVICE="ens32"
ONBOOT="yes"
  • 每个网卡配置文件都存储了网卡的状态,配置文件中每一行代表一个参数值,常见的参数解释如下。
参数注解默认值是否可以省略
DEVICE此配置文件所应用到的设备,要跟配置文件名称相对应。不能
BOOTPROTO获取IP地址的方式,“static”表示使用静态IP,”dhcp“表示使用动态IP。dhcp可以
HWADDR网卡的MAC地址,一般由系统自动配置。可以
ONBOOT在系统启动时是否自动启用该网卡。yes可以
TYPE网卡的类型以太网型Ethernet可以
IPADDR指定静态IP地址。可以,当BOOTPROTO=static时不能省略。
NETMASK指定子网掩码。可以,当BOOTPROTO=static时不能省略。
GATEWAY指定默认网关。可以
DNS1指定首择DNS服务器。可以
DNS2指定辅助DNS服务器。可以
  • 修改完网卡配置文件后,需要执行“systemctl restart network” 命令重启网络服务,使新的配置生效。
  • 可以发现,通过一个配置文件就可以完成大多数的网络配置工作,因而这也是在所有的网络配置文件最重要的一个。
  • 如果希望配置一个永久有效的虚拟网络接口,可以将该文件复制一份并命名为“ifcfg-ens32:1”,然后就配置文件中的DEVICE项也设置为ifcfg-ens32:1,其他的项目根据需要设置即可。

主机名称配置文件

  • Linux系统的主机名,可以通过修改配置文件“/etc/hostname”进行设置。
  • 默认的主机名为localhost.localdomain,比如这个将它改为Linux。
[root@Linux ~]# vim /etc/hostname 

Linux
  • /etc/hostname文件中的设置改动之后,需要重启计算机生效。

DNS配置文件

  • 在“/etc/resolv.config”文件中记录了当前主机使用的默认DNS服务器地址。网卡配置文件ificg-ens32中设置DNS,只对ens32网卡有效,属于局部配置。在resolve.conf文件中设置的DNS则对整个主机有效,属于全局配置。尽量在resolv.conf文件中配置DNS。
[root@Linux ~]# vim /etc/resolv.conf 

# Generated by NetworkManager
search localdomain
nameserver 192.168.10.2

nmtui工具

  • 在CentOS7系统中提供了一个nmtui(NetworkManageTextUser Iterface)工具,支持以及文本窗口的方式对网络进行配置,类似于CentOS6中的setup工具。
  • 在命令行模式下输入nmtui命令就可以进入文本窗口,用“Tab”键在各个元素之间切换,选择“编辑连接”项,按回车进入配置界面,即可对网卡进行配置。配置效果等同于修改配置文件,可以永久生效。nmtui的界面简单明了。

常用的网络管理命令

  • 在Linux系统中,可以会经常需要利用ping,netstat等命令来对网络环境进行测试和管理,下面将介绍这些命令的工作原理以及使用方式。

ping命令

  • ping命令用于测试网络是否连通,可以说是最常用的网络测试命令。

ping命令的基本原理

  • ping命令利用ICMP协议进行工作,ICMP是Internet控制消息协议,用于传递控制消息。ping命令利用了ICMP两种类型的控制消息:“echo request(回显请求)“和”echo reply(回显应答)“。
  • 比如主机A上执行了ping命令,目标主机是B。在A主机上就会发送“echo request”(回显请求)控制消息,主机B正确接收后即发回“echo reply”(回显应答)控制消息,从而判断出双方能否正常通信。其工作原理如下图。

  • 如果A主机上能够ping通B主机,那么主机A上显示的信息就是从主机B上返回来的“回显应答”。如果不能ping通,主机A上显示的信息则是由系统自身所产生的错误提示。
  • 在Windows系统中执行ping命令,默认会发送4个32字节的ICMP回显请求数据包,而在Linux系统中ping命令发送的数据包大小默认为64字节,而且会不断发送,除非是有Ctrl+C组合键强制终止。
  • 执行ping命令后,如果能够ping通对方主机,那么所显示的信息如下:
[root@Linux ~]# ping 192.168.10.129
PING 192.168.10.129 (192.168.10.129) 56(84) bytes of data.
64 bytes from 192.168.10.129: icmp_seq=1 ttl=128 time=0.234 ms
64 bytes from 192.168.10.129: icmp_seq=2 ttl=128 time=0.384 ms
64 bytes from 192.168.10.129: icmp_seq=3 ttl=128 time=0.416 ms
64 bytes from 192.168.10.129: icmp_seq=4 ttl=128 time=0.370 ms
64 bytes from 192.168.10.129: icmp_seq=5 ttl=128 time=0.423 ms
64 bytes from 192.168.10.129: icmp_seq=6 ttl=128 time=0.479 ms
^C
--- 192.168.10.129 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5003ms
rtt min/avg/max/mdev = 0.234/0.384/0.479/0.077 ms

ping命令常用选项

语法:

ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]

参数说明

  • -d 使用Socket的SO_DEBUG功能。
  • -c<完成次数> 设置完成要求回应的次数。
  • -f 极限检测。
  • -i<间隔秒数> 指定收发信息的间隔时间。
  • -I<网络界面> 使用指定的网络接口送出数据包。
  • -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。
  • -n 只输出数值。
  • -p<范本样式> 设置填满数据包的范本样式。
  • -q 不显示指令执行过程,开头和结尾的相关信息除外。
  • -r 忽略普通的Routing Table,直接将数据包送到远端主机上。
  • -R 记录路由过程。
  • -s<数据包大小> 设置数据包的大小。
  • -t<存活数值> 设置存活数值TTL的大小。
  • -v 详细显示指令的执行过程。

ping命令排查网络故障

  • 当网络出现故障,比如计算机无法连入Internet,可以利用ping命令按照如下思路来排查故障。
    • 首先ping网关,如果能够ping通证明内部网路没有问题,问题应该出外部网络。
    • 如果网关能ping通,接下来再ping某个网址,比如“ping www.baidu.com”,测试能否将网址解析为IP,以确认DNS服务器设置错误。
    • 如果在第一步中ping网关不通,则证明问题出在内部网络,此时可以测试能否ping通网中的其他计算机,如果不能ping通,则证明是自己的计算机或是网线出了问题。如果能ping通,问题则与计算机或网线无关,而多半室内部的某处出现了故障。

netstat命令

  • netstat命令的功能比较多,与其最常见的是用于查看系统开放的端口以及连接的建立状态。在介绍netstat命令前,首先必须要介绍一下端口的概念。

了解端口的概念

  • 可能经常听到80端口,21端口等,这些端口到底指的是什么?它们并不是像路由器或交换机上的物理接口,而是一些逻辑接口,也就是说它们都是操作系统里的概念。
  • 都知道,在网络通信时可以通过IP地址来定位网络中的计算机,但是在每台计算机中又运行了很多程序,那么又该如何来区分这些程序?比如杂一台电脑上即打开了浏览器在访问网站,同时又运行了QQ在聊天,那么当然从网络上接收到一个数据之后,电脑是如何区分这个数据应该交给哪个程序处理呢?这就要使用到端口号。
  • 端口号的主要作用就是用来区分各种应用程序。具体来说,端口其实就是应用层的程序与传输层的TCP或UDP协议之间联系的通道。
  • 根据TCP/IP模型,所有的应用程层程序所产生的数据,都要下交给传输层去继续处理。传输层的协议只有两个:可靠的TCP和不可靠的UPD。而应用层的协议则是多种多样,如负责网页浏览的HTTP,负责文件传输FTP,负责邮箱传输和接收SMTP,POP3等。传输层的协议如何区分它所收到的数据到底是由应用层的那个协议产生的呢?所以就必须得提供一种机制以使传输层协议能够区分开不同应用程序,这个机制就是端口。
  • 每个端口都对应着一个应用层的程序,当一个应用程序要与远程主机上的应用程序通信时,传输层协议就为该应用程序分配一个端口,不同的应用程序有着不同端口,以使来往的数据互不干扰。

  • 每个端口都有一个唯一的编号,在TCP/IP协议中是用一个16位的二进制数来为端口编号,所以端口号的取值范围为0~65535,其中的0端口未用。另外根据所使用的传输层协议不同,端口又可以分为TCP端口和UDP端口两种端口。所以对端口的准确描述应该是:传输层协议+端口号。
  • 为了合理分配使用端口,由国际组织IANA对它们进行了统一分类:
    • 1~1023之间的端口固定分配一些常用的应用程序,称为固定端口。如HTTP采用TCP80端口,FTP采用TCP21端口,SSH采用TCP22端口,DNS采用UDP53端口等。
    • 1024~41951之间端口也是分配给一些比较采用的应用程序使用,但是并不严格,而且这些应用程序的使用率和知名度也不像1~1023端口那么高。比较经典的如MySQL所采用的TCP3306端口,Windows远程桌面所采用的TCP3380端口等。
    • 51952~65535之间的端口随机地分配给客户端中那些发出网络连接请求的应用程序,称为动态端口。当程序关闭之后就会释放所占用的端口,然后可以再分配给其他程序使用。

了解连接的概念

  • 连接的建立有两种模式:主动连接和被动连接,主动连接是指当端口开启之后,进程通过该端口主动发出连接请求,进而建立的连接。被动连接则是当前端口开启之后,进程在该端口等待别的计算机发来的连接请求,最终所建立的连接。在客户端/服务端模式的网络架构下,连接的建立一般都是由客户端申请一个动态端口发起主动连接,而服务器则要一直开放相应的固定端口,然后等待与客户端建立的被动连接。

查看端口与连接

  • 如何查看计算机中开放的端口或已建立好的连接呢?最简单易行的方法是利用系统中自带的netstat命令。netstat命令的用法比较多,下面举例了它的一些常用选项。
    • -t,显示TCP端口的状态信息。
    • -u,显示UDP端口状态信息。
    • -a,显示所有端口的状态信息。
    • -n,以数字形式显示,即显示IP地址和端口号,否则是显示主机名和服务名。
    • -l,显示处于监听状态的端口信息。
    • -p,显示端口对应的进程以及PID。
    • -r,显示路由表。
[root@Linux ~]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1694/master         
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1540/sshd           
tcp        0      0 192.168.10.136:22       192.168.10.1:9983       ESTABLISHED 4254/sshd: root@pts 
tcp        0      0 192.168.10.137:22       192.168.10.1:4591       ESTABLISHED 6121/sshd: root@pts 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1694/master         
tcp6       0      0 :::443                  :::*                    LISTEN      6219/httpd          
tcp6       0      0 :::3306                 :::*                    LISTEN      6459/mysqld         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::80                   :::*                    LISTEN      6219/httpd          
tcp6       0      0 :::21                   :::*                    LISTEN      6502/proftpd: (acce 
tcp6       0      0 :::22                   :::*                    LISTEN      1540/sshd      
  • 下面是所显示的信息中主要的部分含义。
    • Proto:协议类型,这里因为使用了-t选项,所有只显示TCP协议。
    • Local Address:本地地址,这里可能会有以下三种不同的表现形式:
    • 0.0.0.0,后面的端口号表示是本机默认所有开放的端口,这些端口一般都是由一些系统服务所开启的。这些默认开放的端口它们所对应的外部地址一般也都是0.0.0.0,即表示它们所有的外部主机,它们的一般为LISTEN,处于监听状态。
    • 127.0.0.1,后面的端口通常都是由一些需要调用本地服务的程序开启的。
    • 本地IP,后面的端口通常是已某个外部主机建立连接,它们的状态一般为ESTABLISHED,处于已建立连接状态。
    • Foreign Address:远程地址,与主机建立连接的外部主机。
    • State:状态,最常见的有以下两种:
    • LISTEN:监听状态,等待接收入站的请求。
    • ESTABLISHED:连接以建立,表示本机已经与其它主机建立好连接。
    • PID/Program name :进程ID和程序名,可以使用kill命令+进程ID关闭端口和程序。
    • 关闭mysql和端口
    [root@Linux ~]# kill 6459
    [root@Linux ~]# netstat -antp
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1694/master         
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1540/sshd           
    tcp        0      0 192.168.10.137:22       192.168.10.1:4591       ESTABLISHED 6121/sshd: root@pts 
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1694/master         
    tcp6       0      0 :::443                  :::*                    LISTEN      6219/httpd          
    tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
    tcp6       0      0 :::80                   :::*                    LISTEN      6219/httpd          
    tcp6       0      0 :::21                   :::*                    LISTEN      6502/proftpd: (acce 
    tcp6       0      0 :::22                   :::*                    LISTEN      1540/sshd           
    

查看开启端口的程序

  • 除此之外,还有很多其他不同的状态,这些状态通常都与建立TCP连接的三次握手过程密切相关。
  • “-tan”是netstat命令的常用选项组合。除此之外,选项组合“-uan”用于查看所有UDP端口的状态信息,选项组合“-tnl”用于查看所有处于监听状态的TCP端口状态信息。另外,使用“netstat -nr”命令可以查看路由表的信息,与执行“route -n”命令的结果相同。
  • 由于Linux系统中执行netstat名显示的信息非常多,所以该命令通常都是结合grep命令一起使用。例如,想查看主机是否开放了TCP21端口,可以执行“netstat -ant | grep :21”命令,之所以要在端口号之前加上冒号,是因为如果不加冒号的话,就会将所有含有“21”这两个字符的行列出来。命令执行后显示的信息表示TCP21端口已经开放,而且正处于LISTEN监听状态,这也意味着系统运行了FTP服务。这些状态为LISTEN的端口随时在等待特别的计算机与它建立连接,也就是说它们在随时等待为其他计算机提供服务。
[root@Linux ~]# netstat -ant | grep :21
tcp6       0      0 :::21                   :::*                    LISTEN  
  • 下面再来介绍一下如何连接。先在图形模式下打开浏览器并访问百度,然后执行“ping www.baidu.com”命令解析出百度的IP地址为”61.135.169.105“,接下来执行”netstat -ant“命令,从中找到我们与百度所建立的连接。在所显示的信息中,”192.168.10.128:54509“和“51.135.169.105:80”就分别是一个Socket其由“192.168.10.128:65509”是客户端Socket ,“51.135.169.105:80”为服务端。
  • 例如:查看系统中所有开放的TCP端口,以及开启该端口的程序。
[root@Linux ~]# netstat -antp | grep "LISTEN"
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1694/master         
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1540/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1694/master         
tcp6       0      0 :::443                  :::*                    LISTEN      6219/httpd          
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::80                   :::*                    LISTEN      6219/httpd          
tcp6       0      0 :::21                   :::*                    LISTEN      6502/proftpd: (acce 
tcp6       0      0 :::22                   :::*                    LISTEN      1540/sshd
  • 也可以反过来通过这个命令查看某个服务开放了哪些端口。
  • 例如:查看sshd服务开放了哪个端口。
[root@Linux ~]# netstat -antp | grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1540/sshd           
tcp        0     36 192.168.10.137:22       192.168.10.1:4591       ESTABLISHED 6121/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      1540/sshd   

ss命令

  • ss也是一个用来查看端口与连接状态的命令,功能与netstat差不多,但性能相比netstat要好得多,所以在CentOS7系统中,ss被设计用来取代netstat,尤其是在网络连接数量比较多的情况下,推荐使用ss命令来查看连接状态等信息。
  • ss命令的基本用法和选项都与netstat命令相识,比如以数字形式查看所有TCP端口的状态信息。
[root@Linux ~]# ss -tna
State       Recv-Q Send-Q               Local Address:Port                   Peer Address:Port              
LISTEN      0      100                      127.0.0.1:25                                *:*                  
LISTEN      0      128                              *:111                               *:*                  
LISTEN      0      128                              *:22                                *:*                  
ESTAB       0      0                   192.168.10.137:22                     192.168.10.1:4591               
LISTEN      0      100                          [::1]:25                             [::]:*                  
LISTEN      0      128                           [::]:443                            [::]:*                  
LISTEN      0      128                           [::]:111                            [::]:*                  
LISTEN      0      128                           [::]:80                             [::]:*                  
LISTEN      0      128                           [::]:21                             [::]:*                  
LISTEN      0      128                           [::]:22                             [::]:*           
  • 例如:查看TCP22端口是由哪个程序开启的。
[root@Linux ~]# ss -tna | grep :22
LISTEN     0      128          *:22                       *:*                  
ESTAB      0      36     192.168.10.137:22                 192.168.10.1:4591               
LISTEN     0      128       [::]:22                    [::]:*  

其他网络相关设置

关闭防火墙

  • 在操作系统中开启防火墙,主要作用是阻止非法尝试连接,减少系统被服务器攻击成功率,使系统更安全。在学习,测试等环境中,为了避免因防火墙带来不必要的麻烦,建议暂时关闭防火墙。在生产环境中,当刚安装完系统是,也建议先将防火墙关闭,等到部署应用并了解需要开放那些端口后再启用防火墙,这样可以避免在应用的部署过程中出现一些意想不到的奇怪问题。
  • 对于CentOS7之前的RedHat内核系列的Linux系统,iptables一直是系统默认且唯一的防火墙,但是从CentOS7开始采用firewalld作为系统防火墙。当然iptable在系统依然存在,不过默认处于被禁止状态。
  • 系统安装完成后,firewalld就处于运行并自动启动状态,可以通过systemctl命令查看firewalld服务状态:
[root@Linux ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2021-01-10 16:51:38 CST; 2s ago
     Docs: man:firewalld(1)
 Main PID: 7119 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─7119 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

1月 10 16:51:38 Linux systemd[1]: Starting firewalld - dynamic firewall daemon...
1月 10 16:51:38 Linux systemd[1]: Started firewalld - dynamic firewall daemon.
  • 例如:关闭防火墙。
[root@Linux ~]# systemctl stop firewalld
[root@Linux ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 日 2021-01-10 16:52:20 CST; 1s ago
     Docs: man:firewalld(1)
  Process: 7119 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 7119 (code=exited, status=0/SUCCESS)

1月 10 16:51:38 Linux systemd[1]: Starting firewalld - dynamic firewall daemon...
1月 10 16:51:38 Linux systemd[1]: Started firewalld - dynamic firewall daemon.
1月 10 16:52:20 Linux systemd[1]: Stopping firewalld - dynamic firewall daemon...
1月 10 16:52:20 Linux systemd[1]: Stopped firewalld - dynamic firewall daemon.
  • 例如:自动启动防火墙。
[root@Linux ~]# systemctl enable firewalld
  • 例如:禁止自动启动防火墙。
[root@Linux ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
  • 例如:查看自动状态。
[root@Linux ~]# systemctl is-enabled firewalld
disabled

关闭SELinux

  • SELinux(Security-Enhanced Linux)是Linux系统中内置的一种安全机制,它虽然增强了系统安全性,但是也为了用户的操作带来的诸多不便。在之后配置各种系统服务的过程中,为了避免SELinux带来的各种干扰,因而建议也将其关闭掉。
  • SELinux在CentOS7系统中默认开启,执行“getenforce”命令可以查看SELinux的工作状态,Enforcing表示SELinux正处于强制关闭,此时所有的SELinux规则都会生效。
[root@Linux ~]# getenforce 
Enforcing
[root@Linux ~]# setenforce 
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@Linux ~]# setenforce 0
[root@Linux ~]# getenforce 
Permissive
  • 执行“setenforce 0”命令相当于临时关闭了SELinux,如果要重新启用SELinux,可以执行“setenforce 1”命令,此时会将SELinux重新设置为Enforcing模式。
  • 如果要彻底关闭SELinux,就需要修改SELinux的配置文件“/etc/selinux/config”,或者是修改配置文件“/etc/sysconfig/selinux”。“/etc/sysconfig/selinux”其实是“/etc/selinux/config”的一个软链接。
  • 利用vi/vim编辑器打开文件之后,找到“SELinux=enforcing”行,将之修改为“SELinux=disabled”,然后保存退出即可。
[root@Linux ~]# vim /etc/selinux/config 


# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
  • 需要注意的是,修改完配置文件之后,需要重启系统才可生效。

修改内核参数

  • /proc目录是Linux系统中的一个伪文件系统,这个目录存放的并不是硬盘中的文件,而是内存中正在运行的数据,是系统内存的映射。Linux内存也会把自己的内部状态信息,统计信息以及一些可配置的参数等,通过proc伪文件系统加以输出。因而我们即可以通过访问/proc来获取系统信息,也可以通过修改可配置的参数来对系统运行进行调整,并且这种调整是立刻生效的。
  • 在CentOS7系统中提供了sysctl命令对内核参数进行调整,执行“sysctl -a”就可以显示所有的内核参数。
[root@Linux ~]# sysctl -a
abi.vsyscall32 = 1
crypto.fips_enabled = 0
debug.exception-trace = 1
debug.kprobes-optimization = 1
debug.panic_on_rcu_stall = 0
dev.cdrom.autoclose = 1
dev.cdrom.autoeject = 0
dev.cdrom.check_media = 0
dev.cdrom.debug = 0
dev.cdrom.info = CD-ROM information, Id: cdrom.c 3.20 2003/12/17
dev.cdrom.info = 
dev.cdrom.info = drive name:        sr0
dev.cdrom.info = drive speed:       1
dev.cdrom.info = drive # of slots:  1
dev.cdrom.info = Can close tray:        1
dev.cdrom.info = Can open tray:     1
dev.cdrom.info = Can lock tray:     1
dev.cdrom.info = Can change speed:  1
dev.cdrom.info = Can select disk:   0
...
  • 当然这么多内核参数,经常用到的也就是下面要列举的这两项。另外虽然通过sysctl命令也可以调整内核参数,但我们更加习惯使用的方法是调整/proc目录中的文件。所有的内核可配置参数都以文件的形式被存放在/proc/sys目录中,当然由于/proc是一个伪文件系统,里面存放的并不是真正的文件,所以不能像普通文件一样直接对内核参数修改文件,而是通过echo命令以重定向的方式进行修改。
  • 例如:开启内核路由转发功能(通过0或1设置开关),/prot/sys/net/ipv4/ip_forward文件对应实际上就是“net.ipv4_forward”内核参数。
[root@Linux ~]# echo "1">/proc/sys/net/ipv4/ip_forward
  • 例如:禁止接收ICMP回显请求消息(禁止ping本机),/proc/sys/net/ipv4/icmp_echo_ignore_all文件对应的是“net.ipv4.icmp_echo_ignore_all“内核参数。
[root@Linux ~]# echo "1">/proc/sys/net/ipv4/icmp_echo_ignore_all
  • 以上通过修改/proc相关文件的方式来修改内核参数,在系统重启后将来不再有效,如果希望设置参数永久有效,可以修改/etc/sysctl.conf文件,文件格式“选项=值”。
  • 例如:通过修改配置文件将上诉两个参数设置为永久有效。
[root@Linux ~]# vim /ect/sysctl.conf

net.ipv4.ip_forward=1