Think Deep,Work Lean

linux下网桥及路由配置

Posted on By zack

网桥

网桥Bridge是两端口的二层交换设备,用来连接不同网段。网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。网桥比集线器(Hub)性能更好,集线器上各端口都是共享同一条背板总线的。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switch)所取代。网桥是一种对帧进行转发的技术,根据MAC分区块,可隔离碰撞。网桥将网络的多个网段在数据链路层连接起来,它能将一个大的LAN分割为多个网段,或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器。其工作模式与交换机一样,可理解为交换机是多端口的网桥。

实战-系统网桥的配置

要是Linux可以工作在网桥模式,安装网桥工具bridge-utils,运行命令:

yum install bridge-utils -y

创建网桥br0

brctl addbr br0

在网桥上添加port

brctl addif br0 eth0
ifconfig eth0 0.0.0.0 netmask 255.255.255.0 up
ifconfig br0 192.168.56.13 netmask 255.255.255.0 up
brctl show br0

此时就已将eth0加入了网桥br0,并且给br0配置了IP,此时可直接在外部用xshell连该IP

删除网桥

brctl delif br0 eth0
ifconfig br0 down
brctl delbr br0

配置原先的IP

ifconfig eth0 192.168.56.13 netmask 255.255.255.0 up

注意:所有的这些命令式操作,在重启网卡之后都会失效,若要长期保存需修改配置文件ifcfg-eth0

关于网桥的一个举例说明

有五台主机。其中一台主机装有linux ,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机。我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2 ,192.168.1.3,192.168.1.4,192.168.1.5) 之间转发数据包。同时,为了方便管理,希望网桥能够有一个IP(192.168.1.1),那样管理员就可以在192.168.1.0/24网段内的主机上telnet到网桥,对其进行配置,实现远程管理。

前一节中提到,网桥在同一个逻辑网段转发数据包。针对上面的拓扑,这个逻辑网段就是192.168.1.0/24网段。我们为这个逻辑网段一个名称,br0。首先需要配置这样一个逻辑网段。参考

# brctl addbr br0                    (建立一个逻辑网段,名称为br0)

实际上,我们可以把逻辑网段192.168.1.0/24看作使一个VLAN ,而br0则是这个VLAN的名称。

建立一个逻辑网段之后,我们还需要为这个网段分配特定的端口。在Linux中,一个端口实际上就是一个物理网卡。而每个物理网卡名称则分别为eth0,eth1,eth2,eth3。我们需要把每个网卡一一和br0这个网段联系起来,作为br0中的一个端口。

# brctl addif br0 eth0               (让eth0成为br0的一个端口)
# brctl addif br0 eth1               (让eth1成为br0的一个端口)
# brctl addif br0 eth2               (让eth2成为br0的一个端口)
# brctl addif br0 eth3               (让eth3成为br0的一个端口)

网桥的每个物理网卡作为一个端口,运行于混杂模式,而且是在链路层工作,所以就不需要IP了。

# ifconfig eth0 0.0.0.0
# ifconfig eth1 0.0.0.0
# ifconfig eth2 0.0.0.0
# ifconfig eth3 0.0.0.0

然后给br0的虚拟网卡配置IP:192.168.1.1。那样就能远程管理网桥。

# ifconfig br0 192.168.1.1

给br0配置了IP之后,网桥就能够工作了。192.168.1.0/24网段内的主机都可以telnet到网桥上对其进行配置。

以上配置的是一个逻辑网段,实际上Linux网桥也能配置成多个逻辑网段(相当于交换机中划分多个VLAN

ovs网桥创建

ovs是一个高质量的,多层虚拟交换机(网络分层的层),其目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议:NetFlow. SFlow等,并且它还支持多个物理机的分布式环境。

创建网桥 brcpic

#vim /etc/sysconfig/network-scripts/ifcfg-brcpic

DEVICE=brcpic
ONBOOT=yes
TYPE=OVSBridge
DEVICETYPE=ovs

启动对应网桥brcpic即可生效

ovs 网桥绑定物理网卡

#vim  /etc/sysconfig/network-scripts/ifcfg-eth1

NAME=eth1
DEVICE=eth1
ONBOOT=yes
NETBOOT=yes
BOOTPROTO=static
TYPE=OVSPort
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_FAILURE_FATAL=no
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=no
IPV6_PEERROUTES=no
DEVICETYPE=ovs
OVS_BRIDGE=brmgnt
HWADDR=EC:38:8F:7A:EB:8A

也可以不修改网卡配置,直接使用命令进行网卡绑定

#ovs-vsctl add-port brmgnt eth1

ovs 网桥生成有tag的port

Ceph public的Port配置文件,ip netmask网关的值请根据实际环境信息修改

#vim /etc/sysconfig/network-scripts/ifcfg-ironic

DEVICE=ironic
ONBOOT=yes
NETBOOT=yes
BOOTPROTO=static
IPADDR=192.168.202.190
NETMASK=255.255.255.0
TYPE=OVSIntPort
OVS_BRIDGE=brmgnt
DEVICETYPE=ovs
OVS_OPTIONS="tag=202"

ovs 网桥绑定无tag的port

Ceph public的Port配置文件,ip netmask网关的值请根据实际环境信息修改

#vim /etc/sysconfig/network-scripts/ifcfg-ceph

DEVICE=ceph
ONBOOT=yes  
NETBOOT=yes  
BOOTPROTO=static
IPADDR=10.127.3.5
NETMASK=255.255.255.0
TYPE=OVSIntPort  
OVS_BRIDGE=brcpic  

linux路由配置

参考

route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.17    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
10.1.32.14      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.1.32.12      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.4.8.2        192.168.9.254   255.255.255.255 UGH   0      0        0 eth0
10.4.9.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
192.168.9.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
10.2.0.0        0.0.0.0         255.255.0.0     U     0      0        0 tun0
10.0.0.0        0.0.0.0         255.255.0.0     U     0      0        0 tun0
10.1.0.0        0.0.0.0         255.255.0.0     U     0      0        0 tun0
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 tun0
0.0.0.0         192.168.9.254   0.0.0.0         UG    0      0        0 eth0

主机路由

主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。

Destination    Gateway       Genmask        Flags     Metric    Ref    Use    Iface
-----------    -------     -------            -----     ------    ---    ---    -----
10.0.0.10     192.168.1.1    255.255.255.255   UH       0    0      0    eth0

网络路由

网络路由是代表主机可以到达的网络。网络路由的Flags字段为N。例如,在下面的示例中,本地主机将发送到网络192.19.12的数据包转发到IP地址为192.168.1.1的路由器。

Destination    Gateway       Genmask      Flags    Metric    Ref     Use    Iface
-----------    -------     -------         -----    -----   ---    ---    -----
192.19.12     192.168.1.1    255.255.255.0      UN      0       0     0    eth0

默认路由

当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G。例如,在下面的示例中,默认路由是IP地址为192.168.1.1的路由器。

Destination    Gateway       Genmask    Flags     Metric    Ref    Use    Iface
-----------    -------     ------- -----      ------    ---    ---    -----
default       192.168.1.1     0.0.0.0    UG       0        0     0    eth0

配置路由route的命令

设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:

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

route命令使用举例

添加到主机的路由
# route add -host 192.168.1.2 dev eth0:0
# route add -host 10.20.30.148 gw 10.20.30.40

添加到网络的路由
# route add -net 10.20.30.40 netmask 255.255.255.248 eth0
# route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
# route add -net 192.168.1.0/24 eth1

添加默认路由
# route add default gw 192.168.1.1

删除路由
# route del -host 192.168.1.2 dev eth0:0
# route del -host 10.20.30.148 gw 10.20.30.40
# route del -net 10.20.30.40 netmask 255.255.255.248 eth0
# route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
# route del -net 192.168.1.0/24 eth1
# route del default gw 192.168.1.1                  //route del default   删除所有的默认路由

添加一条默认路由
# route add default gw 10.0.0.1      //默认只在内存中生效
开机自启动可以追加到/etc/rc.local文件里
# echo "route add default gw 10.0.0.1" >>/etc/rc.local

添加一条静态路由
# route add -net 192.168.2.0/24 gw 192.168.2.254
要永久生效的话要这样做:
# echo "any net 192.168.2.0/24 gw 192.168.2.254" >>/etc/sysconfig/static-routes

添加到一台主机的静态路由
# route add -host 192.168.2.2 gw 192.168.2.254
要永久生效的话要这样做:
# echo "any  host 192.168.2.2 gw 192.168.2.254 " >>/etc/sysconfig/static-routes
注:Linux 默认没有这个文件 ,得手动创建一个

设置包转发

在Linux中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能; 开启Linux的路由功能可以通过调整内核的网络参数来实现,方法如下

临时开启路由功能:
# echo 1 > /proc/sys/net/ipv4/ip_forward
或者
# sysctl -w net.ipv4.ip_forward=1
 永久开启路由功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

静态路由配置

添加静态路由到路由表的语法如下:

ip route [destination_network] [mask] [next-hop_address] administrative_distance]

参数解析:

ip route         用于创建静态路由的命令。
Destination_network        需要发布到路由表中的网段。
Mask        在这一网络上使用的子网掩码。
Next-hop_address        下一跳路由器的地址。
administrative_distance      默认时,静态路由有一个取值为1 的管理性距离。在这个命令的尾部添加管理权来修改这个默认值。

查看路由表除了使用route -n命令外,还可以使用ip route

[root@dev ~]# ip route
192.168.1.17 dev ppp0  proto kernel  scope link  src 192.168.1.190
10.1.32.14 dev tun0  scope link
10.1.32.12 dev tun0  scope link
10.4.8.2 via 192.168.9.254 dev eth0  src 192.168.9.200  mtu 1500 advmss 1460
10.4.9.0/24 dev tun0  scope link
192.168.9.0/24 dev eth0  proto kernel  scope link  src 192.168.9.200  metric 1
10.2.0.0/16 dev tun0  scope link
10.0.0.0/16 dev tun0  scope link
10.1.0.0/16 dev tun0  scope link
192.168.0.0/16 dev tun0  scope link
default via 192.168.9.254 dev eth0

Linux之bridge

Linux网桥是网桥的软件实现,这是Linux内核的内核部分。与硬件网桥相类似,Linux网桥维护了一个2层转发表(也称为MAC学习表,转发数据库,或者仅仅称为FDB),它跟踪记录了MAC地址与端口的对应关系。当一个网桥在端口N收到一个包时(源MAC地址为X),它在FDB中记录为MAC地址X可以从端口N到达。这样的话,以后当网桥需要转发一个包到地址X时,它就可以从FDB查询知道转发到哪里。构建一个FDB常常称之为“MAC学习”或仅仅称为“学习”过程。

brctl showmacs <bridge-name>
bridge fdb show  #查看所有的mac地址对应的信息