一、网络层次:
应用层:包含应用间、服务器间的交流语言——通常时一种高级协议
传输层:用于规定应用层的数据传输形式。包括数据完整性的检查、端口功能以及将数据分包(如果应用层未分包)
网络层:规定如何识别源主机和目的主机
物理层:规定如何通过物理中介(如以太网、调制解调器)发送原始数据。
二、网络层:
1、查看IP:
$ ifconfig
网络前缀:10.23.2.0
子网掩码:255.255.255.0
另一种子网表示方法:无类域内路由选择(CIDR):10.23.2.0/255.255.255.0写成10.23.2.0/24
3、路由和内核路由表:将各子网连通过程就是识别路由器过程。
查看路由表
$ route -n
4、网际控制报文协议(ICMP):用于查找路由和连接问题
1)ping:
$ ping 10.23.2.1 //最重要的时序列号(icmp_req)和来回时间(time)
$ traceroute host //能显示处数据包到达主机所走过的路
5、域名系统(DNS):使用名称替代IP地址
三、物理层
1、以太网特性
1)所有以太网的设备都有各自的介质访问控制(MAC)地址,有时也叫硬件地址
2)以太网设备以帧的形式发送消息,帧里除了实际的数据,还有发送者和接收者的MAC地址
2、一般约定一个以太网就是一个互联网的子网。如果要将帧送到另一个子网,工作在网际层的路由器会把它重新解包,重新封装,再发给目标。
3、内核网络接口:沟通物理层和网际层的方法
1)配置网络接口:把网际层的IP地址跟物理层的硬件标识对应起来
A、网络接口的名字通常概括了它的硬件类型,例如eth0(计算机的第一块以太网卡)和wlan0(无线接口)
B、Linux机器连到互联网
a、接上网络硬件,并保证内核有它的驱动,如果有,可以使用ifconfig -a来显示该硬件对应的网络接口
b、进行任意物理层设置,可以配置网络名称和密码
c、给网络接口绑定一个IP地址和掩码,使得驱动(物理层)能识别子网(网际层)
d、添加必要的路由,包括默认网关
第一步由内核来做,第二步不用做,第三步和第四步分别需要用ifconfig和route命令来执行
2)手动设置IP地址和掩码
# ifconfig interface address netmask mask
这里interface是网络接口的名字,例如eth0。当网络接口能用了的时候,就可以添加路由了(其实就是设置默认网关)
# route add default gw gw-address
参数gw-address是默认网关的IP地址,它必须处于其中一个网络接口的地址和掩码所定义的子网之中
四、自由配置
1、开机启动网络配置:
1)解释:在开机时让初始化程序执行一个含有ifconfig和route之类的网络配置命令脚本,使它处于开机的一连串事件当中
2)问题:一台机器的IP地址不是一成不变的
动态主机配置协议(DHCP):可以给某些客户端做一些简单的网际层配置
2、一些网络配置管理器——NetworkManager:是一个开机时就启动的守护进程。(自动配置方法)
1)任务时监听系统和用户的事件,并根据一堆规则来改变网络配置
2)它维护着两个层次的配置。
第一层是它从内核收集而来,并通过监控桌面总线(D-Bus)的udev来维护的一堆可用的硬件设备的信息。
第二层是连接配置:硬件设备和额外的物理层、网际层的配置参数。例如,一个无线网络可看作是一个连接。
3)例子,
NetworkManager激活一个连接的做法,将任务交给其他特定的网络工具或守护进程(例如,dhclient,它会从接上的本地网络那里获得网际层配置)
4)工作过程
启动:会收集所有可用网络配置信息,在连接表当中决定激活某一个。以下时它“做出决定”的方法
A、优先连接可用的有线网络,若没有,则连无线网络
B、对于无线网络,优先选择以前连过的
C、如果有多个都是以前连过的,则选择最近一次连接的那个
连接建立以后,由它来维护,直至断开,或被更好的网络取代(例如用着无线的时候接上了有线),或用户强行更换
5)与NetworkManager交互
A、使用不带参数的nm-tool,可以快速的列出当前连接状态,里面有网络接口及参数。里面有网络接口以及它们的参数
B、nmcli命令可以操控NetworkManager
C、nm-online命令显示网络能不能用,如果能用,则返回退出码0,其他情况,返回非0
6)配置:一般NetworkManager的配置文件时放在/etc/NetworkManager目录中,里面有各种不同的配置文件
A、里面:将一些键值对写在不同的小节中。几乎所有的配置文件都有[main]小节,用以定义插件
B、更改配置
a、不受管理的接口:可以用插件来让NerworkManager忽略某个网络接口
如果用ifupdown(在Ubuntu和Debian上),那么将接口配置加到/etc/network/interfaces文件中,然后在NetworkManager.conf文件的ifupdown小节,把manager设为false
[ifupdown]
managed=false
对于Fedora或Red Hat的ifcfg-rh插件,则是在/etc/sysconfig/network-scripts的名为ifcfg-*的配置文件中找出这样的行
NM_CONTROLLED=yes
如果没找到这样的行,或找到值为no的行,则代表NetworkManager会忽略该接口。通常ifcfg-lo文件就设好了忽略
忽略某个硬件地址
HWADDR=10:78:d2:eb:76:97
如果这两类网络配置方案都不使用,可以通过keyfile插件,直接在NetworkManager.conf文件里指定要忽略的硬件地址
[keyfile]
unmanaged-devices=mac:10:78:d2:eb:76;mac:1c:65:9d:cc:ff:b9
b、调度
让其他系统事件与网络接口的开启或关闭产生关联。例如,有些网络的守护进程需要知道何时才开始或停止监听某个网络接口
3、解析主机名
1、作用:DNS在应用层,是用户空间的事。技术上,与物理层和网际层没关系。但没有正确的DNS配置,连接不会起作用。自动网络配置服务,如DHCP,几乎总是包含DNS配置。
2、Linux网络应用都会做DNS查找,步骤:
1)应用会调用一个函数,去查找主机名对应的IP。该函数在共享库中,应用只管调用,无需了解其中实现手段
2)当该函数运行时,根据一系列规则来决定查找的计划
3)使用DNS,先要找到DNS服务器(在一个额外的文件里定义了这个DNS服务器的IP)
4)该函数发送一个DNS查询请求给DNS服务器
5)DNS服务器将请求中的主机名对应的IP返回给函数,再由函数返回给应用
3、/etc/hosts:大多数系统会允许通过此文件从写主机名的查找
4、resolv.conf文件:在此文件中指定DNS服务器。
5、缓存和零配置DNS
6、/etc/nsswitch.conf文件:掌管着一些域名相关的优先级设定,例如账号和密码
五、传输层:TCP、UDP:让网络层的包与应用层的需求无缝连接。
其中最常用的两个协议是TCP(传输控制协议)和UDP(用户数据报协议)
1、TCP端口与连接:TCP方式是指不同的网络应用使用不同的网络端口
使用TCP时,应用会在本机的一个端口和远程机器的一个端口之间建立连接
1)显示TCP连接
$ netstate -nt
2)建立TCP连接
A、解释:
要建立传输层的连接,进程会发送一系列特别的数据包,先初始化一个从其本机端口到远端口的连接
为了识别这个连接请求并进行答复,远端必须有个进程监听着那个被请求的端口
客户端挑选的本地端口时当前未用到的,而远端端口则是“公认的”
B、监听:远端与公认端口连着,意味着机器上有服务器正在监听这该端口
公认端口:/etc/services:保存着一些常用端口及其服务的名字
2、DHCP
1)解释:
主机必须先能发信至其网络中的DHCP服务器,才能通过DHCP获取网络配置。
每个物理网络必须有自己的DHCP服务器,在普通网络中,通常以路由器充当DHCP服务器
主机只向DHCP服务器要求在一定时间内“租用”某个IP。当租用期结束,DHCP客户端可以要求更新租约。
2)Linux的DHCP客户端
尽管网络管理系统有很多种,几乎都使用互联网软件联盟(ISC)的dhclient程序来工作
可以手动测试dhclient,在此之前,必须移除所有默认网管,这个测试需要指定网络接口的名字(这里以eth0为例)
# dhclient eth0
开始后,dhclient会将它的进程ID放在/var/run/dhclient.pid中,而将租用信息放在/var/state/dhclient.leases中
3)Linux的DHCP服务器
可以在Linux机器上运行DHCP服务器,以妥善管理IP地址。除非是拥有多个子网的大型网络,否则最好选择内置DHCP服务器的路由器
3、Linux配置成路由器
1)解释:
路由器:不止一个网络接口的计算机
配置好两个子网IP,加一个上行IP
2)激活路由器内核的IP转发
# sysctl -w net.ipv4.ip_forward
建立网络地址转换(NAT)的功能:两个子网中的使用该路由作为默认网关的所有主机就能连上互联网了
4、网络地址转换
1)
NAT:是把单个IP分享给整个私有网络
NAT基本思想:路由器做的不只是将数据包从一个子网传到另一个子网,而且将数据包转化了
2)接着运行一些看起来听古咋的IPtables命令
# sysctl -w net.ipv4.ip_forward
# iptables -P FORWARD DROP
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
六、防火墙:是一种软件和(或)硬件的配置,处于互联网和小型网络之间的路由器之中,以保证小型网络免于来自互联网的攻击。
1、IP过滤:可以给每一台机器都配置防火墙,这样每台机器都可以从数据包的级别筛选进出的数据(从应用层级别的话,往往是使用服务器的程序进行访问控制)
1)系统可以在这些情况下过滤数据包
2)接收数据包时;发送数据包时;将数据包转发到其他主机或网关时;
3)
没有防火墙的话,系统只会按原来的做法来处理数据宝。
防火墙会在上述的几种场合设立检查点。这些检查点会根据以下标准来丢弃、拒绝或者接受数据包:
源或目标的IP或子网;源或目标的端口(传输层的信息);防火墙的网络接口
2、Linux防火墙基础
Linux中,防火墙的规则时链型的。一个表就是一套链。
数据包在Linux网络子系统的各部分移动时,内核会对包应用某套规则。例如,从物理层接受到一个新的包之后,内核就会根据输入的数据激活对应的规则。
filter(过滤)的表,它控制基本的包流动:三个基本的链:对应包输入的INPUT、对应包输出的OUTPUT和对应包转发的FORWARD
3、设置防火墙规则
# iptables -L //通常输出的链设置是空的
如果没有指定对数据包使用何种规则,防火墙就会执行其默认的“策略”
# iptables -P FORWARD DROP
如果你对192.168.34.63这个用户不胜其烦,想将其屏蔽
# iptables -A INPUT -s 192.168,34,63 -j DROP //参数-A INPUT给INPUT链增加了一个规则。而-s 192.168.34.63指定规则所针对的源IP,-j DROP,当数据包符合规则,内核会将其丢弃
想查看设置好的规则
# iptables -L
192.168.34.63发动了他子网上的所有人向你请求SMTP(TCP端口为25)连接。想摆脱它们,执行
# iptables -A INPUT -s 192.168.34.0/24 -p tcp --destination-port 25 -j DROP //这个例子为源地址增加了掩码限定符,并用-p tcp限定了只屏蔽TCP包。用--destination-port 25声明只屏蔽端口25.现在IP表中的INPUT
4、防火墙策略
防火墙应用场景:
1)保护单台机器(在每台机器的INPUT链插入规则)
2)保护整个网络里的机器(在路由器的FORWARD链插入规则)
如果有一个SSH服务器在TCP端口22,不应该让别人连到22以外的端口,要做到这样,首先将INPUT链策略设置为DROP:
# iptables -P INPUT DROP
可以通过以下命令,允许ICMP通信(给ping或其他工具使用)
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -s 127.0.0.1 -j ACCEPT
# iptables -A INPUT -s my_addr -j ACCEPT
如果你控制着整个子网(并信任其中所有东西),可以将my_addr替换子网地址和掩码,例如10.23.2.0/24
虽然你想阻止所有TCP连接请求,
SSH:常见的网络服务应用之一,是一种远程连接Unix机器的标准
配置好之后,就能通过SSH进行安全的shell登录、执行远程程序、共享简单的文件等。
SSH还凭借公钥认证和简单的会话加密,取代了旧的、不安全的远程登录系统telnet和rlogin
OpenSSH的客户端是ssh,服务器是sshd。SSH协议有两个主要版本:1和2,OpenSSH对两者都支持,1少见。
SSH的功能和特性使它能做到以下事情
对密码和会话内容加密;作为其他网络连接的管道,包括来自X Window客户端的连接;几乎所有操作系统都可用SSH连接;使用密钥做主机认证;
SSH缺点
若想建立SSH连接,必须知道远程主机的公钥,不需要通过什么保密的渠道就能获得的
SSHD服务器
运行sshd需要一个配置文件以及主机密钥
配置文件放在/etc/ssh配置目录
开启SSH服务器
尽管大多数发行版都带有SSH,但默认却不会启动sshd服务器。
# chkconfig sshd on //Fedora一般会在sshd初次启动时补键漏掉的密钥文件
SSH客户端
想登录远程主机,运行
$ ssh remote_username@host
SSH文件传输客户端
OpenSSH包含了文件传输程序:scp和sftp。可以用scp在本机和远程主机之间传输文件,就像cp命令一样
$ scp user@host:file
$ scp file user@host:dir
$ scp user@host1:file user2@host2:dir
守护进程inetd和xinetd
每个服务器都要分别配置端口监听、访问控制、端口设置。大多数服务的配置方式都是一样的,只是处理连接的方式不同
传统解决方法是:使用inetd守护进程,它是一种超级服务器,用于规范网络端口的接入和服务器程序与网络端口之间的接口
启动inetd之后,会读取自己的配置文件,并监听其中提到的网络端口,当连接到来时,inetd就会新开一个进程来处理它
xinetd是inetd的新版本,被systemd取代,systemd的套接字单元能提供同样的功能
典型漏洞
直接攻击和嗅探密码
直接攻击:利用缓存溢出,原因:粗心的程序员没检查数组边界而造成,攻击者在一大堆数据中编造一个栈帧,然后送到远程服务器,并期望它溢出而覆盖了程序,最终导致服务器执行了栈帧中的东西。
嗅探明文密码:指获取网络上明文传输的密码。
有些服务因为设计缺陷而经常成为攻击目标,例如以下服务
ftpd,telnetd、rlogind、rexecd,fingerd
安全资源
http://www.sans.org/;http://www.cert.org/;http://www.insecure.org/
传输层安全(TLS)及其前身安全套接层(SSL):这些空间的层次被加插到客户端和服务器,用公钥加密和认证来支援网络通信