0%

route命令

route命令

route命令用来显示并设置Linux内核中的网络路由表route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。

在Linux系统中设置路由通常是为了解决以下问题:

  • 该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机器的默认路由。
  • 直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了
  • 可以在/etc/rc.local中添加route命令来保证该路由设置永久有效,这个方法只能在重启电脑的时候生效,重启网络不生效;
  • 推荐在/etc/sysconfig/static-routes编写路由,重启网络或服务器都能生效;
# vim /etc/sysconfig/static-routes
# 这个文件默认不存在
any net 192.168.11.0 gw 192.168.21.1 netmask 255.255.255.0 metric 1 dev eth0

注意,如果本机安装了docker,添加路由后重启网络,会导致docker服务启动添加的路由失效,导致docker服务调用失败,创建新的docker服务会报以下错误,重启docker服务可以解决。systemctl restart docker

[root@localhost ~]# docker run -d -p 9000:80 centos:httpd /bin/sh -c /usr/local/bin/start.sh
d5b2bd5a7bc4895a973fe61efd051847047d26385f65c278aaa09e4fa31c4d76
docker: Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen (6bda693d1143657e46bee0300276aa05820da2b21a3d89441e820d1a274c48b6): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).

route语法

# 设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:
route  [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
  1. 方法
方法 说明
add 增加指定的路由记录;
del 删除指定的路由记录;
target 目的网络或目的主机;
gw 设置默认网关;
mss 设置TCP的最大区块长度(MSS),单位MB;
netmask 目的地址的网络掩码
window 指定通过路由表的TCP连接的TCP窗口大小;
dev 路由记录所表示的网络接口。
  1. 选项
选项 说明
-A 设置地址类型;
-C 打印将Linux核心的路由缓存;
-v 详细信息模式;
-n 不执行DNS反向查找,直接显示数字形式的IP地址;
-e netstat格式显示路由表;
-net 到一个网络的路由表;
-host 到一个主机的路由表。
  1. Flags标志说明
flag 说明
U Up表示此路由当前为启动状态。
H Host,表示此网关为一主机。
G Gateway,表示此网关为一路由器。
R Reinstate Route,使用动态路由重新初始化的路由。
D Dynamically,此路由是动态性地写入。
M Modified,此路由是由路由守护程序或导向器动态修改。
! 表示此路由当前为关闭状态。
  1. route命令输出说明
输出列 说明
Destination 目标网段或者主机
Gateway 网关地址,*表示目标是本主机所属的网络,不需要路由
Genmask 网络掩码
Flags 标记。
Metric 路由距离,到达指定网络所需的中转数
Ref 路由项引用次数
Use 此路由项被路由软件查找的次数
Iface 该路由表项对应的输出接口

示例

# 显示当前路由
[root@node1 ~]# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 ens33
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-caa257c6f76d
192.168.41.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@node1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.41.2    0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-caa257c6f76d
192.168.41.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
# 增加一条到达244.0.0.0的路由。
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

# 添加到主机的路由
route add -host 192.168.1.2 dev eth0
# 添加到10.20.30.148的网关
route add -host 10.20.30.148 gw 10.20.30.40
# 添加10.20.30.40的网络
route add -net 10.20.30.40 netmask 255.255.255.248 eth0
# 网络掩码 255.255.255.0简写
route add -net 192.168.1.0/24 eth1
# 增加一条屏蔽的路由,目的地址为224.x.x.x将被拒绝。
route add -net 224.0.0.0 netmask 240.0.0.0 reject
# 删除路由记录
route del -net 224.0.0.0 netmask 240.0.0.0
route del -net 224.0.0.0 netmask 240.0.0.0 reject
# 删除和添加设置默认网关
route del default gw 192.168.120.240
route add default gw 192.168.120.240

设置包转发

CentOS 中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能。开启 Linux 的路由功能可以通过调整内核的网络参数来实现。要配置和调整内核参数可以使用 sysctl 命令。例如:要开启 Linux 内核的数据包转发功能可以使用如下的命令。

sysctl -w net.ipv4.ip_forward=1

这样设置之后,当前系统就能实现包转发,但下次启动计算机时将失效。为了使在下次启动计算机时仍然有效,需要将下面的行写入配置文件/etc/sysctl.conf

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 或者 使用下面的命令
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
# 使上面配置生效
sysctl -p 

用户还可以使用如下的命令查看当前系统是否支持包转发。

sysctl net.ipv4.ip_forward

# 或者下面命令 输出1 证明已生效
cat /proc/sys/net/ipv4/ip_forward

iptables SNAT/DNAT服务

  • SNAT : source network address translation, 修改网络包源IP
  • DNAT : destination network address translation, 修改网络包目的IP
  • 修改源IP目的是这个包还能返回到自己这里,在iptables中,SNAT是在出口POSTROUTING链中发挥作用
  • 修改目的IP目的是这个包能够发送出去,让包传递下去,在iptables中,DNAT是在入口PREROUTING链中发挥作用,以便让包进入FORWARD表.

iptables SNAT/DNAT服务使用场景

  • 云上虚拟机作为客户端访问外网服务器, SNAT类似于代理的作用, 客户端通过SNAT服务可以访问外网.
  • 云上虚拟机作为服务端为外网提供服务, DNAT类似于反向代理, 外网请求通过DNAT服务可以将包传到内网服务端.

SNAT/DNAT

lsmod|grep ^ip #查看nat模块
# 载入:modprobe iptable-nat
# 开启上网命令
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 192.168.1.202
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 192.168.1.202

# 确认查看
iptables -t nat -nL