Linux——网络与配置

网络与配置

网络基础

数据包

数据被分成一块块的在网络上传输,每一块叫作一个数据包(packet)。包中分为两部分:头和净荷。头含有一些识别信息,如发送方、接收方以及基本的协议。净荷则含有实际需要传送的数据,如HTML或图片数据。

分包使主机能够交替地做出发送、接收、处理数据的动作,所以主机之间看似能同时通信。而且这样也令错误检测和重传数据更方便。

网络层次

一个功能完整的网络,包含一整套被称为网络栈的网络层次

  • 应用层:包含应用间、服务器件的交流语言,通常是一种高级的协议。一般有超文本传输协议(Hypertext Transfer Protocol,以下简称HTTP,用于Web)、安全套接层(Secure Socket Layer,以下简称SSL)、文件传输协议(File Transfer Protocol,以下简称FTP)。协议能够组合使用。例如SSL就常跟HTTP一起用。

  • 传输层:用于规定应用层的数据传输形式。该层包括数据完整性的检查、端口功能以及将数据分包(如果应用层未分包)。传输控制协议(Transmission Control Protocol,以下简称TCP)和用户数据报协议(User Datagram Protocol,以下简称UDP)是传输层最常见的协议。这层有时也被称为协议层。

  • 网络层或网际层:规定如何识别源主机和目的主机。IP(网际协议)规定了互联网所使用的包传输规则。因为本书只讨论互联网,所以我们只谈及IP。

  • 物理层:规定如何通过物理中介(如以太网、调制调解器)发送原始数据。这层有时也被称为链路层或网络接口层。

网际层

互联网的拓扑结构是无中心的。它由更小的网络——子网构成。意思是,各子网以某些方式相连。

一个主机可以置于不止一个子网中。负责将数据从一个子网送到另一子网的那种主机叫作路由器(也叫网关)。

查看自己计算机的IP地址

一个主机可以有多个IP地址,以下命令用于查看主机使用中的地址:

$ ipconfig

它会输出很多结果,其中应该包括以下内容:

eth0 
Link encap:Ethernet HWaddr 10:78:d2:eb:76:97
inet addr:10.23.2.4 Bcast:10.23.2.255 Mask:255.255.255.0
inet6 addr: fe80::1278:d2ff:feeb:7697/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:85076006 errors:0 dropped:0 overruns:0 frame:0
TX packets:68347795 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:86427623613 (86.4 GB) TX bytes:23437688605 (23.4 GB)
Interrupt:20 Memory:fe500000-fe520000

ifconfig能展现网际层和物理层的许多细节。

子网

子网就是一组相互连接的、带有按序排列的IP地址的主机。通常这组主机会在同一个物理网络中。

划分子网需要考虑两点:一个是网络前缀,一个是子网掩码

假若你要建立一个包含10.23.2.1到10.23.2.254的子网,那么它们通用的网络前缀就是10.23.2.0

子网掩码就是255.255.255.0。下面解释为什么是这样。

前缀和掩码是怎样表示子网中的可用IP的?将点分四组序列转换成位,会比较易懂。掩码标记了子网内主机能共用的IP位。现将10.23.2.0和255.255.255.0转换成位

10.23.2.0:         00001010 00010111 00000010 00000000
255.255.255.0: 11111111  11111111  11111111  00000000

再将前缀中与掩码的那些1对应的位加粗:

10.23.2.0: 00001010 00010111 00000010 00000000

可将剩下未加粗部分的任何位设为1,以获得可用的IP地址(除了全0和全1)。

把它们合在一起,你就知道一个IP为10.23.2.1、子网掩码为255.255.255.0的主机是如何跟其他以10.23.2打头的主机共处一个子网的了。这整个子网可记为10.23.2.0/255.255.255.0。

共用子网掩码与无类域内路由选择

你可能会遇到难以判断子网可用IP范围的那种,例如255.255.255.192。你还可能会看到另一种子网的表示方式——无类域内路由选择(Classless Inter-Domain Routing,以下简称CIDR),它会将10.23.2.0/255.255.255.0写成10.23.2.0/24。

像255.255.255.0就是24个1后接8个0。掩码在CIDR中只记录其开头的1的个数,因此,10.23.2.0/24已完整地表达了前缀与掩码。

一些子网掩码及其CIDR形式

长形式 CIDR形式
255.0.0.0 8
255.255.0.0 16
255.240.0.0 12
255.255.255.0 24
255.255.255.192 26

路由和内核路由表

将各子网连通的过程,就是识别路由器的过程。

IP地址为10.23.2.4的主机A能够直接访问本地网络10.23.2.0/24上的其他主机。当要访问互联网上的其他主机时,它需要通过IP为10.23.2.1的路由器。

Linux内核是如何区分两个不同类型的目标地址的呢?其实,它是通过一种叫路由表的配置文件来决定自身的路由行为的。

route -n命令可以显示出路由表

$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.23.2.1 0.0.0.0 UG 0 0 0 eth0
10.23.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0

最后两行显示路由信息。 Destination列是网络前缀,Genmask列是对应的掩码。这里有两个网络:0.0.0.0/0(所有IP都可在这里找到对应)和 10.23.2.0/24。每个网络的Flags列都有个U,意味着该路由是活动的。

最后两行显示路由信息。 Destination列是网络前缀,Genmask列是对应的掩码。这里有两个网络:0.0.0.0/0(所有IP都可在这里找到对应)和 10.23.2.0/24。每个网络的Flags列都有个U,意味着该路由是活动的。

这些Destination的差异在于Gateway与Flags的组合。0.0.0.0/0的Flags有G,表示需要通过Gateway(10.23.2.1)才能访问它。而10.23.2.0/24的Flags无G,表示它能被直接访问。该行的Gateway列记为0.0.0.0,其他列暂时不管。

默认网关

0.0.0.0/0能匹配互联网中的所有IP,它是默认路由,其Gateway列(route -n所示的)的地址是默认网关。如果目标地址没有匹配到其他网络,那就将信息从默认网关送出,到默认路由里找。你可以给主机取消默认网关的配置,那它将只能访问路由表中所剩的网域。

基本ICMP和DNS工具

用于查找路由和连接问题的网际控制报文协议(Internet Control Message Protocol,以下简称ICMP),以及使用名称代替IP地址以便人们记忆的域名系统(Domain Name Service,以下简称DNS)。

ping

ping是最常见的网络调试工具之一。它发送一个ICMP请求报文给一台主机,这会使该接收者回送报文

$ ping 10.23.2.1
PING 10.23.2.1 (10.23.2.1) 56(84) bytes of data.
64 bytes from 10.23.2.1: icmp_req=1 ttl=64 time=1.76 ms
64 bytes from 10.23.2.1: icmp_req=2 ttl=64 time=2.35 ms
64 bytes from 10.23.2.1: icmp_req=4 ttl=64 time=1.69 ms
64 bytes from 10.23.2.1: icmp_req=5 ttl=64 time=1.61 ms

这里第一行说的是你发了56(包括头部的话,是84)字节的数据包给10.23.2.1(默认一秒一包),接下来的行是10.23.2.1的应答信息。其中最重要的是序列号(icmp_req)和来回时间(time)。返回信息的容量是发送信息的容量加8(数据包的内容不用管)。

来回时间是指数据包从发出到收回所经历的时间。如果包无法到到目的地,那么最后一站的路由器会返回host unreachable(无法到达主机)的信息。

traceroute

执行traceroute host能显示数据包到达目标主机所走过的路。(traceroute -n 主机名不查找主机名。)

它的优点之一,就是能告诉你每个路由之间的回程用时,如以下片段:

4 206.220.243.106 1.163 ms 0.997 ms 1.182 ms
5 4.24.203.65 1.312 ms 1.12 ms 1.463 ms
6 64.159.1.225 1.421 ms 1.37 ms 1.347 ms
7 64.159.1.38 55.642 ms 55.625 ms 55.663 ms
8 209.247.10.230 55.89 ms 55.617 ms 55.964 ms
9 209.244.14.226 55.851 ms 55.726 ms 55.832 ms
10 209.246.29.174 56.419 ms 56.44 ms 56.423 ms

因为6和7之间的有个很大的延时,所以那部分可能是一个长途的连接

traceroute的输出信息可能会不连续,在某步出现超时,而后面的步又能正常显示。那很可能是那一步的路由拒绝返回traceroute想要的调试信息,而往后的路由却愿意返回结果

DNS与host

系统上的DNS库通常会帮你搞定这种转换,但有时你可能会想自己手动转换。host命令用于找出域名的IP地址:

$ host www.example.com
www.example.com has address 93.184.216.119
www.example.com has IPv6 address 2606:2800:220:6d:26bf:1447:1097:aa7

注意,这个例子同时显示了IPv4地址93.184.216.119和一个更长的IPv6地址,说明该主机已拥有一个下一代互联网地址。

你也可以用host来反查IP地址的域名,即输入IP地址而不是域名。不过这个不太可靠。因为不同的主机名可以指向同一个IP地址,所以DNS无法得知哪个主机名才是你要的。

物理层与以太网

在IEEE 802标准的家族中,以太网有很多种,从有线到无线,但它们总有一些共性

  • 所有以太网上的设备都有各自的介质访问控制(Media Access Control,以下简称MAC)地址,有时这也叫硬件地址。它与主机的IP地址无关,而且它在主机所处的以太网中是唯一的(但在互联网这种大型的软件网络中不一定唯一)。MAC地址形如10:78:d2:eb:76:97。
  • 以太网上的设备以帧的形式发送信息,帧里除了实际的数据,还有发送者和接收者的MAC地址。

假设你有一台主机连接了两个不同类型的以太网(两个不同的网络接口设备),你是无法直接使帧通过该主机从一个以太网传送到另一个以太网的,除非该主机建立了一种特殊的桥梁。这就是网际层(如互联网层)的工作了

理解内核网络接口

网际层与物理层的连接方式必须使得网际层拥有不依赖于硬件环境的灵活性。Linux内核自有一套用于沟通这两层的方法,叫作**(内核)网络接口** 。所谓配置网络接口,就是把网际层的IP地址跟物理层的硬件标识对应起来。网络接口的名字通常概括了它的硬件类型,例如eth0(计算机的第一块以太网卡)和wlan0(无线接口)。

配置网络接口

  1. 接上网络硬件,并保证内核有它的驱动。如果有,可以使用ifconfig -a来显示该硬件对应的网络接口。
  2. 进行任意物理层设置,如可以配置网络名称和密码。
  3. 给网络接口绑定一个IP地址和掩码,使得驱动(物理层)能识别子网(网际层)。
  4. 添加必要的路由,包括默认网关

手动设置IP地址和掩码,需要执行以下命令:

ifconfig interface address netmask mask

这里interface是网络接口的名字,例如eth0。当网络接口能用了的时候,就可以添加路由了(其实就是设置默认网关):

route add default gw gw-address

参数gw-address是你默认网关的IP地址,它必须处于你其中一个网络接口的地址和掩码所定义的子网之中。

手动添加和删除路由

以下命令用来删除默认网关:

route del -net default

你可以在默认网关的位置填上其他路由。假如你机器在子网10.23.2.0/24,其中的路由器在10.23.2.44,你想访问192.168.45.0/24,那么以下命令让我们可以通过10.23.2.44访问 192.168.45.0:

# route add -net 192.168.45.0/24 gw 10.23.2.44

删除对某子网的路由时,则无需填写“路由”参数:

route del -net 192.168.45.0/24

一些网络配置管理器

基于Linux的系统都有一些自动配置网络的方法。桌面端或笔记本端常用NetworkManager。其他网络配置管理程序则针对更小型的嵌入式系统,例如OpenWRT的netifd、Android的ConnectivityManager服务、ConnMan和icd等

NetworkManager的操作

NetworkManager是一个开机时系统就启动的守护进程。跟其他守护进程一样,它不依赖桌面组件。它的任务是监听系统和用户的事件,并根据一堆规则来改变网络配置。

NetworkManager运行的时候,维护着两个层次的配置。

  • 第一层是它从内核收集而来,并通过监控桌面总线(D-Bus)的udev来维护的一堆可用的硬件设备的信息。

  • 第二层是更具体的一些连接配置:硬件设备和额外的物理层、网际层的配置参数。

NetworkManager激活一个连接的做法,是将任务交给其他特定的网络工具或守护进程(例如dhclient,它会从接上的本地网络那里获得网际层配置)。因为网络配置工具和方案因不同发行版而异,所以NetworkManager需要插件来适配它们,而非强推自己的标准。例如Debian/Ubuntu和Red Hat都有对应的插件。

与NetworkManager交互

可以在shell中使用其他工具来查询和操控NetworkManager。使用不带参数的nm-tool,可以快速地列出你当前的连接状态,里面有网络接口及它们的参数。这有些类似ifconfig,但没有ifconfig详细,尤其是关于无线网络方面。

nmcli命令可以操控NetworkManager

NetworkManager的配置

一般NetworkManager的配置文件是放在/etc/NetworkManager目录中,里面有各种不同的配置文件。

通常我们是看NetworkManager.conf这个文件。它的格式类似XGD风格的.desktop文件和微软的.ini文件,将一些键值对参数写在不同的小节中。几乎所有的配置文件都有[main]小节,用以定义插件。以下就是在Ubuntu和Debian 中激活ifupdown插件的例子:

[main]
plugins=ifupdown,keyfile

不受管理的接口

你可以用插件来让NetworkManager忽略某个网络接口。如果你在用ifupdown(在Ubuntu和Debian上),那么,将接口的配置加到/etc/network/interfaces文件中,然后在NetworkManager.conf文件的ifupdown小节,把managed设为false:

[ifupdown]
managed=false

你还是可以通过keyfile插件,直接在Network Manager.conf文件里指定要忽略的硬件地址,如下:

[keyfile]
unmanaged-devices=mac:10:78:d2:eb:76:97;mac:1c:65:9d:cc:ff:b9

调度

当网络接口的状态改变时,NetworkManager会运行/etc/NetworkManager/dispatcher.d里的所有东西,并给予一个up或者down的参数。这种是比较简单的,但很多系统都有自己的一套网络控制脚本,而不会将调度程序脚本放在那个目录里。

解析主机名

DNS与之前的网络话题的不同之处在于它在应用层,完全是用户空间的事

差不多所有Linux网络应用都会做DNS查找,步骤基本如下所示:

  1. 应用会调用一个函数,去查找主机名对应的IP。该函数在系统共享库中,应用只管调用,而无需了解其中实现手段。
  2. 当该函数运行时,它会根据一系列规则(规则在/etc/nsswitch.conf中)来决定查找的计划。例如,通常会有这样的规则——先检查/etc/hosts里的重写,再使用DNS。
  3. 使用DNS,先要找到DNS服务器(在一个额外的文件里定义了这个DNS服务器的IP)。
  4. 该函数发送一个DNS查询的请求给DNS服务器。
  5. DNS服务器将请求中主机名对应的IP返回给函数,再由函数返回给应用。

/etc/hosts

大多数系统都允许你通过/etc/hosts重写主机名的查找,该文件看起来会是这样:

127.0.0.1 localhost
10.23.2.3 atlantic.aem7.net atlantic
10.23.2.4 pacific.aem7.net pacific

resolv.conf文件

传统的做法是在/etc/resolv.conf文件中指定DNS服务器

search mydomain.example.com example.com
nameserver 10.32.45.23
nameserver 10.3.2.3

search的那行定义了针对残缺主机名(仅有主机名的第一部分,如myserver而非myserver.example.com)的查找方式。这里指定了会到host.mydomain.example.com和host.example.com查找。但平常是没这么简单的。DNS配置现在有了很多改善。

缓存和零配置DNS

传统的DNS配置有两个主要的问题

  1. 本机不缓存DNS服务器的回应,这样每次都请求解析会使网络减慢,方案:很多机器(包括作为DNS服务器的路由器)都会运行一个守护进程,尽可能地拦截DNS请求,并返回缓存中的DNS回应,做不到的话才把请求发送到DNS服务器。最常见的这种守护进程是dnsmasq和nscd。你还可以建立BIND(标准的UnixDNS守护进程)来做缓存。
  2. 扩展性差:例如多播DNS(以下称mDNS)和简单服务发现协议(Simple Service Discovery Protocol,以下简称SSDP)若你想在本地网络中按域名查找一个主机,那么可以发起广播,如果该主机存在,则它会告诉你它的IP。这些协议会在DNS解析之前工作,以告知有哪些服务可用。

Linux用得最多的mDNS实现是Avahi。你会经常看到/etc/nsswitch.conf把mdns作为解析器

Localhost

ifconfig的输出里还有个lo:

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1

lo接口是一个虚拟的网络接口,它叫作环回(loopback),因为它指向的是自己。连接127.0.0.1,其实就是连接本机。当发送数据到内核网络接口lo,内核只会将其重新包装,并通过lo回复。

传输层:TCP、UDP和Service

TCP端口与连接

TCP方式是指不同的网络应用使用不同的网络端口。端口只是一个数字。如果把IP比作大厦的地址,那么端口就是大厦里不同的邮箱号码,是一种更细的划分。

使用TCP时,应用会在本机的一个端口和远程机器的一个端口之间建立连接。

一个连接可以用“IP加端口”代码来标识。要想查看你机器上的连接,可用netstat。这里展示了一些TCP连接:选项-n表示不用对主机名进行DNS解析,而-t则是只输出TCP连接。

$ netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.23.2.4:47626 10.194.79.125:5222 ESTABLISHED
tcp 0 0 10.23.2.4:41475 172.19.52.144:6667 ESTABLISHED
tcp 0 0 10.23.2.4:57132 192.168.231.135:22 ESTABLISHED

Local Address和Foreign Address列位的内容是针对你的机器而言的

建立TCP连接

要建立传输层的连接,进程会发送一系列特别的数据包,先初始化一个从其本机端口到远端端口的连接。为了识别这个连接请求并进行答复,远端必须要有个进程监听着那个被请求的端口。通常请求方被称为客户端,监听方被称为服务器。

$ netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN

local address有0.0.0.0:80的那行,说明本机正监听着来自所有远端对自己80端口的连接。

端口的数字和/etc/services

/etc/services是一个纯文本文件,保存着一些常用端口及其服务的名字

ssh 22/tcp # SSH Remote Login Protocol
smtp 25/tcp
domain 53/udp

第一列是服务名称,第二列是端口及其特定的传输协议(可以不是TCP)。

TCP的特点

作为一种传输层协议,TCP之所以流行是因为它对应用没什么要求。应用的进程只需要知道如何打开(或监听)、读取、写入和关闭连接即可。对应用来说,这一过程就像收发数据流一样,而进程的工作就跟处理文件一样简单。

幕后的工作:

  1. TCP实现需要知道怎样将发出的数据流分装成数据包。
  2. 使用TCP的主机还要做错误检查:数据包在经由互联网传输的过程中可能会丢失或受损,TCP必须进行纠正

UDP

UDP比TCP简单得多。单条信息就可以构成一次传输,没有数据流的说法。跟TCP不同的是,UDP不纠正数据包的丢失或乱序。

若把TCP看成是打电话,那么UDP就像是寄信、发电报或发即时消息(当然即时消息稍微可靠些)。用UDP的应用,看重的是速度——尽快发出消息。它们不愿承担TCP的开销,因为它们已假设两台机之间的网络是可靠的。它们不需要TCP的纠错功能,因为它们有自己一套纠错系统,或他们根本不在乎出错。

理解DHCP

所谓“自动获取网络配置”,就是让主机使用动态主机配置协议(Dynamic Host Configuration Protocol,以下简称DHCP)来获取IP、子网掩码、默认网关和DNS服务器。

主机必须先能发信至其网络中的DHCP服务器,才能通过DHCP获取网络配置。因此每个物理网络必须有自己的DHCP服务器,而在普通的网络中,我们通常以路由器充当DHCP服务器。

Linux的DHCP客户端

尽管网络管理系统有很多种,但它们几乎全都使用互联网软件联盟(Internet Software Consortium,以下简称ISC)的dhclient程序来工作。你可以在命令行手动测试dhclient

dhclient eth0

开始后,dhclient会将它的进程ID放在/var/run/dhclient.pid中,而将租用信息放在/var/state/dhclient.leases中。

Linux的DHCP服务器

你可以在Linux机器上运行DHCP服务器,以妥善地管理IP地址。除非你管理着一个拥有多个子网的大型网络,否则你最好还是选择内置DHCP服务器的路由器。

将Linux配置成路由器

你可以把路由器看成是一种不止一个网络接口的计算机。

假设你有两个LAN子网10.23.2.0/24和192.168.45.0/24,你可以用一个有三个网络接口(两个用于LAN、一个用于连接互联网的上行线)的Linux路由器连通它们。

在这里插入图片描述
该路由器在两个LAN子网的IP分别为10.23.2.1和192.168.45.1。配置好IP后,它的路由表大概会如下所示:

Destination Gateway Genmask Flags Metric Ref Use Iface
10.23.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.45.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1

现在两个子网上的主机都可将该路由器作为默认网关了(10.23.2.0/24的是10.23.2.1,而192.168.45.0/24的是192.168.45.1)。如果10.23.2.4想发数据包给10.23.2.0/24以外的任何机器,它会将数据包传给10.23.2.1。

默认情况下,Linux内核不会自动地在子网之间进行包传递。为了使基本路由功能生效,你需要用以下命令激活路由器内核的IP转发:

sysctl -w net.ipv4.ip_forward

一旦你输入这个命令,而两个子网的主机又懂得将数据包发往该机器的话,那么该机器就能在两个子网间实现路由功能。要使它即使重启也能如旧

网络地址转换(IP伪装)

NAT是把单个IP分享给整个私有网络的常见方法,而且一般它在家庭和小型办公网络环境中都可用。Linux中,人们用得最多的NAT是IP伪装。

NAT背后的基本思想是,路由器做的不只是将数据包从一个子网传到另一个子网,而且还将数据包转化了。互联网上的主机只看到该路由器,而看不到其背后的私有网络。私有网络里的主机无需什么特别的配置,默认网关就使用该路由器。

  1. 私有网络里的一个主机想与外界通信,所以它会通过路由器发出连接请求的数据包。
  2. 路由器拦截了该请求,而不是传出去
  3. 路由器根据该数据包中关于目标的信息,开启其自身与该目标的连接。
  4. 连接成功后,路由器就伪造一个“连接已建立”的信息返回给内网主机。
  5. 现在路由器成了内网主机和远程主机之间的中介。远程主机并不知道该内网主机的存在,它只和路由器接头。

一般IP路由知道的就只有源和目标的IP地址。

路由器与Linux

有个制造商,Linksys,被要求开放其某个软件的源代码,开放之后,便出现了一个Linux发行版,叫z做OpenWRT。(WRT是Linksys的某个产品型号。)

防火墙

路由器尤其应该包含某种防火墙,来为你的网络抵御一些不速之客的请求。防火墙是一种软件和(或)硬件的配置,处于互联网和小型网络之间的路由器之中,以保证小型网络免于来自互联网的攻击。

为每台机器配备防火墙,这叫作IP过滤。系统可以在这些情况下过滤数据包:

  • 接收数据包时
  • 发送数据包时
  • 或将数据包转发给其他主机或网关时。

这些检查点会根据以下标准来丢弃、拒绝或者接受数据包:

  • 源或目标的IP或子网
  • 源或目标的端口(传输层的信息)
  • 防火墙的网络接口

Linux防火墙基础

Linux中,防火墙的规则是链型的。一个表就是一套链。数据包在Linux网络子系统的各部分移动时,内核就会对包应用某套规则。

这些数据结构由内核来维护。整个系统叫作iptables,可以使用用户空间的iptables命令来创建和修改规则。

因为规则表有很多,表里面的规则也很多,所以使得数据包的流动变得比较复杂。然而,你一般都只会接触到一个叫作filter(过滤)的表,它控制基本的包流动。该表里面有三个基本的链:对应包输入的INPUT、对应包输出的OUTPUT和对应包转发的FORWARD。

设置防火墙规则

先用以下命令查看当前的设置:

# iptables -L

通常输出的链设置是空的

Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

上例中的三个链的默认策略都是ACCEPT,即让内核允许数据包通过。DROP策略是放弃数据包。命令iptables -P可以设置链的策略:

如果你对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指的是,当数据包符合规则时,内核会将其丢弃。

192.168.34.63那家伙还发动了他子网上的所有人向你请求SMTP连接。想摆脱他们,执行以下命令:

iptables -A INPUT -s 192.168.34.0/24 -p tcp --destination-port 25 -j DROP

现在问题解决了,但后来你会发现,你地址为192.168.34.37的朋友不能给你发邮件了,因为你连他也屏蔽了。为了快速修复,你可能会执行以下命令:

但不管用。因为内核是按从顶到底的顺序来读取链配置的,并执行第一条匹配的配置。

解决方法是将该规则移到顶部。

防火墙策略

防火墙的基本应用场景有两种:一种是保护单台机器(在每台机器的INPUT链插入规则),另一种是保护整个网络里的机器(在路由器的FORWARD链插入规则)

如果你有一个SSH服务器在TCP端口22,那就不应该让别人连到你22以外的端口

首先可将INPUT链策略设置为DROP:

iptables -P INPUT DROP

但可通过以下命令,允许ICMP通信(给ping或其他工具使用):

iptables -A INPUT -p icmp -j ACCEPT

以太网、IP和ARP

网络软件包含了一套查找MAC地址的自动化系统,叫地址解析协议(Address Resolution Protocol,以下简称ARP)。使用以太网作为物理层、IP作为网络层的主机,维护着一个叫ARP缓存的表,其中包含了IP地址与MAC地址的映射关系。在Linux中,ARP缓存在内核中。想要查看你的机器的ARP缓存,可使用命令arp

$ arp -n
Address Hwtype Hwaddr Flags Mask Iface
10.1.2.141 ether 00:11:32:0d:ca:82 C eth0
10.1.2.1 ether 00:24:a5:b5:a0:11 C eth0
10.1.2.50 ether 00:0c:41:f6:1c:99 C eth0

-n指定不进行DNS反向查询

一台机器刚开机时,是没有ARP缓存的。那么MAC是怎样被缓存进来的呢?一切始于该机器想给另一台主机发送数据包时。如果目标IP不在ARP缓存中,则下列步骤会执行。

  1. 源主机创建一个包含ARP请求包的以太网帧,以求获知目标IP所对应的MAC。
  2. 源主机向目标子网的整个物理网络广播该帧。
  3. 如果子网中有个主机知道确切的MAC地址,它就会创建一个包含该地址的回复包和帧发给源主机。通常,发出回复的就是目标主机,它只是把自己的MAC地址回复给源主机。
  4. 源主机将IP-MAC地址对加入到ARP缓存中,并继续进行其他步骤。

无线以太网

无线以太网(即WiFi)与有线网络没有太大区别。跟任何有线设备一样,它们都有MAC地址,也使用以太网帧来收发数据,因此Linux能像处理有线网络接口那样处理无线网络接口。网际层及其以上的层次都是一样的,主要不同就在于物理层中多加了一些组件,如频段、网络ID、安全组件等等。

无线网络的配置是十分开放的,不像有线设备那样拥有很强的自适应性

  • 传输细节:这些细节都是物理特性,例如频率。
  • 网络标识:因为允许一套设备分出多个无线网络,所以必须要有办法区分它们。每个无线网络的标识就是它的服务集标识(Service Set Identifier,又称“网络名”,以下简称SSID)。
  • 管理:虽然可以做到让无线网中的主机直接交流,但大多数做法还是通过无线接入点来沟通。无线接入点通常桥接着有线网络,使得它与有线网处于同一个网络中。
  • 认证:你可能会想限制无线网的准入。想做到这点,你可以对接入点进行配置,以要求客户输入密码或其他认证码才能连上。
  • 加密:除了限制连接请求,一般我们还会对电波进行加密以保信息安全

iw

你可以通过一个叫iw的工具来查看和改变内核空间设备与网络的配置。要使用它,你得先知道设备的网络接口名,例如本例的wlan0。以下是扫描可用无线网络的例子。

iw dev wlan0 scan

无线网络安全

Linux主要依靠一个叫wpa_supplicant守护进程来管理无线网络接口的认证和加密,以保证无线网络安全。这个守护进程可以处理WPA(WiFi Protected Access,WiFi网络安全接入)和WPA2的认证机制,以及几乎所有的无线网络加密技术

首次启动时,它会读取配置文件(默认是/etc/wpa_supplicant.conf),然后尝试在所指定的网络中向接入点提供自己的信息,并与其建立连接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章