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]
- 方法
方法 | 说明 |
---|---|
add | 增加指定的路由记录; |
del | 删除指定的路由记录; |
target | 目的网络或目的主机; |
gw | 设置默认网关; |
mss | 设置TCP的最大区块长度(MSS),单位MB; |
netmask | 目的地址的网络掩码 |
window | 指定通过路由表的TCP连接的TCP窗口大小; |
dev | 路由记录所表示的网络接口。 |
- 选项
选项 | 说明 |
---|---|
-A | 设置地址类型; |
-C | 打印将Linux核心的路由缓存; |
-v | 详细信息模式; |
-n | 不执行DNS反向查找,直接显示数字形式的IP地址; |
-e | netstat格式显示路由表; |
-net | 到一个网络的路由表; |
-host | 到一个主机的路由表。 |
- Flags标志说明
flag | 说明 |
---|---|
U | Up表示此路由当前为启动状态。 |
H | Host,表示此网关为一主机。 |
G | Gateway,表示此网关为一路由器。 |
R | Reinstate Route,使用动态路由重新初始化的路由。 |
D | Dynamically,此路由是动态性地写入。 |
M | Modified,此路由是由路由守护程序或导向器动态修改。 |
! | 表示此路由当前为关闭状态。 |
- 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
, 修改网络包源IPDNAT
:destination network address translation
, 修改网络包目的IP- 修改源IP目的是这个包还能返回到自己这里,在
iptables
中,SNAT是在出口POSTROUTING
链中发挥作用 - 修改目的IP目的是这个包能够发送出去,让包传递下去,在
iptables
中,DNAT是在入口PREROUTING
链中发挥作用,以便让包进入FORWARD
表.
iptables SNAT/DNAT服务使用场景
- 云上虚拟机作为客户端访问外网服务器,
SNAT
类似于代理的作用, 客户端通过SNAT
服务可以访问外网. - 云上虚拟机作为服务端为外网提供服务,
DNAT
类似于反向代理, 外网请求通过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