linux网络基础总结

最近在做linux网络相关的业务,使用过程中发现有些知识点依然比较模糊。总结如下,

Linux处理数据包过程

  当外界向主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机。
  如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出。
  如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。如下图:
avatar
另外,IP地址是属于内核的(不仅如此,整个tcp/ip协议栈都属于内核,包括端口号),只要能和其中一个地址通信,就能和另一个地址通信(这么说是不准确的,即使地址属于内核,但还存在一个检查数据包是否丢弃的问题,不过这不是本文内容),而不管是否开启了数据包转发功能。例如某Linux主机有两网卡eth0:172.16.10.5和eth1:192.168.100.20,某192.168.100.22主机网关指向192.168.100.20,若它ping 172.16.10.5,结果将是通的,因为地址属于内核,从eth1进来的数据包被内核分析时,发现目标地址为本机地址,直接就回应192.168.100.22,回应数据包继续从eth1出去。
如果Linux主机有多块网卡,如果不开启数据包转发功能,则这些网卡之间是无法互通的。例如eth0是172.16.10.0/24网段,而eth1是192.168.100.0/24网段,到达该Linux主机的数据包无法从eth0交给eth1或者从eth1交给eth0,除非Linux主机开启了数据包转发功能。
在Linux上开启转发功能有多种方法:

1
2
shell> echo 1 > /proc/sys/net/ipv4/ip_forward
shell> sysctl -w net.ipv4.ip_forward=1

以上两种方法是临时生效的,若要永久生效,则应该写入配置文件。在CentOS 6中,将/etc/sysctl.conf文件中的”net.ipv4.ip_forward”值改为1即可,但在CentOS 7中,systemd管理了太多的功能,sysctl的配置文件也分化为多个,包括/etc/sysctl.conf、/etc/sysctl.d/.conf和/usr/lib/sysctl.d/.conf,并且这些文件中默认都没有net.ipv4.ip_forward项。当然,直接将此项写入到这些配置文件中也都是可以的,建议写在/etc/sysctl.d/*.conf中,这是systemd提供自定义内核修改项的目录。例如:

1
shell> echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf

可以使用以下几种方式查看是否开启了转发功能。

1
2
3
4
5
6
7
[root@test ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
[root@test ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@test ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
[root@test ~]#

网卡相关配置

网卡配置文件

对于网卡信息的配置通常包括:配置IP地址、子网掩码和网关。网卡信息保存在网卡配置文件中。网卡配置文件位于/etc/sysconfig/network-scripts目录下。一块网卡对应一个网卡配置文件,配置文件命名规则:
ifcfg-网卡类型以及网卡的序列号
由于以太网卡类型是eth,网卡的序列号从0开始,所以第一块网卡的配置文件名称为ifcfg-eth0,第二块网卡为ifcfg-eth1,以此类推。
网卡配置文件中常用配置文件名的还以如下:
DEVICE=eth0,定义该网卡的识别名称。
BOOTPROTO=dhcp,启动该网卡的识别名称。
static/none:代表固定的IP地址;bootp/dhcp:通过BOOTP或DHCP协议取得IP地址。
HWADDR=00:02:B3:0B:64:22,该网卡的MAC地址。
ONBOOT=yes,启动network服务时,是否启用该网卡。当RedHat系统启动network服务时,network服务一次读取保存于/etc/sysconfig/network-scripts/目录下所有网卡的配置文件。如果网卡配置文件的ONBOOT设置为yes,则network服务就会调用ifup命令启动该网卡;如果网卡的配置文件的ONBOOT参数为no,network会跳过启动这个网卡的工作。
TYPE=Ethernet,网卡的类型。
USERCTL=no,是否允许普通用户启动或者停止该网卡。
IPV6INIT=no,是否在该网卡上启动IPV6的功能。
PEERDNS=yes,是否允许网卡在启动时向DHCP服务器查询DNS信息,并自动覆盖/etc/resolv.conf配置文件。
以下配置项用于指定该网卡的静态IP地址,此时BOOTPROTO必须为static或者none。
IPADDR=192.168.1.55,静态方式指定网卡的IP地址。
NETMASK=255.255.255.0,定义该网卡的子网掩码。
MTU=1500,设置网卡的MAC帧最大传输单位大小。
GATEWAY=192.168.1.1,设置网络的默认网关。
DNS1=192.168.128.5,指定主要的DNS服务器地址。
DNS2=192.168.128.6,指定备用的DNS服务器地址。

配置网卡信息

配置网卡信息可以直接修改网卡配置文件中的相关内容,但是这种方法对用户的要求比较高。在RedHat Enterprise Linux5中常用于设置IP地址的三个命令,分别是:system-config-network、setup和ifconfig。其中ifconfig设置IP地址的方法将在常用命令部分中介绍。
(1)system-config-network命令
在命令提示行下输入system-config-network命令将会启动可视化网络配置界面(对于新手这个方式比较简单)
(2)setup设置网卡信息
在命令行下输入setup命令后将会进入系统设置界面,然后选择网卡设置进入网卡设置界面(很多系统都可以使用setup命令设置,运用比较广)
(3)ifconfig网卡常用命令
ifconfig命令的功能比较强大,可以用来查看和设置网卡信息。
a.查看网卡信息
命令语法:ifconfig [参数]
参数说明:
无参数:显示当前活动的网卡

  • a:显示系统中所有网卡的配置信息
    网卡设备名称:显示指定网卡的配置信息
    eg:查看eth0网卡信息:#ifconfig eth0
    b.设置IP地址
    命令语法:ifconfig 网卡设备名 IP地址 netmask 子网掩码
    (注:ifconfig命令设置的IP地址即时生效,但是重启机器后,IP地址又回复到原IP地址,所以ifconfig命令只能用于设置临时的IP地址)
    eg:ifconfig eth0 192.168.168.156 netmask 255.255.255.0
    c.修改MAC地址
    命令语法:ifconfig 网卡设备名 hw ether MAC地址
    (注:修改网卡的MAC地址前要禁用网卡,修改后要启用网卡)
    eg:ifconfig eth0 hw ether 00:0C:29:03:F3:76
    几个常用的命令:
    1.ifdown禁用网卡
    语法:ifdown 网卡设备名
    2.ifup启用网卡
    语法:ifup 网卡设备名
    3.绑定IP和MAC地址
    实现方法:创建/etc/ethers文件,文件内容“ip地址 mac地址”,然后执行“arp -f”命令,是配置生效。
    eg:将IP地址193.168.168.154与MAC地址00:0C:29:03:F3:75绑定。
    echo “193.168.168.154 00:0C:29:03:F3:75”>>/etc/ethers
    arp -f
    查询及设置网卡参数Ethtool
    概要:
    ethtool ethX //查询ethX网口基本设置
    ethtool –h //显示ethtool的命令帮助(help)
    ethtool –i ethX //查询ethX网口的相关信息
    ethtool –d ethX //查询ethX网口注册性信息
    ethtool –r ethX //重置ethX网口到自适应模式
    ethtool –S ethX //查询ethX网口收发包统计
    ethtool –s ethX [speed 10|100|1000]\ //设置网口速率10/100/1000M
    [duplex half|full]\ //设置网口半/全双工
    [autoneg on|off]\ //设置网口是否自协商
    [port tp|aui|bnc|mii]\ //设置网口类型
    [phyad N]\
    [xcvr internal|exteral]\
    [wol p|u|m|b|a|g|s|d…]\
    [sopass xx:yy:zz:aa:bb:cc]\
    [msglvl N]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1)[root@linux /]# ethtool eth1

    Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    1000baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    1000baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: g
    Wake-on: d
    Link detected: yes

怎样使ethtool设置永久保存在网络设备中?
解决方法一:
ethtool设置可通过/etc/sysconfig/network-scripts/ifcfg-ethX文件保存,从而在设备下次启动时激活选项。
例如:ethtool -s eth0 speed 100 duplex full autoneg off
此指令将eth0设备设置为全双工自适应,速度为100Mbs。若要eth0启动时设置这些参数, 修改文件/etc/sysconfig/network-scripts/ifcfg-eth0 ,添加如下一行:
ETHTOOL_OPTS=”speed 100 duplex full autoneg off”
解决方法二:
将ethtool设置写入/etc/rc.d/rc.local之中。

DNS配置文件/etc/resolv.conf

/etc/resolv.conf它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。该文件是由域名解析器(resolver,一个根据主机名解析IP地址的库)使用的配置文件。它的格式很简单,每行以一个关键字开头,后接一个或多个由空格隔开的参数。resolv.conf的关键字主要有四个,分别是:
nameserver //定义DNS服务器的IP地址
domain //定义本地域名
search //定义域名的搜索列表
sortlist //对返回的域名进行排序

参考文章

http://www.cnblogs.com/f-ck-need-u/p/7074594.html
https://www.cnblogs.com/wolfkingzzy/archive/2012/04/07/Linux%E7%BD%91%E5%8D%A1%E9%85%8D%E7%BD%AE.html