马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等。总之,与网络有关的组件都是独立的。
! l+ E* D& u& M1 q' L, ]
7 P& I2 N- [7 y# b4 J% Z2 f* e创建网络空间: # ip netns add ns19 e* [8 Z$ e( {+ U* j
查看网络空间: # ip netns list% |( @( f0 w4 E# R9 X$ ~6 s
删除网络空间: # ip netns del ns1/ }; }6 X5 ^: J5 s0 {+ M1 ]
进入网络空间执行命令: # ip netns exec ns1 `command`
6 s! O) F4 Q* q, K6 s z- ~4 p8 o3 M% H: k* C
实例一:
+ b _7 `9 x, u U+ M7 K' j 用netns连接两个隔离环境中的虚拟机,如图:
% m" R* Z f; D- M) Q 在虚拟化中有两个虚拟机网络隔离环境需要通信。 系统: centos7.2 x64 安装程序包# yum install bridge-utils libvirt libvirt-client virt-install virt-viewer net-tools -y# brctl addbr br0# brctl addbr br1# ifconfig br0 up# ifconfig br1 up% H& V5 ]5 N" R9 v/ S( u7 Y
取消默认nat网络模式# mv /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/default.xml_bak# systemctl start libvirtd
3 f! B$ |; o2 x7 `; k9 w9 U; `创建虚拟机并连接至br0# virt-install --name vm1 --ram 512 --vcpus=1 --disk /images/linux/cirros-0.3.5-i386-disk-1.img --network bridge=br0,model=virtio --force --import --nographics --serial=pty --console=pty打开第二个终端创建第二个虚拟机并连接至br1# virt-install --name vm2 --ram 512 --vcpus=1 --disk /images/linux/cirros-0.3.5-i386-disk-2.img --network bridge=br1,model=virtio --force --import --nographics --serial=pty --console=pty# brctl showbridge name bridge id STP enabled interfacesbr0 8000.fe54007e1861 no vnet0br1 8000.fe5400be1885 no vnet1
8 _; R$ S0 ^* f到此,虚拟机已经连接上各自的桥设备了。完成如图: 6 Q0 V, @4 _$ D! {! d E) ^& [
创建虚拟网络空间:# ip netns add ns1# ip netns listns1
! x# f! h5 u- K2 B接下来创建一张虚拟网卡,虚拟网卡分为前半段和后半段,我们将前半段添加到br0中,并将后半段添加到虚拟网络空间中,这样br0桥设备中主机就能够连接到虚拟网络空间中。 # ip link add net-in type veth peer name net-out# ifconfig net-in up# ifconfig net-out up
, T% [% _9 Z% n2 z# p: O. ?将net-in虚拟网卡添加到br0中,将net-out虚拟网卡添加到ns1中 # brctl addif br0 net-in查看是否添加成功# brctl show br0bridge name bridge id STP enabled interfacesbr0 8000.46c7e9d2c0fa no net-in vnet0- M4 [! \1 J9 g1 @ m' K: d% \
将net-out添加到ns1中,并重命名为eth0# ip link set dev net-out name eth0 netns ns1
. U6 U/ ~+ b! j% r3 ^" U' D& f查看是否添加成功# ip netns exec ns1 ifconfig -aeth0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether a2:07:dc:ba:35:a2 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=8<LOOPBACK> mtu 65536 loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# ip netns exec ns1 ifconfig lo up, f3 [: y9 W Z% I. I
现在vm1 --> br0 --> ns1 网络做通了,完成如下图:
8 ]& @* H% n+ _1 S) z, i F同理,和上面操作一样。 # ip link add net1-in type veth peer name net1-out# ifconfig net1-in up# ifconfig net1-out up# brctl addif br1 net1-in# brctl show br1bridge name bridge id STP enabled interfacesbr1 8000.1291a963b290 no net1-in vnet1# ip link set dev net1-out name eth1 netns ns1
: @! @2 Q- o. ?6 X; ? y. e6 C% i7 D$ M- s# K& _! D) l, j
# ip netns exec ns1 ifconfig -aeth0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether a2:07:dc:ba:35:a2 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eth1: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 02:d4:3c:7d:3b:2e txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0: n- q" H* |3 ^
ip地址配置如下:
( q1 m. {. H9 g% w* T; A
S. q) B4 b5 F9 xvm1 - eth0 : 192.168.1.2
1 v) c9 g2 l& w- j3 mns1 - eth0 : 192.168.1.1
0 m' `* c* A, g4 w
9 \2 A! d/ h* Z, hvm2 - eth0 : 172.168.10.29 ^. C& g+ U, }. n) E+ N
ns1 - eth0 : 172.168.10.1 记住:当宿主机开启了网络转发功能,虚拟网络空间才会开启,在以上场景中,必须开启网络转发功能。 # sysctl -w net.ipv4.ip_forward=1net.ipv4.ip_forward = 1
. r) L+ A; r* Z2 [# D# @* E
9 Y2 z0 _* [8 z2 W+ p5 nvm1 - eth0 网络配置如下: # ifconfig lo up # ifconfig eth0 192.168.1.2/24 up# ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:7E:18:61 inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fe7e:1861/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:168 (168.0 B)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 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)" X, w ^& ]; J. w& A6 B& X9 ], q
ns1 - eth0 网络配置如下: # ip netns exec ns1 ifconfig lo up# ip netns exec ns1 ifconfig eth0 192.168.1.1/24 up# ip netns exec ns1 ifconfig eth0eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 ether a2:07:dc:ba:35:a2 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0& t0 |7 d( S9 w/ y' o
6 B( g8 l6 a$ y2 b* {( K
vm2 - eth0 网络配置如下: # ifconfig lo up# ifconfig eth0 172.168.10.2/24 up# ifconfig eth0eth0 Link encap:Ethernet HWaddr 52:54:00:BE:18:85 inet addr:172.168.10.2 Bcast:172.168.255.255 Mask:255.255.0.0 inet6 addr: fe80::5054:ff:febe:1885/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:168 (168.0 B)
- X# d# N+ F; w4 s
: m$ y B% m- f. b3 ons1 - eth1 网络配置如下: # ip netns exec ns1 ifconfig eth1 172.168.10.1/24 up# ip netns exec ns1 ifconfig eth1eth1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.168.10.1 netmask 255.255.255.0 broadcast 172.168.10.255 ether 02:d4:3c:7d:3b:2e txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0' G z3 y! l4 f/ ~
8 d# p) P' p- q
为虚拟机指定路由: vm1 :# ping 192.168.1.1 -c1PING 192.168.1.1 (192.168.1.1): 56 data bytes64 bytes from 192.168.1.1: seq=0 ttl=64 time=0.811 ms--- 192.168.1.1 ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max = 0.811/0.811/0.811 ms# ip route add default via 192.168.1.1; H, |$ D! p1 H2 E5 p B
注意:如果ping不通,请检查链路上的网卡状态是否是up状态。 vm2 :# ping 172.168.10.1 -c1PING 172.168.10.1 (172.168.10.1): 56 data bytes64 bytes from 172.168.10.1: seq=0 ttl=64 time=2.385 ms--- 172.168.10.1 ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max = 2.385/2.385/2.385 ms添加默认路由# ip route add default via 172.168.10.1" j( w: l; l' n! q- p# \
$ h! R# ^3 n; p- `
接下来,使用ping测试。 vm1 - eth0 : 192.168.1.2 --> ns1 - eth1 : 172.168.10.1# ping 172.168.10.1 -c1PING 172.168.10.1 (172.168.10.1): 56 data bytes64 bytes from 172.168.10.1: seq=0 ttl=64 time=0.426 ms--- 172.168.10.1 ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max = 0.426/0.426/0.426 ms能够达到ns1 eth1网卡,说明ns1从eth0 - 192.168.10.1 转发到了 172.168.10.1vm1 - eth0 : 192.168.1.2 --> vm2 - eth0 : 172.168.10.29 n0 ~! y { O. a( L8 X
% l' N1 |2 q# o3 M* Z0 \6 h7 b! ~7 `7 X
这样,就完成了在宿主机中,两个虚拟主机隔离模式的通信。 % z R, M0 H0 S! X/ H" s5 B1 X
! r, b* B: b% K: r+ C
实例二: 0 ` i& Q" Y2 E% E1 O) X
5 B2 N7 {, Y( o& d0 {$ q 说明:宿主机中两组隔离模型,其中只有一组可以访问公网
接下来,在模式一的基础上进行修改:4 E* e1 W2 m/ k0 N, }( J5 {
/ K8 N9 T$ a1 G5 I # ip netns del ns1# u: H5 S5 \% o4 B7 ]# g
4 q% F: t: b! R5 Z/ V删除虚拟网络空间模式,所有和虚拟网络空间有关的虚拟网卡都会被删除。
现在的模式如下:
9 ~2 m9 Q- C4 h; u2 Wvm1: 192.168.1.2/249 I7 \' i; ]3 W2 M& ^
vm2: 192.168.1.2/24
, W0 ]+ F6 `7 Z O7 Uns1: 192.168.1.1/24& v6 f; `+ V6 c) e
* y, O8 E0 n5 W( s这里故意把vm1和vm2的ip设置为一样,方便我们进行测试。 添加虚拟网络空间# ip netns add ns1# ip link add net-in type veth peer name net-out# ifconfig net-in up# ifconfig net-out up
6 q8 o5 m! H! E8 ?9 M; E. n$ G7 ^添加net-in到br0,添加net-out到虚拟网络空间ns1# brctl addif br0 net-in# ip link set dev net-out name eth0 netns ns1为ns1启动网卡并配置ip地址# ip netns exec ns1 ifconfig lo up# ip netns exec ns1 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up9 H' N* v, m5 \& M1 Y% {
为vm1配置网关为192.168.1.1
$ Y3 J1 u: W- Z( d+ t" m2 Y" K: ~! }" ]7 v8 K6 s$ T
创建桥设备,并将物理网卡添加到桥设备中,这里建议直接修改物理网卡配置文件 cp -a ifcfg-eno16777736 ifcfg-br-out# vim ifcfg-eno16777736 TYPE=EthernetBOOTPROTO=noneDEFROUTE=yesPEERDNS=yesPEERROUTES=yesIPV4_FAILURE_FATAL=noIPV6INIT=noNAME=eno16777736UUID=100e462e-c0d0-4271-9b5a-1c8e47ff0d03DEVICE=eno16777736ONBOOT=yesBRIDGE=br-out# vim ifcfg-br-out TYPE=BridgeBOOTPROTO=noneDEFROUTE=yesPEERDNS=yesPEERROUTES=yesIPV4_FAILURE_FATAL=noIPV6INIT=noNAME=br-outDEVICE=br-outONBOOT=yesIPADDR=10.0.0.11NETMASK=255.255.255.0GATEWAY=10.0.0.1DNS1=10.0.0.1DNS2=114.114.114.114重启下网络# systemctl restart network物理网卡添加成功# brctl show br-outbridge name bridge id STP enabled interfacesbr-out 8000.000c2923e15d no eno167777360 |: W6 C J: ^* A
" n& L: @. B4 R0 J+ ~( k+ P! P& |
现在创建一对网卡,连接ns1和br-out . L* ?- z6 e0 o$ K( @
# ip link add net1-in type veth peer name net1-out# ifconfig net1-in up# ifconfig net1-out up# ip link set dev net1-in name eth1 netns ns1# brctl addif br-out net1-out# brctl show br-outbridge name bridge id STP enabled interfacesbr-out 8000.000c2923e15d no eno16777736 net1-out
5 L- Z- v7 Q; ^% Y
' c3 O7 ?) k4 w" {" O2 d% s2 u1 h我真实局域网的ip为10.0.0.0/24
6 O2 S- d* ?: z* @. n
" [1 d5 s/ ]: P因此添加到ns1中的eth1要配置到同网段 # ip netns exec ns1 ifconfig eth1 10.0.0.12 netmask 255.255.255.0 up
) G; z$ a; i+ K/ _+ \& f5 Y
% W7 `1 b! d. g/ T8 I( v; u能够到达网关了。5 ^2 O# \! Y; N6 I) E9 r* O
8 m2 A- _7 K" S+ F% E$ s( S" m+ K" O
已实现如下:
- ?$ k( T5 n- l+ }在ns1中添加源地址转换 # ip netns exec ns1 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 10.0.0.12# ip netns exec ns1 ip route default via 10.0.0.1/ S' o. N# F! g7 o$ T2 a" u( y
再次通过vm1 ping 公网ip
' @6 D# I+ r! u& L6 Q
& O$ K% Q, H1 k/ R. S r这样就实现了宿主机内部分网络中的主机可以访问公网,部分主机没有访问公网权限。
+ w0 t* P E! i' p总之,网络逻辑很重要。
/ Q' C( C* P+ y( `5 M2 ]7 y |