hello云胜

技术与生活

0%

ip rule

查看服务器上的路由规则

1
2
3
4
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

前面的数字代表优先级,0是最高优先级。

local、main、default是三个路由表的名字

ip route list table local

查看local路由表中的路由策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
broadcast 1x.xxx.5.0 dev eth0 proto kernel scope link src 1x.xxx.5.1
local 1x.xxx.5.1 dev eth0 proto kernel scope host src 1x.xxx.5.1
broadcast 1x.xxx.5.255 dev eth0 proto kernel scope link src 1x.xxx.5.1
local 100.125.97.128 dev tunl0 proto kernel scope host src 100.125.97.128
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.17.0.0 dev docker0 proto kernel scope link src 172.17.0.1
local 172.17.0.1 dev docker0 proto kernel scope host src 172.17.0.1
broadcast 172.17.255.255 dev docker0 proto kernel scope link src 172.17.0.1
...
local 1x.xx.0.1 dev kube-ipvs0 proto kernel scope host src 1x.xx.0.1
local 1x.xx.0.9 dev kube-ipvs0 proto kernel scope host src 1x.xx.0.9
local 1x.xx.0.10 dev kube-ipvs0 proto kernel scope host src 1x.xx.0.10
...

ip route

查看的是外部路由表,实际上查看的就是main表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ip route
default via 1x.xxx.5.254 dev eth0
1x.xxx.5.0/24 dev eth0 proto kernel scope link src 1x.xxx.5.1
100.116.168.192/26 via 1x.xxx.5.3 dev tunl0 proto bird onlink
100.121.66.192/26 via 1x.xxx.5.2 dev tunl0 proto bird onlink
100.121.236.192/26 via 1x.xxx.5.4 dev tunl0 proto bird onlink
blackhole 100.125.97.128/26 proto bird
100.125.97.132 dev cali8bb97db0aa4 scope link
100.125.97.135 dev calide035c655d8 scope link
100.125.97.136 dev caliac4b211f131 scope link
100.125.97.138 dev cali5e5ab1418d1 scope link
100.125.97.139 dev cali98e6dbf06d5 scope link
100.125.97.140 dev cali08b0447e81a scope link
100.125.97.144 dev cali85142d4df17 scope link
100.125.176.128/26 via 1x.xxx.5.5 dev tunl0 proto bird onlink
169.254.0.0/16 dev eth0 scope link metric 1002
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1

ip route == ip route list table main

解读一下结果

1
default via 1x.xxx.5.254 dev eth0

是一个default,就是说如果本地都没有找到合适的路由,那默认就发到这个default网关,地址是1x.xxx.5.254,通过网卡eth0转发。

route

1
route -n

防火墙路由转发

开启防火墙的路由转发功能

1
iptables -A FORWARD -j ACCEPT

配置linux内核允许路由转发

1
/proc/sys/net/ipv4/ip_forward

修改其值为1,让内核允许一个网卡的网络包可以转发到另一个网卡上

ip netns

网络命令空间

1
2
3
4
5
6
7
8
# ip netns
cni-91ad63e9-fde5-c435-f26c-e26a103394ee (id: 6)
cni-011e1c20-604d-f94e-61a3-15c3ab74aad5 (id: 0)
cni-a26a0f96-9931-8632-c628-b2c3c68fe0c0 (id: 2)
cni-63de9e9e-13fd-7202-6ee0-f202abb91423 (id: 1)
cni-0b3b4d60-883c-25bb-f3d4-000a243e30e8 (id: 4)
cni-5a0f1e59-1497-e367-f0a5-5fa6d1ab6b9d (id: 5)
cni-c4a598a3-88bd-b3cd-558c-1d241c40a5a7 (id: 3)

新建网络命名空间

1
ip netns add ns-xxxx

注意ns的隔离

因为网络空间的隔离问题,所以对某个具体ns下执行命令,要进如该ns去执行

1
ip netns exex ns-xxxx 后面加命令

比如加上 ping 192.168.15.2

就是在网络空间ns-xxxx里执行ping

而不是默认的主机网络空间

brctl

bridge,网桥。可以理解为linux上的虚拟交换机。交换机是只认mac地址,不管ip。交换机是一个二层转发设备

1
brctl show

但是,网桥有点特殊,就特殊在它可以绑定一个ip地址段。

比如看docker0网桥

1
2
3
4
5
6
7
8
9
#ip addr
...
docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:3f:90:62:8d brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:3fff:fe90:628d/64 scope link
valid_lft forever preferred_lft forever
...

创建网桥

1
brctl addbr br-xxxx

veth设备

创建veth pair

1
ip link add veth-xxxx type veth peer name veth-xxxx-pr

把veth pair的一端放到创建的网络ns中

1
ip link set veth-xxxx netns xxxx

把veth pair的另一端连接到网桥上

1
ip link set veth-xxxx-pr master br-xxxx

这其实就是创建一个docker容器的网络步骤

启动各个网络设备

启动网桥

1
ip link set br-xxxx up

启动veth pair在网桥上的一端

1
ip link set veth-xxxx-pr up

启动veth pair在ns上的一端

1
ip netns exec ns-xxxx ip link set veth-xxxx up

给网络设备加上ip

给veth pair添加ip

1
ip netns exec ns-xxxx ip addr add 192.168.15.1/24 dev veth-xxxx

给网桥加上ip

1
ip addr add 192.168.15.10/24 dev br-xxxx

这样,服务器就可以通过网桥和容器通信

容器访问外网

目前在容器里是不能访问外网的,因为找不到路由

解决的办法是添加一个默认路由,通过网口veth-xxxx,下一条到网桥,然后就可以进到服务器主机的网络空间,进而通外网

1
ip netns exec ns-xxxx ip route add default via 192.168.15.10 dev veth-xxxx

查看一下

1
ip netns exec ns-xxxx route -n

此时还是不通,因为现在我们在容器里ping外网,出去的icmp包的源ip写的是容器的ip。这样的包肯定是回不来的,因为外网没有这个ip的路由。

所以,需要开启snat

1
iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE

这个配置的意思是,在包出去的时候,把源ip是192.168.15.0/24这个段的,从哪个网卡出去,源ip就改成这个网卡的物理ip,这就是MASQUERADE的作用。

这样外网的包就能回来了。

抓包排查

抓包网桥

1
tcpdump -i br-xxxx