linux IP命令小结

ip 命令管理的功能很多, 和 network namespace 有关的操作都是在子命令ip netns 下进行的,可以通过 ``ip netns help` 查看所有操作的帮助信息。
检查网卡信息
检查网卡的诸如 IP 地址,子网等网络信息,使用ip addr show命令(简写 ip a s):
[root@test01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.60/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9b:7bdc/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
[root@test01 ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.60/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9b:7bdc/64 scope link
valid_lft forever preferred_lft forever
启用/禁用网口
使用ip命令来启用一个被禁用的网口:
[root@test01 ~]# ip link set ens37 up
[root@test01 ~]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fe9b:7be6/64 scope link
valid_lft forever preferred_lft forever
使用ip命令来禁用一个被启用的网口:
[root@test01 ~]# ip link set ens37 down
[root@test01 ~]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
为网卡分配 IP 地址以及其他网络信息
要为网卡分配 IP 地址,我们使用下面命令:
[root@test01 ~]# ip link set ens37 up
[root@test01 ~]# ip addr add 192.168.0.50/255.255.255.0 dev ens37
[root@test01 ~]# ip s ens37
Object “s” is unknown, try “ip help”.
[root@test01 ~]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.50/24 scope global ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9b:7be6/64 scope link
valid_lft forever preferred_lft forever
删除网卡中配置的 IP 地址
若想从网卡中删掉某个 IP,使用如下ip命令:
[root@test01 ~]# ip addr del 192.168.0.50/24 dev ens37
[root@test01 ~]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fe9b:7be6/64 scope link
valid_lft forever preferred_lft forever
为网卡添加别名(假设网卡名为 ens37)
添加别名,即为网卡添加不止一个 IP,执行下面命令
[root@test01 ~]# ip addr add 192.168.0.50/24 dev ens37
[root@test01 ~]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.50/24 scope global ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9b:7be6/64 scope link
valid_lft forever preferred_lft forever
[root@test01 ~]# ip addr add 192.168.0.20/24 dev ens37 label ens37:1
[root@test01 ~]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.50/24 scope global ens37
valid_lft forever preferred_lft forever
inet 192.168.0.20/24 scope global secondary ens37:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9b:7be6/64 scope link
valid_lft forever preferred_lft forever
检查路由/默认网关的信息
查看路由信息会给我们显示数据包到达目的地的路由路径。要查看网络路由信息,使用ip route show命令(简写 ip r):
[root@test01 ~]# ip r
default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
192.168.0.0/24 dev ens37 proto kernel scope link src 192.168.0.50
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.60
在上面输出结果中,我们能够看到所有网口的ip地址和路由信息
添加静态路由
我们也可以使用 IP 来修改数据包的默认路由。方法是使用ip route命令:
[root@test01 ~]# ip r
default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
169.254.0.0/16 dev ens37 scope link metric 1003
192.168.0.0/24 dev ens37 proto kernel scope link src 192.168.0.50
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.60
[root@test01 ~]# ip r
route rule
[root@test01 ~]# ip route add 192.168.2.0/24 via 192.168.0.1 dev ens37
[root@test01 ~]# ip r
default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
169.254.0.0/16 dev ens37 scope link metric 1003
192.168.0.0/24 dev ens37 proto kernel scope link src 192.168.0.50
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.60
192.168.2.0/24 via 192.168.0.1 dev ens37
删除默认路由
要删除之前设置的默认路由,打开终端然后运行:
[root@test01 ~]# ip route del 192.168.2.0/24
[root@test01 ~]# ip r
default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
169.254.0.0/16 dev ens37 scope link metric 1003
192.168.0.0/24 dev ens37 proto kernel scope link src 192.168.0.50
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.60
用上面方法修改的默认路由只是临时有效的,在系统重启后所有的改动都会丢失。要永久修改路由,需要修改或创建route-ens37文件
[root@test01 ~]# ip r
default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
169.254.0.0/16 dev ens37 scope link metric 1003
192.168.0.0/24 dev ens37 proto kernel scope link src 192.168.0.50
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.60
[root@test01 ~]# cat /etc/sysconfig/network-scripts/route-ens37
192.168.2.0/24 via 192.168.0.1 dev ens37
[root@test01 ~]# systemctl restart network
[root@test01 ~]# ip r
default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
169.254.0.0/16 dev ens37 scope link metric 1003
192.168.0.0/24 dev ens37 proto kernel scope link src 192.168.0.50
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.60
192.168.2.0/24 via 192.168.0.1 dev ens37
检查所有的 ARP 记录
ARP,是地址解析协议Address Resolution Protocol的缩写,用于将 IP 地址转换为物理地址(也就是 MAC 地址)。所有的 IP 和其对应的 MAC 明细都存储在一张表中,这张表叫做 ARP 缓存。
要查看 ARP 缓存中的记录,即连接到局域网中设备的 MAC 地址,则使用如下 ip 命令:
[root@test01 ~]# ip neigh
fe80::1 dev ens33 lladdr 9c:e3:74:69:67:19 router STALE
192.168.1.1 dev ens33 lladdr 9c:e3:74:69:67:19 REACHABLE
192.168.1.37 dev ens33 lladdr 78:2b:cb:9c:0b:e6 REACHABLE
修改 ARP 记录
删除 ARP 记录的命令为:
[root@test01 ~]# ip neigh del 192.168.1.37 dev ens33
[root@test01 ~]# ip neigh
fe80::1 dev ens33 lladdr 9c:e3:74:69:67:19 router STALE
192.168.1.1 dev ens33 lladdr 9c:e3:74:69:67:19 REACHABLE
192.168.1.37 dev ens33 lladdr 78:2b:cb:9c:0b:e6 REACHABLE
查看网络统计信息
通过ip命令还能查看网络的统计信息,比如所有网卡上传输的字节数和报文数,错误或丢弃的报文数等。使用ip -s link命令来查看:
[root@test01 ~]# ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
594 6 0 0 0 0
TX: bytes packets errors dropped carrier collsns
594 6 0 0 0 0
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:9b:7b:dc brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
79320 816 0 0 0 0
TX: bytes packets errors dropped carrier collsns
110247 681 0 0 0 0
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
13404 209 0 0 0 0
TX: bytes packets errors dropped carrier collsns
2016 28 0 0 0 0
更改网口名称,可以使用命令ip link set ens37 name eth0。要在网口down的状态下更改
[root@test01 ~]# ip link set ens37 name eth0
RTNETLINK answers: Device or resource busy
[root@test01 ~]# ip link set ens37 down
[root@test01 ~]# ip link set ens37 name eth0
[root@test01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9b:7b:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.60/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9b:7bdc/64 scope link
valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether 00:0c:29:9b:7b:e6 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.50/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
获取帮助
若你想查看某个上面例子中没有的选项,那么你可以查看帮助。事实上对任何命令你都可以寻求帮助。要列出ip命令的所有可选项,执行ip help:
[root@test01 ~]# ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | macsec | tcp_metrics | token }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] }

默认情况下,使用 ip netns 是没有网络 namespace 的,所以 ip netns ls 命令看不到任何输出。
[root@localhost ~]# ip netns help
Usage: ip netns list
ip netns add NAME
ip netns delete NAME
ip netns identify PID
ip netns pids NAME
ip netns exec NAME cmd …
ip netns monitor
[root@localhost ~]# ip netns ls
创建 network namespace 也非常简单,直接使用 ip netns add 后面跟着要创建的 namespace 名称。如果相同名字的 namespace 已经存在,命令会报Cannot create namespace 的错误。
[root@localhost ~]# ip netns add net1
[root@localhost ~]# ip netns ls
net1
ip netns 命令创建的 network namespace 会出现在 /var/run/netns/ 目录下,如果需要管理其他不是 ip netns 创建的 network namespace,只要在这个目录下创建一个指向对应 network namespace 文件的链接就行。
netns可以让一台机器上模拟多个网络设备,是网络虚拟化的重要组成,将不同类型的网络应用隔离。
一个net namespace有自己独立的路由表,iptables策略,设备管理。说来说去,它就是用来隔离的。比如将eth0加入了netns 1,那么netns 2中的应用程序就找不到eth0了。netns 1中的iptables策略,不会去影响netns 2中的iptables策略。
netns的用法
[root@monitor ~]# ip netns help list
Usage: ip netns list
ip netns add NAME
ip netns set NAME NETNSID
ip [-all] netns delete [NAME]
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd …
ip netns monitor
ip netns list-id
先打开内核的网络转发功能。
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
添加两个namespace
[root@monitor ~]# ip netns add r1
[root@monitor ~]# ip netns add r2
[root@monitor ~]# ip netns list
r2
r1
查看r1的网络。
[root@monitor ~]# ip netns exec r1 ifconfig -a
lo: flags=8 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
为r1的回环接口添加一个ip地址。
[root@monitor ~]# ip netns exec r1 ifconfig lo 127.0.0.1 up
[root@monitor ~]# ip netns exec r1 ifconfig -a
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
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
此时的r2并没有地址,因为他们是被隔离的
在网络名称空间上添加一对网卡,一个在r1,一个在r2.
[root@localhost ~]# ip link add veth1.1 type veth peer name veth1.2
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br-ex state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:4b:bb:d0 brd ff:ff:ff:ff:ff:ff
3: br-ex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
link/ether 00:0c:29:4b:bb:d0 brd ff:ff:ff:ff:ff:ff
4: br-in: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
link/ether 56:8d:9f:d2:96:21 brd ff:ff:ff:ff:ff:ff
5: [email protected]: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 7e:ea:fe:98:30:cd brd ff:ff:ff:ff:ff:ff
6: [email protected]: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether a2:48:54:92:c2:ed brd ff:ff:ff:ff:ff:ff
[root@localhost ~]#
将一对网卡分别添加给2个名称空间。
[root@localhost ~]# ip link set veth1.1 netns r1
[root@localhost ~]# ip link set veth1.2 netns r2
查看r1的网络信息
[root@localhost ~]# ip netns exec r1 ifconfig -a
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
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
veth1.1: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether a2:48:54:92:c2:ed 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
给r1的veth1.1改个名字,为eth0
[root@localhost ~]# ip netns exec r1 ip link set veth1.1 name eth0
为两个网卡添加ip地址。
[root@localhost ~]# ip netns exec r1 ifconfig eth0 10.0.1.1/24 up
[root@localhost ~]# ip netns exec r2 ifconfig eth0 10.0.1.2/24 up
ping功能
[root@localhost ~]# ip netns exec r1 ping 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 10.0.1.2: icmp_seq=3 ttl=64 time=0.043 ms
^C
— 10.0.1.2 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.036/0.040/0.043/0.006 ms

到目前为止,看吧,此时就好像创建了两个虚拟机一样。两个网络是互相独立的。但是在一个网段内的时候,又可以互相联通。
现在利用netns来创建1个虚拟网络空间。大致内容如下图。

创建桥接
[root@localhost ~]# brctl addbr br-ex
[root@localhost ~]# ip link set br-ex up
[root@localhost ~]# ifconfig
br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 1e:d6:fd:9b:2a:fc txqueuelen 0 (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
给桥设备添加IP地址。
# ip addr del 192.168.217.71/24 dev eno16777736
# ip addr add 192.168.217.71/24 dev br-ex
# brctl addif br-ex eno16777736
再添加一个桥
[root@localhost ~]# brctl addbr br-in
[root@localhost ~]# ip link set br-in up
[root@localhost ~]#
测试两个虚拟机之间的网络互通性。
首先先写一个脚本,自动桥接的。(/etc/qemu-ifup)
#!/bin/bash

bridge=br-in
 
if [ -n "$1" ];then
        ip link set $1 up
        brctl addif $bridge $1
        [ $? -eq 0 ] && exit 0 || exit 1
else
        echo 'Error: no interface specified'
        exit 1
fi

启动一个虚拟机实例(cirros)
[root@localhost ~]# qemu-kvm -m 256 -smp 1 -name vm2
> -drive file=/images/cirros/test2.qcow2,if=virtio,media=disk
> -net nic,macaddr=52:54:00:aa:bb:dd
> -net tap,ifname=vif2.0,script=/etc/qemu-ifup
> --nographic
再启动一个 vm1.
在真机上查看桥接状态。
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br-ex 8000.000c294bbbd0 no eno16777736
br-in 8000.0e1d0f339fc2 no vif1.0
vif2.0
vif1.0 和vif2.0都是桥接在br-in上了。
好了,现在的情况相当于是vm1,vm2在一个交换机上。这个交换机就是br-in。为了这两个vm虚拟机可以和外界通信,必须要再创建一个虚拟的路由器。删去刚才的r1,r2。
添加路由器R1.
[root@localhost ~]# ip netns add r1
为路由器R1添加一对网卡并且启动。
[root@localhost ~]# ip link add rinr type veth peer name rins
[root@localhost ~]# ip link set rinr up
[root@localhost ~]# ip link set rins up
将网卡添加到桥上去。
[root@localhost ~]# brctl addif br-in rins
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br-ex 8000.000c294bbbd0 no eno16777736
br-in 8000.0e1d0f339fc2 no rins
vif1.0
vif2.0

给rinr改个名字,并且启动
[root@localhost ~]# ip link set rinr netns r1 #将网卡rinr添加至r1
[root@localhost ~]# ip netns exec r1 ip link set rinr name eth0
[root@localhost ~]# ip netns exec r1 ip link set eth0 up
添加一个IP,作为网关。
[root@localhost ~]# ip netns exec r1 ifconfig eth0 10.0.1.254/24 up
[root@localhost ~]# ip netns exec r1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.1.254 netmask 255.255.255.0 broadcast 10.0.1.255
inet6 fe80::f8b4:bff:fee4:b12d prefixlen 64 scopeid 0x20
ether fa:b4:0b:e4:b1:2d txqueuelen 1000 (Ethernet)
RX packets 8 bytes 648 (648.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16 bytes 1296 (1.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
两个虚拟机的网关都指向10.0.1.254
$ sudo su -
# ifconfig eth0 10.0.1.2/24 up
# route add default gw 10.0.1.254
目前来说整幅图的左半边完全好了。
开始右半边。
添加一对网卡,再把其中一个桥接
[root@localhost ~]# ip link add rexr type veth peer name rexs
[root@localhost ~]# brctl addif br-ex rexs
[root@localhost ~]# ip link set rexs up
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br-ex 8000.000c294bbbd0 no eno16777736
rexs
br-in 8000.0e1d0f339fc2 no rins
vif1.0
vif2.0
将另一个网卡添加到路由器的另一边,且给个另一个网络的地址
[root@localhost ~]# ip link set rexr netns r1
[root@localhost ~]# ip netns exec r1 ip link set rexr name eth1
[root@localhost ~]# ip netns exec r1 ifconfig eth1 192.168.217.77/24 up
利用防火墙的源地址转换,实现将内网中的地址转换。
[root@localhost ~]# ip netns exec r1 iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! -d 10.0.1.0/24 -j SNAT --to-source 192.168.217.77
[root@localhost ~]# ip netns exec r1 iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain POSTROUTING (policy ACCEPT)

测试。vm1可以ping同vm2.vm1可以访问真机所在局域网的主机。
# hostname
cirros
# ping 10.0.1.1
PING 10.0.1.1 (10.0.1.1): 56 data bytes
64 bytes from 10.0.1.1: seq=0 ttl=64 time=4.612 ms
# ping 192.168.217.2
PING 192.168.217.2 (192.168.217.2): 56 data bytes
64 bytes from 192.168.217.2: seq=0 ttl=127 time=4.742 ms

target prot opt source destination SNAT all -- 10.0.1.0/24 !10.0.1.0/24 to:192.168.217.77

当然。在左边那个网络中,还可以运行一个dhcp服务器,并且将网关自动指向10.0.1.254。
[root@localhost ~]# yum -y install dnsmasq
执行命令
[root@localhost ~]# ip netns exec r1 dnsmasq -F 10.0.1.1,10.0.1.30 --dhcp-option=option:router,10.0.1.254

猜你喜欢

转载自blog.csdn.net/seaship/article/details/88838951
今日推荐