linux处理数据包的过程:
当外界主机发送数据的时候,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机,如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收处理)。
如果是流入本机的,那么用户空间会对流入的数据进行响应,也就是应用程序生成新的数据,在响应包流出之前,需要作出路由决策,根据目标决定从哪个网卡流出。
如果不是流入本机的,而是要转发到其他主机,则必然涉及到到另一个流出网卡,此时数据包必须完整的从流入网卡转发到流出网卡,这要求linux主机可以完成这样的转发。但是linux主机默认未开启ip_forward功能,这使得数据包无法被转发而被丢弃。
要注意:linux主机和路由器是不同的,路由器是可以直接通过不同的网卡进行数据转发的,而linux主机流入的数据必须进入内核空间。而由于内核ip_forward功能默认没有开启,那么linux主机默认不能转发。
ip地址是属于内核的,不仅如此,整个tcp/ip协议栈都是属于内核的,包括端口号。那么,如果外界的主机可以和其中一个ip通信,那么它进可以和其他ip通信,因为这ip都在内核中。假如,一个主机有两块网卡eth0:172.25.10.1 和 eth1: 192.168.10.1 ,而外界主机192.168.10.2的主机网关指向eth1,那么外界主机ping eth0网卡的ip是可以ping通的,因为数据包会从eth1进入内核,会被内核分析,内核分析目标地址为本机地址,直接就回应外界主机,数据通过eth1流向外界主机。
这个例子是,当linux主机开启内核转发功能时候的情况,而没有开启转发功能的linux内核,不同网卡之间是无法跨越网端进行通信。
那么,怎样开启linux内核转发功能呢?
linux中开启内核的路由转发功能有多种方法:
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提供自定义内核修改项的目录。例如:
shell> echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
使用以下两种方法查看是否开启内核的路由转发功能
[root@localhost tmp]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
[root@localhost tmp]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
[root@localhost tmp]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@localhost tmp]# sysctl net.ipv4.ip_forward
和网络相关的配置文件说明
1、网卡配置文件
通常,我们在/etc/sysconfig/network-scripts这个目录下会发现许多文件,这些文件大多数都是脚本文件,而以ifcfg-xxx为名字的就是网卡配置文件,而xxx时可以随意命名的。
[root@localhost net]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-eth0 ifdown-isdn ifdown-tunnel ifup-isdn ifup-Team
ifcfg-lo ifdown-post ifup ifup-plip ifup-TeamPort
ifdown ifdown-ppp ifup-aliases ifup-plusb ifup-tunnel
ifdown-bnep ifdown-routes ifup-bnep ifup-post ifup-wireless
ifdown-eth ifdown-sit ifup-eth ifup-ppp init.ipv6-global
ifdown-ippp ifdown-Team ifup-ippp ifup-routes network-functions
ifdown-ipv6 ifdown-TeamPort ifup-ipv6 ifup-sit network-functions-ipv6
[root@localhost network-scripts]# cat ifcfg-eth0
DEVICE=eth0 #在此处的名字必须在/sys/class/net下存在
BOOTPROTO=none
IPADDR=172.25.4.1
ONBOOT=yes
PREFIX=24
[root@localhost tmp]# cd /sys/class/net
[root@localhost net]# ls
eth0 lo
2、DNS配置文件/etc/resolv.conf,全局的
nameserver ip 设置dns指向最多3个
[root@ivans net]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
NAME="Bridge enp4s0f1"
ONBOOT=yes
BOOTPROTO=none
IPADDR0=172.25.254.4
PREFIX0=24
DEFROUTE=yes
IPADDR1=172.25.4.250
PREFIX1=24
DNS1=172.25.254.250
DOMAIN="ilt.example.com example.com"
IPV6INIT=no
PEERNTP=no
TYPE=Bridge
STP=no
IPV4_FAILURE_FATAL=no
注意,在这个文件上,dns1上开始添加dns服务器
3、/etc/services
该文件记录的是端口和服务的对应关系
[root@ivans net]# grep '^ftp\|^ssh' /etc/services
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
ftp-data 20/sctp # FTP
ftp 21/sctp # FTP
ssh 22/sctp # SSH
ftp-agent 574/tcp # FTP Software Agent System
ftp-agent 574/udp # FTP Software Agent System
sshell 614/tcp # SSLshell
sshell 614/udp # SSLshell
ftps-data 989/tcp # ftp protocol, data, over TLS/SSL
ftps-data 989/udp # ftp protocol, data, over TLS/SSL
ftps 990/tcp # ftp protocol, control, over TLS/SSL
ftps 990/udp # ftp protocol, control, over TLS/SSL
ssh-mgmt 17235/tcp # SSH Tectia Manager
ssh-mgmt 17235/udp # SSH Tectia Manager
网络接口配置和主机名
1、ifcfonfig,更多的是被显示已激活的网络接口信息
ifconfig 默认显示所有网络接口的状态
ifconfig eth1/lo显示具体某个网络接口的状态信息
ifconfig eth1 up 激活该网络接口
ifconfig eth1 down 临时down掉eth1接口
2、hostname 用于设置主机名
hostname newname用于临时设置主机名
此时,会修改/proc/sys/kernel/hostname 这个文件,仅仅是临时修改主机名,此时不用重启,ssh连接该主机会显示主机名已经修改了。
/etc/hostname 这个文件是永久修改主机名
hostname -I 获取本机所有非环回的ip地址
hostname -f 获取fqdn
fqdn 是全限定域名,同时带有主机名和域名,用 . 隔开
全限定域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名地一种完全表示方式。
[root@ivans net]# hostname -I
192.168.1.135 172.25.254.4 172.25.4.250 192.168.122.1 fd7d:236:4765::b01 fd7d:236:4765:0:21e:64ff:feec:8943
[root@ivans net]# cat /etc/hostname
ivans
[root@ivans net]# cat /proc/sys/kernel/hostname
ivans
[root@ivans net]# hostname cc
[root@ivans net]# cat /proc/sys/kernel/hostname
cc
网关路由
linux