linux网络基础知识

本文主要整理一些和linux网络相关的零散功能,后续根据需要还会继续补充。

iptables

先看一张图:


iptables在内核的组成

两个通道:

  1. 由iptables客户端调用命令来配置管理防火墙,最后相关请求发送到内核模块;内核模块用于组织iptables使用的表、链和规则。
  2. iptables依赖netfilter来注册各种hooks实现对数据包的具体转发逻辑控制

netfilter的hook点包括:


数据包从左边进入IP协议栈,进行IP校验以后,数据包被第一个钩子函数PRE_ROUTING处理,然后就进入路由模块,由其决定该数据包是转发出去还是送给本机。若该数据包是送给本机的,则要经过钩子函数LOCAL_IN处理后传递给本机的上层协议;若该数据包应该被转发,则它将被钩子函数FORWARD处理,然后还要经钩子函数POST_ROUTING处理后才能传输到网络。本机进程产生的数据包要先经过钩子函数LOCAL_OUT处理后,再进行路由选择处理,然后经过钩子函数POST_ROUTING处理后再发送到网络。

原理:
iptables根据功能定义了4个表,raw,mangle,filter,nat。
这个四个表中有各自包含不同的链,如PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,这些链与Netfilter的HOOK点相对应,链中包含具体的规则从而控制数据包了.

关于不同表的说明如下:

每个注册的Hook函数一次调用各表链的规则来处理网络包:


从上图可以看出每个hook中处理的chain顺序依次为:mangle-->nat-->filter
特别地,对filter table而言,一个数据包,根据其源和目的地址,只能被其中的一个hook处理。
iptables命令格式:

举例:
增加一条rule:

iptables -A INPUT -p icmp -s 10.24.67.97 -j DROP//drop掉源为10.24.67.97的icmp报文

查看报文匹配:

watch -n 1 -d 'iptables -t filter -L INPUT -nv'

删除一条rule:

iptables -D INPUT -p icmp -s 10.24.67.97 -j DROP

NAT

可使用iptables nat表来实现NAT功能,包括SNAT和DNAT。
(1)SNAT:路由-->转换-->发出,转换步骤在POSTROUTING链上实现。
举例:

iptables -t nat -A POSTROUTING -s 192.168.252.0/24 -j SNAT -to-source 10.24.67.91

(2)DNAT:转换-->路由-->发出 或者 本机报文-->转换-->发出(这种很少用到),转换步骤在PREROUTING和OUTPUT链上实现。
举例:

iptables -t nat -A PREROUTING -d 10.24.67.91 -p tcp --dport 80 -j DNAT --to-destination 192.168.252.1
NAT hook实现点

ROUTE

route命令可以用来操作和显示IP路由表。
命令格式如下:

route [-CFvnee]

route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [rein-state] [[dev] If]

route [-v] [-A family] del [-net|-host] target [gw Gw] [netmask Nm] [metric N] [[dev] If]

例子:

● route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 #增加一条经过 eth0 到达 244.0.0.0 的路由
  ● route add -net 224.0.0.0 netmask 240.0.0.0 reject #增加一条屏蔽的路由,目的地址为224.x.x.x将被拒绝。
  ● route del -net 224.0.0.0 netmask 240.0.0.0
  ● route del -net 224.0.0.0 netmask 240.0.0.0 reject
  ● route del default gw 192.168.120.240
  ● route add default gw 192.168.120.240

network namespace

在三层网络上,Linux network namespace(netns)通过虚拟化网络协议栈,将一个物理三层网络分割成几个独立的虚拟三层网络。
Network namespace (netns)从 Linux 2.6.24 版本开始添加,直到 2.6.29 添加完成。每个 netns 拥有独立的 (virtual)network devices, IP addresses, IP routing tables, socket listing, connection tracking table, firewall, /proc/net directory, ports 等等。新创建的 netns 默认只包含 loopback device。除了这个设备,每个 network device,不管是物理的还是虚拟的网卡还是网桥等,都只能存在于一个 netns。而且,连接物理硬件的物理设备只能存在于 root netns。其它普通的网络设备可以被创建和添加到某个 netns。
举例:

#添加 network namespace
ip netnas add 
#Example:
ip netns add nstest

#列表所有 netns
ip netns list

#删除某 netns
ip netns delete 

#在 network namespace 中运行命令
ip netns exec  
#Example using the namespace from above:
ip netns exec nstest ip addr

#添加 virtual interfaces 到 network namespace
ip link add veth-a type veth peer name veth-b #创建一对虚拟网卡veth-a 和 veth-b,两者由一根虚拟网线连接
#将 veth-b 添加到 network namespace
ip link set veth-b netns nstest

#设置 VI 的 IP 地址
#defaut namespace 中
ip addr add 10.0.0.1/24 dev veth-a
ip link set dev veth-a up

# namespace nstest 中
ip netns exec nstest ip addr add 10.0.0.2/24 dev veth-b
ip netns exec nstest ip link set dev veth-b up
#互通
# ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.087 ms
  
# ip netns exec netns1 ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.054 ms
#查看路由表和 iptbales
# ip netns exec netns1 route
# ip netns exec netns1 iptables -L

免费ARP

免费ARP可被用于以下场景:

  • mac地址发生变化:通告自己的mac地址发生变化,以 ARP Response 的形式发送广播,它通常只是为了把自己的ARP信息通告/更新给局域网全体,这种Response不需要别人请求,是自己主动发送的通告:


  • 重复地址检测:重复 MAC 地址检测。以 ARP Request的形式发送广播,请求自己的MAC地址,目的是探测局域网中是否有跟自己IP地址相同的主机,也就是常说的IP冲突。发送主机并不需要一定收到此请求的回答。如果收到一个回答,表示网络中存在与自身IP相同的主机。如果没有收到应答,则表示本机所使用的IP与网络中其它主机并不冲突。


  • virtual IP:当提供虚拟IP的active server down掉时,通过某种机制重新选取一个active server,并由此server发送一个免费ARP,格式同"mac地址发生变化"一节,通知网络中的其他主机刷新arp表项。

路由策略

基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径
ip rule 命令:

Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除; llist 列表)
SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]
ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]

举例:
ip rule add from 192.203.80/24 table inr.ruhep prio 220 通过路由表 inr.ruhep 路由来自源地址为192.203.80/24的数据包 
ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由 

在linux系统启动时,内核会为路由策略数据库(RPDB)配置三条缺省的规则:

  • 0 匹配任何条件 查询路由表local(ID 255) 路由表local是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。rule 0非常特殊,不能被删除或者覆盖。
  • 32766 匹配任何条件 查询路由表main(ID 254) 路由表main(ID 254)是一个通常的表,包含所有的无策略路由。系统管理员可以删除或者使用另外的规则覆盖这条规则。
  • 32767 匹配任何条件 查询路由表default(ID 253) 路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。

不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失

路由表

路由表主要实现基于目的地址查找转发路径。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表根据其建立的方法,可以分为动态路由表和静态路由表。
linux 系统中,可以自定义从 1-252个路由表,其中,linux系统维护了4个路由表:

  • 0#表: 系统保留表

  • 253#表: defulte table 没特别指定的默认路由都放在改表

  • 254#表: main table 没指明路由表的所有路由放在该表

  • 255#表: locale table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改
    路由表的查看可有以下二种方法:

  • ip route list table table_number

  • ip route list table table_name

路由表序号和表名的对应关系在 /etc/iproute2/rt_tables 文件中,可手动编辑。
以下表为例:

Destination    Netmask    Gateway          Interface    Metric
0.0.0.0    0.0.0.0    192.168.123.254    192.168.123.88    1 #缺省路由,目的地址不在本路由表中的数据包,经过本机的 192.168.123.88 接口发到下一个路由器 192.168.123.254
127.0.0.0    255.0.0.0    127.0.0.1    127.0.0.1    1        #发给本机的网络包
192.168.123.0    255.255.255.0    192.168.123.68    192.168.123.68    1 #直连路由。目的地址为 192.168.123.0/24 的包发到本机 192.168.123.88 接口
192.168.123.88    255.255.255.255    127.0.0.1    127.0.0.1    1        #目的地址为 192.168.123.88的包是发给本机的包
192.168.123.255    255.255.255.255    192.168.123.88    192.168.123.88    1 #广播包的网段是 192.168.123.0/24,经过 192.168.123.88 接口发出去
224.0.0.0    224.0.0.0    192.168.123.88    192.168.123.88    1             #多播包,经过 192.168.123.88 接口发出去
255.255.255.255    255.255.255.255    192.168.123.68    192.168.123.68    1 #全网广播包
Default Gateway: 192.168.123.254

从上表中可看出根据子网掩码,可将路由分为三种类型:

  • 主机路由:指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。
  • 网段路由:代表主机可以到达的网络。网络路由的Flags字段为N。
  • 默认路由:当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G。

设置和查看路由表都可以用route命令,该命令格式如下:

route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
- add : 添加一条路由规则,del : 删除一条路由规则,-net : 目的地址是一个网络,-host : 目的地址是一个主机,target : 目的网络或主机
- netmask : 目的地址的网络掩码,gw : 路由数据包通过的网关,dev : 为路由指定的网络接口

还可以根据路由的生成方法划分如下:

  • 静态路由
    由用户或网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。当然,网管员也可以通过对路由器进行设置使之成为共享的。静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。
  • 动态路由
    动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整。它是与静态路由相对的一个概念,指路由器能够根据路由器之间的交换的特定路由信息自动地建立自己的路由表,并且能够根据链路和节点的变化适时地进行自动调整。当网络中节点或节点间的链路发生故障,或存在其它可用路由时,动态路由可以自行选择最佳的可用路由并继续转发报文。
    常见的动态路由协议有以下几个:路由信息协议(RIP)、OSPF(Open Shortest Path First开放式最短路径优先)、IS-IS(Intermediate System-to-Intermediate System,中间系统到中间系统)、边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。

参考资料:

http://www.cnblogs.com/sammyliu/p/4636091.html
http://linux.vbird.org/linux_server/0250simple_firewall.php#netfilter_syntax
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:Ch14:_Linux_Firewalls_Using_iptables#Managing_the_iptables_Server
http://www.embeddedlinux.org.cn/linux_net/0596002556/understandlni-CHP-28-SECT-3.html
http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html

你可能感兴趣的:(linux网络基础知识)