Q's blog

一些个人文档笔记

k8s network

学习必备资源

软件

Local PC:8G+
CentOS 7 :http://www.centos.org/ version>=7.4 Kernel>=4.4
Wireshark:https://www.wireshark.org/
Xshell:https://www.netsarang.com/en/xshell/
Notepad++:https://notepad-plus-plus.org/
VMWare:https://my.vmware.com/en/web/vmware/downloads
VirtualBox:https://www.virtualbox.org/
Docker-CE:https://docs.docker.com/install/linux/docker-ce/centos/
Docker-CE:https://yq.aliyun.com/articles/110806
Kubernetes:V1.16.0
Mirrors:https://opsx.alibaba.com/mirror
Note:https://www.yinxiang.com/download/
eNSP:https://pan.baidu.com/s/1n2nZbeMDP49CE6ZDRxZHcA Extraction code:k8sn

文档

RFC Docs:https://ietf.org/standards/rfcs/
HTTP2:https://http2.github.io/
Kubernetes Docs:

https://github.com/kubernetes/Kubernetes
https://kubernetes.io/docs/concepts/
https://kubernetes.io/docs/tasks/
https://kubernetes.io/docs/reference/
https://kubernetes.io/docs/tutorials/

Flannel Docs:

https://github.com/coreos/flannel
https://coreos.com/flannel/docs/latest/

Calico Docs:

https://www.projectcalico.org/
https://github.com/projectcalico/calico

Cilium Docs:

https://cilium.io/
https://github.com/cilium/cilium

DANM Docs:

https://www.gitmemory.com/nokia/danm
https://github.com/nokia/danm

Nuage Docs:

https://www.nuagenetworks.net/
https://github.com/nuagenetworks

Multus Docs:

https://01.org/kubernetes/building-blocks/multus-cni
https://github.com/intel/multus-cni

Genie Docs:

https://asciinema.org/a/118191
https://github.com/cni-genie/CNI-Genie

IP:https://tools.ietf.org/html/rfc791
RIP:https://tools.ietf.org/html/rfc2453
OSPF:https://tools.ietf.org/html/rfc2328
BGP:https://tools.ietf.org/html/rfc1105
3GPP:https://www.3gpp.org/

本事实验环境:

软件 版本
virtualBox 5.2.30
wireshark 2.6.20
eNsp V100R003C00SPC100

CentOS安装rpcapd服务(WinPcap)

安装命令如下:

1
2
3
4
5
6
7
8
9
10
11
yum install byacc glibc-static libgcrypt-devel gcc flex
wget http://www.winpcap.org/install/bin/WpcapSrc_4_1_2.zip
unzip WpcapSrc_4_1_2.zip
cd winpcap/wpcap/libpcap
chmod +x configure runlex.sh
CFLAGS=-static ./configure
make
cd rpcapd
make

./rpcapd -p 2002 -b 172.12.1.201 -n

华为交换机命令

查看设备的mac table

1
2
3
4
5
6
7
8
9
10
11
[Huawei]dis mac-address
MAC address table of slot 0:
-------------------------------------------------------------------------------
MAC Address VLAN/ PEVLAN CEVLAN Port Type LSP/LSR-ID
VSI/SI MAC-Tunnel
-------------------------------------------------------------------------------
5489-9836-6440 1 - - GE0/0/3 dynamic 0/-
5489-983f-5752 1 - - GE0/0/2 dynamic 0/-
5489-98df-112c 1 - - GE0/0/1 dynamic 0/-
-------------------------------------------------------------------------------
Total matching items on slot 0 displayed = 3

手工清除mac-address

1
undo mac-address

配置查看ip

1
2
3
4
sys
int <接口>
ip address 172.30.0.1 255.255.192.0
dis ip

查看arp

1
dis arp

查看配置

1
dis cu

IP & MAC

Network-MAC Address

MAC(Media Access Control)地址用来定义网络设备的位置。MAC地址由48比特长、12位的16进制数字组成,其中从左到右开始,0到23bit是厂商向IETF等机构申请用来标识厂商的代码(OUI),24到47bit由厂商自行分派,是各个厂商制造的所有网卡的一个唯一编号。
MAC地址可以分为3种类型:

  • 物理MAC地址:这种类型的MAC地址唯一的标识了以太网上的一个终端,该地址为全球唯一的硬件地址。
  • 广播MAC地址:全1的MAC地址(FF-FF-FF-FF-FF-FF),用来表示LAN上的所有终端设备。
  • 组播MAC地址:除广播地址外,第8bit为1的MAC地址为组播MAC地址(例如01-00-00-00-00-00),用来代表LAN上的一组终端。

静态MAC地址(Static MAC)

由用户通过命令配置的静态转发的MAC地址,静态MAC地址和动态MAC地址的功能不同 ,静态地址一旦被加入,该地址在删除之前将一直有效,不受最大老化时间的限制。

动态MAC地址(Dynamic MAC)

由交换机从接受到报文自动学习到的MAC地址,当端口收到一个报文时,会查找报文的源MAC地址是否存 在于MAC地址表中,如果不存在则会将相应的端口、VLAN和源MAC地址关联起来,并保存到MAC地址表中, 动态MAC地址在达到一定老化时间后会被老化删除,但如果该地址在老化时间内被正确使用过,则会重新 激活该条地址的老化时间,同时MAC地址和端口的对应关系会随着设备所连的交换机的端口的变化而变化。

过滤MAC地址、黑洞MAC地址

由用户通过命令配置的静态过滤的MAC地址,当网关接收到的报文中,源或者目的MAC 地址为过滤MAC地址,则直接丢弃该报文。

Network-MAC Address Table

设备学习MAC地址的方法如下:如果从某接口(假设为接口A)收到一个数据帧,设备就会分析该数据帧的源MAC地址(假设为MAC-SOURCE)并认为目的MAC地址为MAC-SOURCE的报文可以由接口A转发;如果MAC地址表中已经包含MAC-SOURCE,设备将对该表项进行更新;

如果MAC地址表中尚未包含MAC-SOURCE,设备则将这个新MAC地址以及该MAC地址对应的接口A作为一个新的表项加入到MAC地址表中。

Note:用户手工配置的静态MAC地址表项和黑洞MAC地址表项不会被动态MAC地址表项覆盖,而动态MAC地址表项可以被静态MAC地址表项和黑洞MAC地址表项覆盖。

设备在转发报文时,根据MAC地址表项信息,会采取以下两种转发方式:

  • 单播方式:当MAC地址表中包含与报文目的MAC地址对应的表项时,直接将报文从该表项中的转发出接口发送。
  • 广播方式:当设备收到目的地址为全1的报文,或MAC地址表中没有包含对应报文目的MAC地址的表项时,设备

将采取广播方式将报文向除接收接口外的所有接口进行转发。

Network-MAC Address Table Expiring

MAC地址老化过程:

为适应网络的变化,MAC表需要不断更新。MAC表中自动生成的表项(即动态表项)并非永远有效,每一条表项都有一个生存周期,到达生存周期仍得不到更新的表项将被删除,这个生存周期被称作老化时间。如果在到达生存周期前记录被更新,则该表项的老化时间重新计算。

image-20201119112855506

设备MAC地址老化时间设置为T。在t1时刻有源MAC地址为00e0-fc00-0001、VLAN为1的报文从某接口进入。假定该接口已加入VLAN 1。

如果之前MAC地址表不存在关于(MAC: 00e0-fc00-0001,VLAN: 1)的任何种类表项,那么这个地址就会作为动态MAC地址表项学习到地址表里,同时该表项的命中标志位被置1。

设备周期性(每经过T时间)地对所有学习到的动态MAC地址表项进行检查。

  • 在t2时刻,检查到动态表项(MAC: 00e0-fc00-0001,VLAN: 1)的命中标志位为1,则将该表项的命中标志位置为0,但不删除这条表项。
  • 在t2时刻和t3时刻之间没有这种报文进入设备,那么该表项的命中标志位会一直保持为0。
  • 在t3时刻,设备检查到该表项的命中标志位为0,认为该表项的老化时间到达,将删除此条表项。

Network-IP Address

IP地址是在计算机网络中被用来唯一标识一台设备的一组数字。

IPv4地址由32位二进制数值组成,但为了便于用户识别和记忆,采用了“点分十进制表示法”。

采用了这种表示法的IPv4地址由4个点分十进制整数来表示,每个十进制整数对应一个字节。

IPv4地址由如下两部分组成:

  • 网络号码字段(Net-id):用来标识一个网络。
  • 主机号码字段(Host-id):用来区分一个网络内的不同主机。对于网络号相同的设备,无论实际所处的物理位置如何,它们都是处在同一个网络中。

IPv4地址分类:

image-20201119113042601

Network-IP Packet Format

image-20201119114407628

image-20201119114820275
字段 长度 含义
版本 4比特 IP协议的版本号,分为IPv4和IPv6协议。
首部长度 4比特 IPv4的首部长度。
区分服务 8比特 用来获得更好的服务。只有在使用区分服务时,这个字段才起作用。
总长度 16比特 指首部和数据之和的长度。
标识 16比特 IPv4软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。
标志 3比特 目前只有两位有意义。最低位为1表示后面“还有分片”的数据报,为0表示这已经是最后一个数据片;中间一位为1表示“不能分片”,为0才允许分片。
片位移 13比特 指出较长的分组在分片后,该片在原分组中的相对位置。
TTL 8比特 表示数据报在网络中的寿命,功能是“跳数限制”。
协议 8比特 指出此数据报携带的数据是使用何种协议。
首部佥3验和 16比特 数据报每经过一个设备,设备都要重新计算一下首部检验和,若首部未发生变化,则此结果必为0,于是就保留这个数据报。这个字段只检3佥数据报的首部,但不包括数据部分。
源地址 32比特 报文发送方的IPv4地址。
目的地址 32比特 报文接收方的IPv4地址。
选项字段 0~40字节 用来支持排错、测量以及安全等措施。在必要的时候插入值为0的填充字节。
数据部分 可变 用来填充报文。

Network - VLSM

VLSM(可变长子网掩码) 是为了有效的使用无类别域间路由(CIDR)和路由汇聚(route summary)来控制路由表的大小,

它是网络管理员常用的IP寻址技术,VLSM就是其中的常用方式,可以对子网进行层次化编址,以便最有效的利用现有的地址空间。

image-20201119114850538

网络模型

image-20201123190923769

IPVLAN

L2

ipvlan L2 模式和 macvlan bridge 模式工作原理很相似,父接口作为交换机来转发子接口的数据。

同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

image-20201123191225930

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ip netns add net1
ip netns add net2
ip link add ipvlan1 link eth0 type ipvlan mode l2
ip link add ipvlan2 link eth0 type ipvlan mode l2
ip link set ipvlan1 netns net1
ip link set ipvlan2 netns net2
ip netns exec net1 ifconfig ipvlan1 172.12.1.5/24 up
ip netns exec net2 ifconfig ipvlan2 172.12.1.6/24 up
##访问外网添加路由
ip netns exec net1 route add -net 0.0.0.0/0 gw 172.12.1.2
ip netns exec net2 route add -net 0.0.0.0/0 gw 172.12.1.2
$ ip netns exec net2 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.12.1.2 0.0.0.0 UG 0 0 0 ipvlan2
172.12.1.0 0.0.0.0 255.255.255.0 U 0 0 0 ipvlan2

L3

ipvlan 有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。

只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相 ping 通对方,因为 ipvlan 会在中间做报文的转发工作。

image-20201123191347831

1
2
3
4
5
6
7
8
9
10
11
ip netns add net1
ip netns add net2
ip link add ipvlan1 link eth0 type ipvlan mode l3
ip link add ipvlan2 link eth0 type ipvlan mode l3
ip link set ipvlan1 netns net1
ip link set ipvlan2 netns net2
ip netns exec net1 ifconfig ipvlan1 172.12.10.5/24 up
ip netns exec net2 ifconfig ipvlan2 172.12.20.6/24 up
##添加路由
ip netns exec net1 route add -net 172.12.20.0/24 dev ipvlan1
ip netns exec net2 route add -net 172.12.10.0/24 dev ipvlan2

无法自己学习路由

MACVLAN

Macvlan用简单的网桥连接父接口上的所有子接口。

从一个接口到另一个接口的帧将直接发送,而不发送出去。

广播帧被泛洪到所有其他网桥端口和外部接口,但是当它们从VEP交换机返回时,将被丢弃。

由于所有macvlan子接口MAC地址都是已知的,因此macvlan桥接模式不需要MAC学习,也不需要STP。

桥接模式可在虚拟机之间提供最快的通信,但有一个“缺陷”,您应该注意–如果父接口状态下降,所有macvlan子接口也会下降。 当物理接口断开连接时,VM将无法相互通信。

image-20201124222533450

1
2
3
4
5
6
7
8
9
ifconfig eth0 promisc #开启混杂模式
ip netns add net1
ip netns add net2
ip link add link eth0 name macv1 type macvlan mode bridge
ip link add link eth0 name macv2 type macvlan mode bridge
ip link set macv1 netns net1
ip link set macv2 netns net2
ip netns exec net1 ifconfig macv1 172.12.1.5/24 up
ip netns exec net2 ifconfig macv2 172.12.1.6/24 up

Linux网络

微信文章

网络命名空间

我们知道容器运行时使用 namespace(命名空间)内核功能对系统资源进行分区,以实现某种形式的进程隔离,这样,对一个命名空间中资源的更改不会影响其他命名空间中的资源,包括进程 ID、主机名、用户 ID、文件名和网络接口等。

网络名称空间可以虚拟化网络堆栈,每个网络名称空间都有自己的资源,例如网络接口、IP 地址、路由表、隧道、防火墙等,例如,iptables添加到网络名称空间的规则只会影响进入和离开该名称空间的流量。

VETH PEER

image-20201125160513357

veth 接口通常被创建为一个对,其中一端传输的数据会立即被另一端接收,这种类型的接口在容器运行时通常用于在不同网络命名空间之间传输数据包。

配置第一个网络命名空间

首先我们使用 ip link add 命令创建一对新的 veth 接口:veth0 和 veth1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建一对名为 veth0 和 veth1 的 veth 接口。
$ ip link add veth0 type veth peer name veth1

# 确认 veth0 已创建
$ ip link show veth0
289: veth0@veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 5e:87:df:87:af:c7 brd ff:ff:ff:ff:ff:ff

# 确认 veth1 已创建
$ ip link show veth1
288: veth1@veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether be:0d:a4:8c:9f:2a brd ff:ff:ff:ff:ff:ff

$ip netns exec ns1 ethtool -S veth0
NIC statistics:
peer_ifindex: 4 #对端id
rx_queue_0_xdp_packets: 0
rx_queue_0_xdp_bytes: 0
rx_queue_0_drops: 0
rx_queue_0_xdp_redirect: 0
rx_queue_0_xdp_drops: 0
rx_queue_0_xdp_tx: 0
rx_queue_0_xdp_tx_errors: 0
tx_queue_0_xdp_xmit: 0
tx_queue_0_xdp_xmit_errors: 0
$ ip a
...
4: veth1@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 8a:5c:72:4b:c4:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 0

veth 接口通常被创建为一个对,其中一端传输的数据会立即被另一端接收,这种类型的接口在容器运行时通常用于在不同网络命名空间之间传输数据包。

让我们创建第一个网络命名空间 ns1,然后我们可以将 veth0 接口分配给这个网络命名空间,并将 10.0.1.0/24 的 IP 地址范围分配给它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建 ns1 网络命名空间
$ ip netns add ns1

# 分配 veth0 接口到 ns1 网络命名空间
$ ip link set veth0 netns ns1

# 将 10.0.1.0/24 IP 地址范围分配给 veth0 接口
$ ip -n ns1 addr add 10.0.1.0/24 dev veth0

# 将 veth0 接口 up 起来
$ ip -n ns1 link set veth0 up

# 将 lo 接口 up 起来,因为发往 10.0.1.0/24 的数据(本地的)
# (像 ping)要通过 local(本地)路由表
# 比如要 ping 自己
$ ip -n ns1 link set lo up

# 确认接口已经 up 起来
$ ip -n ns1 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
289: veth0@if288: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether 5e:87:df:87:af:c7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.0/24 scope global veth0
valid_lft forever preferred_lft forever

现在如果我们从主机和 ns1 两个网络命名空间中去 ping veth0 接口会发生什么呢?

1
2
3
4
5
6
7
8
9
10
# veth0 不在主机的根网络命名空间中
$ ip link show veth0
Device "veth0" does not exist.

# 从主机网络命名空间中 ping 不通
$ ping -c10 10.0.1.0
PING 10.0.1.0 (10.0.1.0) 56(84) bytes of data.
^C
--- 10.0.1.0 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

我们可以看到直接在主机的根网络命名空间中是找不到 veth0 这个接口的,当然也是 ping 不同 10.0.1.0 这个地址的,因为他们被绑定到 ns1 这个网络命名空间中,所以我们在操作的时候需要切换到这个命名空间下面。

1
2
3
4
5
6
7
8
9
10
$ ip netns exec ns1 ping -c10 10.0.1.0
PING 10.0.1.0 (10.0.1.0) 56(84) bytes of data.
64 bytes from 10.0.1.0: icmp_seq=1 ttl=64 time=0.121 ms
64 bytes from 10.0.1.0: icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from 10.0.1.0: icmp_seq=3 ttl=64 time=0.066 ms
64 bytes from 10.0.1.0: icmp_seq=4 ttl=64 time=0.109 ms
^C
--- 10.0.1.0 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.063/0.089/0.121/0.028 ms

这里我们使用了一条 ip netns exec 的命令,这个命令允许我们在指定的网络命名空间中去执行任意的命令,可以看到现在我们在 ns1 网络命名空中间去 ping 10.0.1.0 就可以通了。

配置第二个网络命名空间

下面我们用上面的方式来创建第二个网络命名空间 ns2,然后将 veth1 接口分配给这个网络命名空间,并将 10.0.2.0/24 的 IP 地址范围分配给这个接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建名为 ns2 的网络命名空间
$ ip netns add ns2

# 分配 veth1 接口到 ns2 网络命名空间
$ ip link set veth1 netns ns2

# 将 10.0.2.0/24 IP 地址范围分配给 veth1 接口
$ ip -n ns2 addr add 10.0.2.0/24 dev veth1

# 将 veth1 接口 up 起来
$ ip -n ns2 link set veth1 up

# 将 lo 口 up 起来(这样可以 ping 通自己)
$ ip -n ns2 link set lo up

$ ip -n ns2 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
288: veth1@if289: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether be:0d:a4:8c:9f:2a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.2.0/24 scope global veth1
valid_lft forever preferred_lft forever
inet6 fe80::bc0d:a4ff:fe8c:9f2a/64 scope link
valid_lft forever preferred_lft forever

为方便后面设置路由,这里我们为 veth1 接口分配一个不同的子网 IP 范围。和 veth0 接口类似,veth1 接口也不能从主机网络命名空间到达,只能在 ns2 本身的网络命名空间内工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ip link show veth1
Device "veth1" does not exist.
$ ping -c10 10.0.2.0
PING 10.0.2.0 (10.0.2.0) 56(84) bytes of data.
From 180.149.159.13 icmp_seq=2 Packet filtered
^C
--- 10.0.2.0 ping statistics ---
2 packets transmitted, 0 received, +1 errors, 100% packet loss, time 999
$ ip netns exec ns2 ping -c10 10.0.2.0
PING 10.0.2.0 (10.0.2.0) 56(84) bytes of data.
64 bytes from 10.0.2.0: icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from 10.0.2.0: icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from 10.0.2.0: icmp_seq=3 ttl=64 time=0.068 ms
^C
--- 10.0.2.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.068/0.088/0.100/0.014 ms

配置子网路由

虽然在上面的两个网络空间内可以各自访问自己,但是他们互相之间是不能 ping 通的。

1
2
3
4
$ ip netns exec ns1 ping -c10 10.0.2.0
connect: Network is unreachable
$ ip netns exec ns2 ping -c10 10.0.1.0
connect: Network is unreachable

veth0 和 veth1 这两个接口本身也都 up 起来了,而且在各种的网络命名空间中 ping 也能正常工作,所以互相直接不通那很可能和路由有关。下面我们使用 ip 命令来调试下,我们可以通过 ip route get 命令来确定一个数据包所走的路由。

1
2
3
4
$ ip -n ns1 route get 10.0.2.0
RTNETLINK answers: Network is unreachable
$ ip -n ns2 route get 10.0.1.0
RTNETLINK answers: Network is unreachable

我们可以看到都是网络不可达,我们来检查下两个网络命名空间中的路由表信息。

1
2
3
4
$ ip -n ns1 route
10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.0
$ ip -n ns2 route
10.0.2.0/24 dev veth1 proto kernel scope link src 10.0.2.0

看到路由表是不是很清晰了,两个网络命名空间的路由表都只有各自 IP 范围的路由条目,并没有通往其他子网的路由,所以当然不能互通了,要解决也很简单,可以使用 ip route add 命令在路由表中插入新的路由条目是不是就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 更新 veth0 路由表,添加一条通往 10.0.2.0/24 的路由
$ ip -n ns1 route add 10.0.2.0/24 dev veth0

# 确认发往 10.0.2.0/24 的数据包被路由到 veth0
$ ip -n ns1 route get 10.0.2.0
10.0.2.0 dev veth0 src 10.0.1.0
cache

# 同样更新 veth1 路由表,添加一条通往 10.0.1.0/24 的路由
$ ip -n ns2 route add 10.0.1.0/24 dev veth1

# 确认发往 10.0.1.0/24 的数据包被路由到 veth1
$ ip -n ns2 route get 10.0.1.0
10.0.1.0 dev veth1 src 10.0.2.0
cache

上面我们在各自的网络命名空间中添加了对方的路由信息,现在我们来尝试 ping 下对方的 veth 接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ip netns exec ns1 ping -c10 10.0.2.0
PING 10.0.2.0 (10.0.2.0) 56(84) bytes of data.
64 bytes from 10.0.2.0: icmp_seq=1 ttl=64 time=0.140 ms
64 bytes from 10.0.2.0: icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from 10.0.2.0: icmp_seq=3 ttl=64 time=0.091 ms
^C
--- 10.0.2.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.080/0.103/0.140/0.028 ms

$ ip netns exec ns2 ping -c10 10.0.1.0
PING 10.0.1.0 (10.0.1.0) 56(84) bytes of data.
64 bytes from 10.0.1.0: icmp_seq=1 ttl=64 time=0.114 ms
64 bytes from 10.0.1.0: icmp_seq=2 ttl=64 time=0.084 ms
64 bytes from 10.0.1.0: icmp_seq=3 ttl=64 time=0.086 ms
^C
--- 10.0.1.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.084/0.094/0.114/0.017 ms

可以看到已经通啦!!🎉🎉🎉 此外我们还可以使用 tcpdump 来捕获两个网络命名空间之间传输的数据包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ ip netns exec ns1 tcpdump -i veth0 icmp -l
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:29:22.080392 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 1, length 64
11:29:22.080464 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 1, length 64
11:29:23.080409 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 2, length 64
11:29:23.080472 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 2, length 64
11:29:24.080357 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 3, length 64
11:29:24.080418 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 3, length 64
11:29:25.080346 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 4, length 64
11:29:25.080401 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 4, length 64
11:29:26.080417 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 5, length 64
11:29:26.080496 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 5, length 64
11:29:27.080454 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 6, length 64
11:29:27.080507 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 6, length 64
11:29:28.080398 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 7, length 64
11:29:28.080456 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 7, length 64
11:29:29.080390 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 8, length 64
11:29:29.080431 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 8, length 64
11:29:30.080524 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 9, length 64
11:29:30.080576 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 9, length 64
11:29:31.081895 IP 10.0.2.0 > 10.0.1.0: ICMP echo request, id 7253, seq 10, length 64
11:29:31.081942 IP 10.0.1.0 > 10.0.2.0: ICMP echo reply, id 7253, seq 10, length 64
^C
20 packets captured
20 packets received by filter
0 packets dropped by kernel

TCP 连接

最好我们来测试下 TCP 连接,使用 nc 命令在 ns1 命名空间的 7096 端口启动一个 TCP 服务器,然后从 ns2 网络命名空间发起一个 TCP 握手连接。

1
2
$ ip netns exec ns1 nc -l 10.0.1.0 7096 -v
exec of "nc" failed: No such file or directory

上面命令报错是因为我们还没有安装 ns 这个工具,安装完成后就正常了。

1
2
3
4
5
$ yum install -y nc

$ ip netns exec ns1 nc -l 10.0.1.0 7096 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 10.0.1.0:7096

然后重新开一个终端进行连接:

1
2
3
4
5
6
7
8
9
10
11
# 使用 nc 从 ns2 发起 TCP 握手
$ ip netns exec ns2 nc -4t 10.0.1.0 7096 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.1.0:7096.

# 这个时候正常会在前面的服务中看到连接状态
$ ip netns exec ns1 nc -l 10.0.1.0 7096 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 10.0.1.0:7096
Ncat: Connection from 10.0.2.0.
Ncat: Connection from 10.0.2.0:34090.

一旦 TCP 连接建立,我们就可以从 ns2 向 ns1 发送测试消息了。

1
2
3
4
$ ip netns exec ns2 nc -4t 10.0.1.0 7096 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.1.0:7096.
this is a test message # 在这里输入一段信息

此时我们在 ns1 这边的服务器端也会收到发送的消息。

1
2
3
4
5
6
$ ip netns exec ns1 nc -l 10.0.1.0 7096 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 10.0.1.0:7096
Ncat: Connection from 10.0.2.0.
Ncat: Connection from 10.0.2.0:34090.
this is a test message

同样我们也可以使用 tcpdump 来抓取所有在两个网络命名空间之间传输的数据包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ip netns exec ns1 tcpdump -X -i veth0 -n tcp -l
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:42:59.912176 IP 10.0.2.0.34090 > 10.0.1.0.7096: Flags [P.], seq 118819706:118819735, ack 1587208228, win 229, options [nop,nop,TS val 1970393377 ecr 1970365937], length 29
0x0000: 4500 0051 ad52 4000 4006 7655 0a00 0200 E..Q.R@.@.vU....
0x0010: 0a00 0100 852a 1bb8 0715 0b7a 5e9a e024 .....*.....z^..$
0x0020: 8018 00e5 1743 0000 0101 080a 7571 d121 .....C......uq.!
0x0030: 7571 65f1 7468 6973 2069 7320 616e 6f74 uqe.this.is.anot
0x0040: 6865 7220 7465 7374 206d 6573 7361 6765 her.test.message
0x0050: 0a .
11:42:59.912207 IP 10.0.1.0.7096 > 10.0.2.0.34090: Flags [.], ack 29, win 227, options [nop,nop,TS val 1970393377 ecr 1970393377], length 0
0x0000: 4500 0034 4612 4000 4006 ddb2 0a00 0100 E..4F.@.@.......
0x0010: 0a00 0200 1bb8 852a 5e9a e024 0715 0b97 .......*^..$....
0x0020: 8010 00e3 1726 0000 0101 080a 7571 d121 .....&......uq.!
0x0030: 7571 d121 uq.!

当然也可以将这个抓包结果保存下来然后用其他工具比如大白鲨来进行详细的分析。

Linux Bridge

yum install bridge-utils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#创建命名空间
ip netns add ns1
ip netns add ns2
#首先创建 bridge br0
ip l a br0 type bridge
ip l s br0 up
#然后创建两对 veth-pair
ip l a veth0 type veth peer name br-veth0
ip l a veth1 type veth peer name br-veth1
#分别将两对 veth-pair 加入两个 ns 和 br0
ip l s veth0 netns ns1
ip l s br-veth0 master br0
ip l s br-veth0 up
ip l s veth1 netns ns2
ip l s br-veth1 master br0
ip l s br-veth1 up
#开启本地回环
ip netns exec ns1 ip l s lo up
ip netns exec ns2 ip l s lo up
#给两个 ns 中的 veth 配置 IP 并启用
ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0
ip netns exec ns1 ip l s veth0 up
ip netns exec ns2 ip a a 10.1.1.3/24 dev veth1
ip netns exec ns2 ip l s veth1 up

OVS

Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,由Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被设计位支持跨越多个物理服务器的分布式环境,类似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多种linux 虚拟化技术,包括Xen/XenServer, KVM和irtualBox。当前最新代码包主要包括以下模块和特性:

安装OVS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
setenforce 0
yum -y install make gcc openssl-devel autoconf automake rpm-build redhat-rpm-config
yum -y install python-devel openssl-devel kernel-devel kernel-debug-devel libtool wget
wget http://openvswitch.org/releases/openvswitch-2.5.2.tar.gz   //需要Retry//
mkdir -p ~/rpmbuild/SOURCES
cp openvswitch-2.5.2.tar.gz ~/rpmbuild/SOURCES/
cd ~/rpmbuild/SOURCES
tar xvfz openvswitch-2.5.2.tar.gz
sed 's/openvswitch-kmod, //g' openvswitch-2.5.2/rhel/openvswitch.spec > openvswitch-2.5.2/rhel/openvswitch_no_kmod.spec
## 修改bug文件
vim /usr/include/linux/netfilter/nf_conntrack_sctp.h
__be32 vtag[IP_CT_DIR_MAX];
uint8_t last_dir;
uint8_t flags;


rpmbuild -bb --nocheck openvswitch-2.5.2/rhel/openvswitch_no_kmod.spec
yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.5.2-1.x86_64.rpm
systemctl restart  openvswitch

实现

image-20201126094227071

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#用 ovs 提供的命令创建一个 ovs bridge
ovs-vsctl add-br ovs-br
ovs-vsctl show
2349b536-c235-4e10-8c81-804bded82184
Bridge pvs-br
Port pvs-br
Interface ovs-br
type: internal
ovs_version: "2.5.2"
#创建两对 veth-pair
ip l a veth0 type veth peer name ovs-veth0
ip l a veth1 type veth peer name ovs-veth1
#将 veth-pair 两端分别加入到 ns 和 ovs bridge 中
ip l s veth0 netns ns1
ovs-vsctl add-port ovs-br ovs-veth0
ip l s ovs-veth0 up
ip l s veth1 netns ns2
ovs-vsctl add-port ovs-br ovs-veth1
ip l s ovs-veth1 up
#给 ns 中的 veth 配置 IP 并启用
ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0
ip netns exec ns1 ip l s veth0 up
ip netns exec ns2 ip a a 10.1.1.3/24 dev veth1
ip netns exec ns2 ip l s veth1 up

OpenStack计算节点拓扑

Linux IP FORWARD

/proc/sys/net/ipv4/ip_forward = 1

image-20201126143149738

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#创建两个 namespace:
ip netns add ns1
ip netns add ns2
#创建两对 veth-pair,一端分别挂在两个 namespace 中:
ip link add v1 type veth peer name v1_r
ip link add v2 type veth peer name v2_r
ip link set v1 netns ns1
ip link set v2 netns ns2
#分别给两对 veth-pair 端点配上 IP 并启用:
ip a a 10.1.1.1/24 dev v1_r
ip l s v1_r up
ip a a 10.1.2.1/24 dev v2_r
ip l s v2_r up
ip netns exec ns1 ip a a 10.1.1.2/24 dev v1
ip netns exec ns1 ip l s v1 up
ip netns exec ns2 ip a a 10.1.2.2/24 dev v2
ip netns exec ns2 ip l s v2 up
#添加路由:
ip netns exec ns1 route add -net 10.1.2.0 netmask 255.255.255.0 gw 10.1.1.1
ip netns exec ns2 route add -net 10.1.1.0 netmask 255.255.255.0 gw 10.1.2.1
#修改内核转发:
echo 1 > /proc/sys/net/ipv4/ip_forward

Docker Network[Routing table]

image-20201126160825399

实现

1
2
3
4
5
6
node-2 $ docker network create net_18 --subnet=172.18.0.0/16
node-1 $ docker run -d --name nginx nginx
node-2 $ docker run -d --name nginx --network=net_18 nginx
node-1 $ route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.12.1.11
node-2 $ route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.12.1.10
# 互ping能通

IPIP Mode

image-20201126160834808

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 创建ns
ip netns add ns1
ip netns add ns2
# 添加虚拟网卡对
ip link add v1 type veth peer name v1_r
ip link add v2 type veth peer name v2_r
ip link set v1 netns ns1
ip link set v2 netns ns2
# 添加地址
ip a a 10.10.10.1/24 dev v1_r
ip l s v1_r up
ip a a 10.10.20.1/24 dev v2_r
ip l s v2_r up
ip netns exec ns1 ip a a 10.10.10.2/24 dev v1
ip netns exec ns1 ip l s v1 up
ip netns exec ns2 ip a a 10.10.20.2/24 dev v2
ip netns exec ns2 ip l s v2 up
# 添加路由
ip netns exec ns1 route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.10.1
ip netns exec ns2 route add -net 10.10.10.0 netmask 255.255.255.0 gw 10.10.20.1
# 添加ip转发
echo 1 > /proc/sys/net/ipv4/ip_forward
Kubernetes Network IPIP Mode
# 在 ns1 上创建 tun1 和 IPIP tunnel
ip netns exec ns1 ip tunnel add tun1 mode ipip remote 10.10.20.2 local 10.10.10.2
ip netns exec ns1 ip l s tun1 up
ip netns exec ns1 ip a a 10.10.100.10 peer 10.10.200.10 dev tun1
# 在 ns2 上创建 tun1 和 IPIP tunnel
ip netns exec ns2 ip tunnel add tun2 mode ipip remote 10.10.10.2 local 10.10.20.2
ip netns exec ns2 ip l s tun2 up
ip netns exec ns2 ip a a 10.10.200.10 peer 10.10.100.10 dev tun2
# 上面的命令是在 NS1 上创建 tun 设备 tun1,并设置隧道模式为 ipip,然后还需要设置道端点,用 remote 和 local表示,这是 隧道外层 IP,对应的还有 隧道内层 IP,用 ip addr xx peer xx 配置。
ip netns exec ns1 ping 10.10.200.10 -c 4
PING 10.10.200.10 (10.10.200.10) 56(84) bytes of data.
64 bytes from 10.10.200.10: icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from 10.10.200.10: icmp_seq=2 ttl=64 time=0.148 ms
64 bytes from 10.10.200.10: icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from 10.10.200.10: icmp_seq=4 ttl=64 time=0.110 ms
--- 10.10.200.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.090/0.115/0.148/0.020 ms

ARP 与 PROXY ARP

ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。

在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。

一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。

代理 ARP是 ARP 协议的一个变种。 对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的 ARP 请求会使用自己的 MAC 地址与目标计算机的 IP地址对源计算机进行应答。代理ARP就是将一个主机作为对另一个主机ARP进行应答。它能使得在不影响路由表的情况下添加一个新的 Router,使得子网对该主机来说变得更透明化。同时也会带来巨大的风险,除了ARP欺骗,和某个网段内的 ARP 增加,最重要的就是无法对网络拓扑进行网络概括。代理ARP的使用一般是使用在没有配置默认网关和路由策略的网络上的。

image-20201201143559617

ARP

在局域网中,当主机或其它三层网络设备有数据要发送给另一台主机或三层网络设备时,它需要知道对方的网络层地址(即IP地址)。

但是仅有IP地址是不够的,因为IP报文必须封装成帧才能通过物理网络发送,因此发送方还需要知道接收方的物理地址(即MAC地址),这就需要一个从IP地址到MAC地址的映射。

ARP即可以实现将IP地址解析为MAC地址。主机或三层网络设备上会维护一张ARP表,用于存储IP地址和MAC地址的关系。一般ARP表项包括动态ARP表项和静态ARP表项。

image-20201201204929623

Proxy ARP

背景:

  • 企业内部进行子网划分时,可能会出现两个子网网络属于同一网段,但是却不属于同一物理网络的情况,两个子网网络间被路由器分隔。这时可以通过修改网络内主机的路由信息,使发往其它子网的数据先发送到连接不同子网的网关设备上,再由网关设备转发此数据报文。但是这种解决方案需要配置子网中所有主机的路由,并不便于管理和维护。

  • 在网关上部署路由式Proxy ARP功能,可以有效解决子网划分带来的管理和维护方面的问题。路由式Proxy ARP的功能可以使IP地址属于同一网段却不属于同一物理网络的主机间能够相互通信,并且主机上不需要配置缺省网关,便于管理和维护。

  • 路由式Proxy ARP组网如图所示。Router通过接口IF1和IF2连接两个子网网络,接口IF1和接口IF2的IP地址不在同一个网段。子网1内的主机Host_1与接口IF1的IP地址在同一网段,子网2内的主机Host_2与接口IF2的IP地址在同一网段,子网1内的主机Host_1与子网2内的主机Host_2的IP地址也在同一网段。主机Host_1和Host_2上未配置缺省网关。在Router上配置路由式Proxy ARP可以使子网1和子网2内主机间能够相互通信。

image-20201201205025615

Linux Proxy arp

image-20201202203950984

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#node1
ip link add veth1 type veth peer name eth1
ip netns add ns0
ip link set eth1 netns ns0
ip netns exec ns0 ip a add 10.1.1.10/24 dev eth1
ip netns exec ns0 ip link set eth1 up
ip netns exec ns0 ip route add 169.254.1.1 dev eth1 scope link
ip netns exec ns0 ip route add default via 169.254.1.1 dev eth1
ip link set veth1 up
ip route add 10.1.1.10 dev veth1 scope link
ip route add 10.1.1.20 via 172.12.1.11 dev eth0
echo 1 > /proc/sys/net/ipv4/conf/veth0/proxy_arp
#node2
ip link add veth1 type veth peer name eth1
ip netns add ns0
ip link set eth1 netns ns0
ip netns exec ns0 ip a add 10.1.1.20/24 dev eth1
ip netns exec ns0 ip link set eth1 up
ip netns exec ns0 ip route add 169.254.1.1 dev eth1 scope link
ip netns exec ns0 ip route add default via 169.254.1.1 dev eth1
ip link set veth1 up
ip route add 10.1.1.20 dev veth1 scope link
ip route add 10.1.1.10 via 172.12.1.10 dev eth0
echo 1 > /proc/sys/net/ipv4/conf/veth0/proxy_arp

SNAT And DNAT

SNAT

网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程。

随着Internet的发展和网络应用的增多,IPv4地址枯竭已成为制约网络发展的瓶颈。

尽管IPv6可以从根本上解决IPv4地址空间不足问题,但目前众多网络设备和网络应用大多是基于IPv4的,因此在IPv6广泛应用之前,一些过渡技术(如CIDR、私网地址等)的使用是解决这个问题最主要的技术手段。

NAT主要用于实现内部网络(简称内网,使用私有IP地址)访问外部网络(简称外网,使用公有IP地址)的功能。当内网的主机要访问外网时,通过NAT技术可以将其私网地址转换为公网地址,可以实现多个私网用户共用一个公网地址来访问外部网络。

image-20201209151942902

Static SNAT

  • Static NAT,静态NAT,用于将内部本地地址(私有IP)与内部全局地址(公有IP)进行一对一的映射。缺点是需要每一个内部IP地址需独占一个宝贵的公网IP地址。即,如果某个合法IP地址已经被NAT静态地址转换定义,即使该地址当前没有被使用,也不能被用作其它的地址转换。而且这种方式是静态手工创建的NAT映射,可扩展性不高。

  • 这种方法主要用在内网中存在需要对公网提供服务的服务器的场景,类似的例子有WEB服务器、邮件服务器、FTP服务器等。

  • Static NAT支持IP对IP的映射,以及端口对端口的映射。

image-20201209152531894

image-20201210163735621

Linux SNAT 源地址映射

image-20201210163759273

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#添加br0:
ip netns add ns1
ip l a br0 type bridge
ip l s br0 up
#配置br0和veth:
ip l a veth0 type veth peer name br-veth0
ip l s veth0 netns ns1
ip l s br-veth0 master br0
ip l s br-veth0 up
#配置ns1中接口:
ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0
ip netns exec ns1 ip l s veth0 up
ip a a 10.1.1.1/24 dev br0
ip l s br0 up
ip netns exec ns1 ifconfig lo up
#添加路由:
ip netns exec ns1 route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.1.1.1
#修改内核转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
#添加SNAT规则:
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 ! -o br0 -j MASQUERADE

Linux DNAT 目的地址映射

image-20201210222018157

DNAT - Docker Network-DNAT

image-20201210223334115

iptables

image-20211006114818276

我们把具有相同功能的规则的集合叫做“表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而 iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围。其 中包含:

• filter表:负责过滤功能,防火墙;内核模块:iptables_filter。

• nat表:network address translation,网络地址转换功能;内核模块:iptable_nat。

• mangle:拆解报文,做出修改,并重新封装 的功能;iptable_mangle。

• raw表:关闭nat表上启用的连接追踪机制;iptable_raw。

处理动作在iptables中被称为target,动作也可以分为基本动作和扩展动作。

此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结:

  1. ACCEPT:允许数据包通过。
  2. DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会 有反应。
  3. REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  4. SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  5. MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  6. DNAT:目标地址转换。
  7. REDIRECT:在本机做端口映射。
  8. LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对 数据包做任何其他操作,仍然让下一条规则去匹配。

iptables的概念中已经提到过,在实际操作iptables的过程中,是以“表”作为操作入口的。iptables为我们预定义了4张 表,它们分别是raw表、mangle表、nat表、filter表,不同的表拥有不同的功能。

iptables -t filter -L

我们使用-t选项,指定要操作的表,使用-L选项,查看-t选项对应的表的规则,-L选项的意思是,列出规则,所以,上 述命令的含义为列出filter表的所有规则。

image-20211006204202554

image-20211006204210134

TCP 与UDP

image-20211006205938272

TCP

image-20211006205950352

image-20211006210000839

image-20211006210009410

image-20211006210019737

image-20211006210031710

image-20211006210044109

UDP

image-20211006210059925

Route And Switch

在因特网中,网络连接设备用来控制网络流量和保证网络数据传输质量。常见的网络连接设备有集线器(Hub)、网桥(Bridge)、交换机(Switch)和路由器(Router)。这些设备的基本原理类似,下面就以路由器为例来介绍一下设备的基本原理。路由器是一种典型的网络连接设备,用来进行路由选择和报文转发。路由器根据收到报文的目的地址选择一条合适的路径(包含一个或多个路由器的网络),然后将报文传送到下一个路由器,路径终端的路由器负责将报文送交目的主机。

路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时,路由器可以根据路由表中最佳路由进行转发。最佳路由的选取与发现此路由的路由协议的优先级、路由的度量有关。当多条路由的协议优先级与路由度量都相同时,可以实现负载分担,缓解网络压力;当多条路由的协议优先级与路由度量不同时,可以构成路由备份,提高网络的可靠性。

路由是数据通信网络中最基本的要素。路由信息就是指导报文发送的路径信息,路由的过程就是报文转发的过程。

根据路由目的地的不同,路由可划分为:

  • 网段路由:目的地为网段,IPv4地址子网掩码长度小于32位或IPv6地址前缀长度小于128位。

  • 主机路由:目的地为主机,IPv4地址子网掩码长度为32位或IPv6地址前缀长度为128位。

根据目的地与该路由器是否直接相连,路由又可划分为:

  • 直连路由:目的地所在网络与路由器直接相连。

  • 间接路由:目的地所在网络与路由器非直接相连。

根据目的地址类型的不同,路由还可以分为:

  • 单播路由:表示将报文转发的目的地址是一个单播地址。

  • 组播路由:表示将报文转发的目的地址是一个组播地址。

路由过程

image-20201212172011219

路由协议优先级

对于相同的目的地,不同的路由协议(包括静态路由)可能会发现不同的路由,但这些路由并不都是最优的。

事实上,在某一时刻,到某一目的地的当前路由仅能由唯一的路由协议来决定。

为了判断最优路由,各路由协议(包括静态路由)都被赋予了一个优先级,当存在多个路由信息源时,具有较高优先级(取值较小)的路由协议发现的路由将成为最优路由,并将最优路由放入本地路由表中。

image-20201212172159024

  1. 其中,0表示直接连接的路由,255表示任何来自不可信源端的路由;数值越小表明优先级越高。
  2. 除直连路由(DIRECT)外,各种路由协议的优先级都可由用户手工进行配置。另外,每条静态路由的优先级都可以不相同。

静态路由Static Route

路由器根据路由转发数据包,路由可通过手动配置和使用动态路由算法计算产生,其中手动配置的路由就是静态路由。静态路由比动态路由使用更少的带宽,并且不占用CPU资源来计算和分析路由更新。但是当网络发生故障或者拓扑发生变化后,静态路由不会自动更新,必须手动重新配置。静态路由有5个主要的参数:目的地址和掩码、出接口和下一跳、优先级。

  • 目的地址和掩码:

IPv4的目的地址为点分十进制格式,掩码可以用点分十进制表示,也可用掩码长度(即掩码中连续‘1’的位数)表示。当目的地址和掩码都为零时,表示静态缺省路由。

  • 出接口和下一跳地址:

在配置静态路由时,根据不同的出接口类型,指定出接口和下一跳地址。

对于点到点类型的接口,只需指定出接口。因为指定发送接口即隐含指定了下一跳地址,这时认为与该接口相连的对端接口地址就是路由的下一跳地址。

对于NBMA(Non Broadcast Multiple Access)类型的接口(如ATM接口),配置下一跳IP地址。因这类接口支持点到多点网络,除了配置静态路由外,还需在链路层建立IP地址到链路层地址的映射,这种情况下,不需要指定出接口。VT接口下可以关联多个虚拟访问接口(Virtual Access Interface),这都会导致出现多个下一跳,无法唯一确定下一跳。

  • 静态路由优先级

对于不同的静态路由,可以为它们配置不同的优先级,优先级数字越小优先级越高。配置到达相同目的地的多条静态路由,如果指定相同优先级,则可实现负载分担;如果指定不同优先级,则可实现路由备份。

1
$ dis ip routing-table protocol static

实现

image-20201212175352436

image-20201212175425963

1
2
3
4
5
6
7
8
9
10
[AR1]
<Huawei>sys
[Huawei]sysname AR1
[AR1]int g0/0/0
[AR1-GigabitEthernet0/0/0]ip a 192.168.12.1 24
[AR1-GigabitEthernet0/0/0]q
<AR1>dis int brief
[AR1]dis ip int b
[AR1]dis this
[AR1]ip route-static 192.168.23.0 24 192.168.12.2
1
2
3
4
[AR2]
[AR2-GigabitEthernet0/0/0]ip a 192.168.12.2 24
[AR2-GigabitEthernet0/0/1]ip a 192.168.23.1 24
[AR2-GigabitEthernet0/0/1]display ip routing-table
1
2
3
[AR3]
[AR3-GigabitEthernet0/0/0]ip a 192.168.23.2 24
[AR3-GigabitEthernet0/0/0]ip route-static 192.168.12.0 24 192.168.23.1

Static Route - Default Route

image-20201212224347391

多出口

image-20201212225721976

Linux Architecture

image-20201213104311185

Linux Static Route

Linux系统的route命令用于显示和操作IP路由表(show/manipulate the IP routing table)。

要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问internet,那么就需要将网关地址设置为该Linux机器的默认路由。

需要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。

sysctl -w net.ipv4.ip_forward=1

image-20201213104450382

OSPFv2

开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议。目前针对IPv4协议使用的是OSPF Version 2(RFC2328);针对IPv6协议使用OSPF Version 3(RFC2740)。如无特殊说明,本文中所指的OSPF均为OSPF Version 2。

目的:

在OSPF出现前,网络上广泛使用RIP(Routing Information Protocol)作为内部网关协议。
由于RIP是基于距离矢量算法的路由协议,存在着收敛慢、路由环路、可扩展性差等问题,所以逐渐被OSPF取代。
OSPF作为基于链路状态的协议,能够解决RIP所面临的诸多问题。此外,OSPF还有以下优点:
• OSPF采用组播形式收发报文,这样可以减少对其它不运行OSPF路由器的影响。
• OSPF支持无类型域间选路(CIDR)。
• OSPF支持对等价路由进行负载分担。
• OSPF支持报文加密。
由于OSPF具有以上优势,使得OSPF作为优秀的内部网关协议被快速接收并广泛使用。

OSPF协议具有以下特点:

• OSPF把自治系统AS(Autonomous System)划分成逻辑意义上的一个或多个区域;
• OSPF通过LSA(Link State Advertisement)的形式发布路由;
• OSPF依靠在OSPF区域内各设备间交互OSPF报文来达到路由信息的统一;
• OSPF报文封装在IP报文内,可以采用单播或组播的形式发送。

image-20201215150810521

实现

image-20201215151916986

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sysname AR1
[AR1]int lo0
[AR1-LoopBack0]ip a 1.1.1.1 32
[AR1-LoopBack0]dis this
[V200R003C00]
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
#
return
[AR1-LoopBack0]q
[AR1]int g0/0/0
[AR1-GigabitEthernet0/0/0]ip a 10.1.12.1 24
Dec 15 2020 15:15:57-08:00 AR1 %%01IFNET/4/LINK_STATE(l)[1]:The line protocol IP
on the interface GigabitEthernet0/0/0 has entered the UP state.
[AR1-GigabitEthernet0/0/0]dis this
[V200R003C00]
#
interface GigabitEthernet0/0/0
ip address 10.1.12.1 255.255.255.0
#
return
[AR1-GigabitEthernet0/0/0]

[AR1]ospf router-id 1.1.1.1
[AR1-ospf-1]area 0
[AR1-ospf-1-area-0.0.0.0]network 1.1.1.1 0.0.0.0 #宣告网络
[AR1-ospf-1-area-0.0.0.0]dis ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
Destinations : 8 Routes : 8

Destination/Mask Proto Pre Cost Flags NextHop Interface

1.1.1.1/32 Direct 0 0 D 127.0.0.1 LoopBack0
10.1.12.0/24 Direct 0 0 D 10.1.12.1 GigabitEthernet
0/0/0
10.1.12.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/0
10.1.12.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/0
127.0.0.0/8 Direct 0 0 D 127.0.0.1 InLoopBack0
127.0.0.1/32 Direct 0 0 D 127.0.0.1 InLoopBack0
127.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
[AR1-ospf-1-area-0.0.0.0]network 10.1.12.0 0.0.0.255
[AR1-ospf-1-area-0.0.0.0]dis this
[V200R003C00]
#
area 0.0.0.0
network 1.1.1.1 0.0.0.0
network 10.1.12.0 0.0.0.255
#
return
[AR2-ospf-1-area-0.0.0.0]display ospf peer b

OSPF Process 1 with Router ID 2.2.2.2
Peer Statistic Information
----------------------------------------------------------------------------
Area Id Interface Neighbor id State
0.0.0.0 GigabitEthernet0/0/0 1.1.1.1 Full
----------------------------------------------------------------------------
[AR1]display ospf routing

OSPF Process 1 with Router ID 1.1.1.1
Routing Tables

Routing for Network
Destination Cost Type NextHop AdvRouter Area
1.1.1.1/32 0 Stub 1.1.1.1 1.1.1.1 0.0.0.0
10.1.12.0/24 1 Transit 10.1.12.1 1.1.1.1 0.0.0.0
2.2.2.2/32 1 Stub 10.1.12.2 2.2.2.2 0.0.0.0

Total Nets: 3
Intra Area: 3 Inter Area: 0 ASE: 0 NSSA: 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sysna
[Huawei]sysname AR2
[AR2]int lo0
[AR2-LoopBack0]ip a 2.2.2.2 32
[AR2-LoopBack0]dis this
[V200R003C00]
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
#
return
[AR2-LoopBack0]int g0/0/0
[AR2-GigabitEthernet0/0/0]ip a 10.1.12.2 24
Dec 15 2020 15:18:32-08:00 AR2 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP
on the interface GigabitEthernet0/0/0 has entered the UP state.
[AR2-GigabitEthernet0/0/0]dis this
[V200R003C00]
#
interface GigabitEthernet0/0/0
ip address 10.1.12.2 255.255.255.0
#
return

[AR2]ospf router-id 2.2.2.2
[AR2-ospf-1]area 0
[AR2-ospf-1-area-0.0.0.0]net
[AR2-ospf-1-area-0.0.0.0]network 2.2.2.2 0.0.0.0
[AR2-ospf-1-area-0.0.0.0]netwo
[AR2-ospf-1-area-0.0.0.0]network 10.1.12.0 0.0.0.255

OSPFv2 - Router ID

image-20201216203740857

OSPFv2 - DR BDR 备份

image-20201216203758887

OSPFv2 - Area 区域

image-20201216203817255

OSPFv2 - Muti-Area Configuration 多区域

image-20201216203837098

BGP

定义
• 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1、BGP-2和BGP-3,1994年开始使用BGP-4,2006年之后单播IPv4网络使用的版本是BGP-4,其他网络(如IPv6等)使用的版本是MP-BGP。

• MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)。

目的
• 为方便管理规模不断扩大的网络,网络被分成了不同的自治系统。1982年,外部网关协议EGP(Exterior GatewayProtocol)被用于实现在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。

• BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。

• 虽然BGP用在AS之间传递路由信息,但并非所有AS之间传递路由信息都要运行BGP。如数据中心上行到Internet的出口上,为了避免Internet海量路由对数据中心内部网络影响,设备采用静态路由代替BGP与外部网络通信。

受益
BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性:

• BGP采用认证和GTSM的方式,保证了网络的安全性。

• BGP提供了丰富的路由策略,能够灵活的进行路由选路,并且能指导邻居按策略发布路由。

• BGP提供了路由聚合和路由衰减功能用于防止路由振荡,有效提高了网络的稳定性。

• BGP使用TCP作为其传输层协议(端口号为179),并支持BGP与BFD联动、BGP Tracking和BGP GR和NSR,提高了网络的可靠性。

• 在邻居数目多、路由量大且大多邻居有相同出口策略场景下,BGP用按组打包技术极大提高了BGP打包发包性能。

image-20201216214822402

image-20201219183152754

Packet Type

image-20210127095134834

IBGP And EBGP

image-20210127095153219

Split Horizon

image-20210127095207361

实验

image-20210127095223455

配置基础网络

1
2
3
4
5
6
7
8
9
10
11
#AR1
[Huawei]sysname AR1
[AR1]int GigabitEthernet 0/0/0
[AR1-GigabitEthernet0/0/0]ip a 10.1.12.1 24
[AR1-GigabitEthernet0/0/0]dis this
ip address 10.1.12.1 255.255.255.0

[AR1-GigabitEthernet0/0/0]int l 0
[AR1-LoopBack0]ip a 1.1.1.1 32
[AR1-LoopBack0]dis this
ip address 1.1.1.1 255.255.255.255
1
2
3
4
5
6
7
#AR2
[AR2]int g0/0/0
[AR2-GigabitEthernet0/0/0]ip a 10.1.12.2 24
[AR2-GigabitEthernet0/0/0]int g0/0/1
[AR2-GigabitEthernet0/0/1]ip a 10.1.23.2 24
[AR2-GigabitEthernet0/0/1]int l 0
[AR2-LoopBack0]ip a 2.2.2.2 32
1
2
3
4
5
#AR3
[AR3]int g0/0/0
[AR3-GigabitEthernet0/0/0]ip a 10.1.23.3 24
[AR3-GigabitEthernet0/0/0]int l 0
[AR3-LoopBack0]ip a 3.3.3.3 32

配置ospf路由

1
2
3
4
5
#AR1	
[AR1]ospf router-id 1.1.1.1
[AR1-ospf-1]a 0
[AR1-ospf-1-area-0.0.0.0]network 10.1.12.0 0.0.0.255
[AR1-ospf-1-area-0.0.0.0]network 1.1.1.1 255.255.255.255
1
2
3
4
5
#AR2
[AR2]ospf router-id 2.2.2.2
[AR2-ospf-1]a 0
[AR2-ospf-1-area-0.0.0.0]network 10.1.12.0 0.0.0.255
[AR2-ospf-1-area-0.0.0.0]network 10.1.23.0 0.0.0.255
1
2
3
4
5
#AR3
[AR3]ospf router-id 3.3.3.3
[AR3-ospf-1]a 0
[AR3-ospf-1-area-0.0.0.0]network 10.1.23.0 0.0.0.255
[AR3-ospf-1-area-0.0.0.0]network 3.3.3.3 255.255.255.255

检查ospf

1
2
3
4
5
6
7
8
[AR1]dis ospf peer b

OSPF Process 1 with Router ID 1.1.1.1
Peer Statistic Information
----------------------------------------------------------------------------
Area Id Interface Neighbor id State
0.0.0.0 GigabitEthernet0/0/0 2.2.2.2 Full
----------------------------------------------------------------------------

检查

1
2
3
4
5
6
7
8
[AR1-ospf-1-area-0.0.0.0]dis ospf peer b

OSPF Process 1 with Router ID 1.1.1.1
Peer Statistic Information
----------------------------------------------------------------------------
Area Id Interface Neighbor id State
0.0.0.0 GigabitEthernet0/0/0 2.2.2.2 Full
----------------------------------------------------------------------------

配置IBGP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[AR1]bgp 123
[AR1-bgp]router-id 1.1.1.1 #2.指定BGP的Router ID
[AR1-bgp]peer 3.3.3.3 as-number 123 # 3.配置和自己在同一个AS里边的对端需要建立BGP Peer的TCP对象。自己是2.2.2.2,对端是1.1.1.1[注意,这个后边的as-number是值的是你要建立tcp连接的对端的as 号,不是本端的。]
[AR1-bgp]peer 3.3.3.3 connect-interface l0 # 4.为了防止建立的BGP Peer由于端口down而出现断链,所以建议使用环回口来建立BGP 的Peer。
[AR1]dis bgp routing-table

BGP Local router ID is 1.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete


Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn

*>i 33.33.33.33/32 3.3.3.3 0 100 0 i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[AR3]bgp 123
[AR3-bgp]router-id 3.3.3.3
[AR3-bgp]peer 1.1.1.1 as-number 123
[AR3-bgp]peer 1.1.1.1 connect-interface l0
[AR3-bgp]dis bgp peer

BGP local router ID : 3.3.3.3
Local AS number : 123
Total number of peers : 1 Peers in established state : 1

Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pre
fRcv

1.1.1.1 4 123 5 5 0 00:03:04 Established
0
[AR3-bgp]dis this
[V200R003C00]
#
bgp 123
router-id 3.3.3.3
peer 1.1.1.1 as-number 123
peer 1.1.1.1 connect-interface LoopBack0
#
ipv4-family unicast
undo synchronization
peer 1.1.1.1 enable
#
return


[AR3-bgp]int L0
[AR3-LoopBack0]ip a 3.3.3.3 32
[AR3-bgp]int L 11
[AR3-LoopBack11]ip a 33.33.33.33
[AR3]bgp 123
[AR3-bgp]router-id 3.3.3.3
[AR3-bgp]network 33.33.33.33 32
[AR3-bgp]dis this
[V200R003C00]
#
bgp 123
router-id 3.3.3.3
peer 1.1.1.1 as-number 123
peer 1.1.1.1 connect-interface LoopBack0
#
ipv4-family unicast
undo synchronization
network 33.33.33.33 255.255.255.255
peer 1.1.1.1 enable
#
return

检查IBGP

1
2
3
4
5
6
7
8
9
10
11
12
[AR1-ospf-1-area-0.0.0.0]dis bgp peer

BGP local router ID : 1.1.1.1
Local AS number : 123
Total number of peers : 1 Peers in established state : 1

Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pre
fRcv

3.3.3.3 4 123 4 4 0 00:02:18 Established
0

image-20210127153848450

配置EBGP

1
2
3
4
5
#AR4
[AR4]int g0/0/0
[AR4-GigabitEthernet0/0/0]ip a 10.1.34.4 24
[AR4-GigabitEthernet0/0/0]int l0
[AR4-LoopBack0]ip a 4.4.4.4 32
1
2
[AR3]int g0/0/1
[AR3-GigabitEthernet0/0/1]ip a 10.1.34.3 24
1
2
3
[AR3]bgp 123
[AR3]router-id 3.3.3.3
[AR3-bgp]peer 10.1.34.4 as-number 400
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[AR4]bgp 400
[AR4-bgp]router-id 4.4.4.4
[AR4-bgp]peer 10.1.34.3 as-number 123
[AR4-bgp]dis bgp peer
BGP local router ID : 4.4.4.4
Local AS number : 400
Total number of peers : 1 Peers in established state : 1

Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pre
fRcv

10.1.34.3 4 123 5 5 0 00:02:46 Established
1
[AR4-bgp]network 4.4.4.4 32

检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[AR1-ospf-1-area-0.0.0.0]dis bgp routing-table
i 4.4.4.4/32 10.1.34.4 0 100 0 400i
*>i 33.33.33.33/32 3.3.3.3 0 100 0 i

[AR1-ospf-1-area-0.0.0.0]dis ip routing-table
1.1.1.1/32 Direct 0 0 D 127.0.0.1 LoopBack0
3.3.3.3/32 OSPF 10 2 D 10.1.12.2 GigabitEthernet
0/0/0
10.1.12.0/24 Direct 0 0 D 10.1.12.1 GigabitEthernet
0/0/0
10.1.12.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/0
10.1.12.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/0
10.1.23.0/24 OSPF 10 2 D 10.1.12.2 GigabitEthernet
0/0/0
33.33.33.33/32 IBGP 255 0 RD 3.3.3.3 GigabitEthernet
0/0/0

BGP RR

image-20210212134442446

BGP RR mechanism

flannel

0%