linux 路由网关问题
关于linux的默认网关
默认网关是一个用于 TCP/IP 协议的配置项,是一个可直接到达的 IP 路由器的 IP 地址。配置默认网关可以在 IP 路由表中创建一个默认路径。 一台主机可以有多个网关。默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关。 一台电脑的默认网关是不可以随随便便指定的,必须正确地指定,否则一台电脑就会将数据包发给不是网关的电脑,从而无法与其他网络的电脑通信。默认网关的设定有手动设置和自动设置两种方式。
linux装系统设IP,这应该是系统管理员的基本功,可是不同的网络结构有不同的ip设法。
1.一块网卡的情况
通过命令address,netmask,gateway然后netwok restart。
2.两块网卡的情况
1).一个网关的情况
这种情况也简单,一个网卡设一个ip,其中一个网卡不设置gateway就ok了。这样上网的时候走带网关的那边,这台机器还能和不带网关的那个网络通讯。这种情况在利用linux当路由器或者代理网关的时候比较常见。
2).两个网关的情况
这种情况相对复杂,复杂到两块网卡都不设置默认网关,这种情况发生在这台linux连接的两个网段都不是一个网段,就是通过连接的两个网段还可以访问其它的不同的网段。这种情况下,无论把gateway设到哪边,都会影响到另一个网段所连接的网段不能正常使用。这就是我今天最想表述的问题。在这种情况,如果你想连接多个网段,首先要在正确的网卡上设置正确的ip,剩下的工作就交给route来做了。利用route命令把能上网或者想通过那边上网的网关设置成默认网关,这样就解决了一个网段了。另一个段和它所连接的所有网段。就要一条一个的加路由了。示例:
默认网关:
route add default gw 224.224.224.224 eth0
加路由:
route add -net 192.168.115.0/24 gw 192.168.1.254 eth1
没有学习过路由知识的同学可能不大理解加路由为啥去115段的连接,要走1.254.这是因为,加路由的时候,指定下一跳,只指定和本机连接的那个网关:)
3).三个网卡的情况
和两个网卡类似。如果你的需求是,一个网段通过两个不同的网络上网,中间又夹着这么一个linux的话,个人觉得除了用iptables根据不同的ip地址划分不同的上网网络,似乎没有其它的解决办法。
了解windows下默认网关的配置,请阅读windows下双网卡双网关的设置
Linux 双网卡配置
linux 支持多网卡,有两种配置方式(以双网卡为例):
环境: 主机运行裁剪的嵌入式 linux,第三方主机为 PC
- 双网卡 + 不同网段 系统有两个网卡,分别属于不同的网段(比如网卡 A :192.168.0.11,网卡 B :192.168.1.22),大部分的多网卡系统都是使用的这种配置。这时的路由表基本如此:
default XiaoQiang 0.0.0.0 UG 600 0 0 wlo1
192.168.1.0 * 255.255.255.0 U 100 0 0 eno1
流量根据路由表选择流向不同的网卡。路由器就是这样实现的。
- 双网卡 + 同网段 如果两个网卡属于同一个网段(比如网卡 A :192.168.1.11,网卡 B :192.168.1.22)。这时系统的路由表还是有一个默认路由(比如流量都默认流向 wlo1 )。从表面上看,系统此时两个网卡都可以正常通信,但实际上还是有问题的。
- 假如默认路由为网卡 A ,此时从外界 Ping 192.168.1.11 和 192.168.1.22 都正常,但是如果此时拔掉网卡 A ,然后因为默认路由为 192.168.1.11 ,所以此时外界就不无法 Ping 通主机了,但是此时如果修改了默认路由或者使用 ifconfig 关闭网卡 A ,然后就可以恢复通信了。
- 两个网卡都在使用时,如果 ping 两个 IP (192.168.1.11 和 192.168.1.22),会发现,如果拔掉了非默认路由的网卡 B(192.168.1.22),再去 ping 192.168.1.22 ,仍然可以通信,并且在第三方主机检查 ARP 表,会发现 192.168.1.11 和 192.168.1.22 的 MAC 地址相同。
出现这种情况的原因就是因为第三方主机和本机通信时会使用默认路由,所以第三方主机 ARP 表上会把网卡 A 和 B 的 MAC 地址标识为网卡 A(默认路由)的 MAC 地址。要解决这个问题可以使用工具 iproute2
把两个网卡分到两个不同路由表。
echo "210 local100" >> /etc/iproute2/rt_tables
echo "220 local200" >> /etc/iproute2/rt_tables
ip route add 192.168.1.0/24 dev wlo0 src 192.168.1.11 table local100
ip route add 192.168.1.0/24 dev eno1 src 192.168.1.22 table local200
ip route add default dev wlo0 table local100
ip route add default dev eno1 table local200
ip rule add from 192.168.1.11 table local100
ip rule add from 192.168.1.22 table local200
ip route flush cache
然后第三方主机再于本机进行通信就会根据不同的 IP 选择了不同的网卡进行通信。此时系统会优先选择 table 数字最小的路由表来进行路由。假如此时拔掉网卡A ,则系统会自动选择网卡 B 作为新的路由出口。
双网口网卡作用
双网口网卡(Dual Network Interface Card,简称Dual NIC)是指一块网卡上集成了两个独立的网口,可以连接到两个不同的网络。它的作用有以下几个方面:
-
实现网络隔离:通过将服务器接入不同的网络,可以实现网络隔离,避免一些安全问题和性能问题。例如,将一台服务器的一个网口连接到公网,另一个网口连接到内网,可以实现外网访问服务器上的服务,同时内网的资源可以不暴露到公网上。
-
提高网络性能:通过使用双网口网卡,可以实现负载均衡和冗余备份,提高网络的可用性和性能。例如,将两个网口连接到不同的交换机上,可以实现负载均衡,将网络流量分担到两个网口上,提高网络的吞吐量。
-
实现虚拟化网络:通过使用虚拟化技术,可以将一个物理网卡分成多个虚拟网卡,并为每个虚拟网卡分配不同的网络地址。这样,可以实现多个虚拟机之间的互通,同时隔离不同虚拟机的网络流量。
总之,双网口网卡可以实现多种网络应用场景,如负载均衡、冗余备份、网络隔离、虚拟化等。它在服务器、防火墙、路由器等网络设备中广泛应用。
双网卡一般情况不能有两个网关
特别是别设内网网关,这样有段时间过后会出现访问不了外网情况
支持两个网关的方法倒是有
让双网卡一台电脑拥有两个网关(转)
首先要声明一点,双网卡一台电脑拥有两个网关是不可能的,因为默认网关(default gateway)只能是一个。
给服务器安装两块网卡,分别设置不同的ip和网关(内网和外网),外网的通过外网网卡来访问,内网的通过内网网卡来访问,似乎实现起来很简单,但事实上很难啊,因为默认网关(default gateway)只能是一个!
解决的办法就是:
1、将其中一块网卡(如外网)设置默认网关;
2、手工加上一条静态路由,让另一个网段(内网)的数据经过第二个网卡。使用route命令,命令的范例如下,希望能帮某些同志一点小忙。
参考命令:
范例1、route add -p 10.0.0.0 mask 255.255.255.0 10.40.4.200(让对10.0.0.1的访问走10.40.4.200的网卡,mask 后面是子网掩码)
范例2、route add -p 10.0.0.0 mask 255.0.0.0 10.40.4.200
范例3、route add -p 0.0.0.0 mask 0.0.0.0 10.40.4.200(不用说了吧,让所有的访问走10.40.4.200)
说明:
1、加上-p参数,加入的路由为永久路由,不会因为电脑重新启动而被初始化。10.40.4.200是我的电脑网卡IP。 输入route 可以得到更多的帮助。
2、如果你的电脑已经有两个网关(如使用了SoftEther),用route print可以看到两条0.0.0.0的路由,可以先删除0.0.0.0的路由,然后重新添加。
route delete 0.0.0.0 “删除所有0.0.0.0的路由”
附:在网络上找资料时,常常看到有人在问类似的问题,可以看出大家对路由方面的知识很陌生。于是提供以下资料,供大家参考:
1、《解读route命令》http://www.kpcn.org/news/Read.asp?NewsID=8527
2、《学习Windows网络命令之route命令小档案》http://www.kpcn.org/news/Read.asp?NewsID=8528
========= 以下是另一篇文章的内容 ============
经常遇到一台计算机要同时访问两个网络(一个是互联网,一个是企业内部网)的要求。以本单位为例:地址是虚构的^_^
机器有两块网卡,接到两台交换机上
internet地址:218.22.123.123,子网掩码:255.255.255.0,网关:218.22.123.254
企业内部网地址:10.128.123.123,子网掩码:255.255.255.0,网关:10.128.123.254
如果按正常的设置方法设置每块网卡的ip地址和网关,再cmd下使用route print查看时会看到
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 218.22.123.254 218.22.123.123 20
0.0.0.0 0.0.0.0 10.128.123.254 10.128.123.123 1
即指向0.0.0.0的有两个网关,这样就会出现路由冲突,两个网络都不能访问。要实现同时访问两个网络就要用到route命令
第一步:route delete 0.0.0.0 ”删除所有 0.0.0.0 的路由"
第二步:route add 0.0.0.0 mask 0.0.0.0 218.22.123.254 "添加 0.0.0.0 网络路由"
第三步:route add 10.0.0.0 mask 255.0.0.0 10.128.123.254 "添加 10.0.0.0 网络路由"
这时就可以同时访问两个网络了,但碰到一个问题,使用上述命令添加的路由在系统重新启动后会自动丢失,怎样保存现有的路由表呢?
在win2000 下可以使用route add -p 添加静态路由,即重启后,路由不会丢失。注意使用前要在tcp/ip设置里去掉接在企业内部网的网卡的网关。
============= Linux下双网卡双网关配置路由表 =============
http://hi.baidu.com/xibeihuohu/blog/item/a54d27fd18b8bf1f08244d1a.html
由于电信和网通之间互联互通的问题,很多人选择双线路机房, 所谓双线路机房就是拥有两条出口,一条电信一条网通。最近在一个双线路机房测试一台服务器,打算作为论坛的数据库服务器使用,服务器操作系统为 Linux。计划配置为双IP,双域名,使得浏览者通过电信和网通两条线路都能正常访问服务器,而且各走各的,互不影响。在配置网络的时候遇到了问题,由 于Linux默认只有一个网关,在网络上查询了很久,找到一个解决方案,因此整理了一下。感谢原文作者jac003ke。
服务器操作系统RedHat linux 9,设置两张路由表
1. vi /etc/iproute2/rt_tables,增加网通和电信两个路由表
251 tel 电信路由表
252 cnc 网通路由表
2. 给网卡绑定两个地址用于电信和网通两个线路
ip addr add 192.168.0.2/24 dev eth0
ip addr add 10.0.0.2/24 dev eth1
3、分别设置电信和网通的路由表
电信路由表:
#确保找到本地子网
ip route add 192.168.0..0/24 via 192.168.0.2 dev eth0 table tel
#内部回环网络
ip route add 127.0.0.0/8 dev lo table tel
#192.168.0.1为电信网络默认网关地址
ip route add default via 192.168.0.1 dev eth0 table tel
网通线路路由表:
#确保找到本地子网
ip route add 10.0.0.0/24 via 10.0.0.2 dev eth1 table cnc
#内部回环网络
ip route add 127.0.0.0/8 dev lo table cnc
#10.0.0.1是网通的默认网关
ip route add default via 10.0.0.1 dev eth1 table cnc
4、电信和网通各有自己的路由表,制定策略,让192.168.0.2的回应数据包走电信的路由表路由,10.0.0.2的回应数据包走网通的路由表路由
ip rule add from 192.168.0.1 table tel
ip rule add from 10.0.0.1 table cnc
配置双网卡的目的:
1、实现冗余
2、负载均衡
linux 主机安装双网卡,共享一个IP地址,对外提供访问,实际 同样 连接两条物理线路到交换机 实现平时 双网卡同时工作,分流网络压力,同时提供冗余备份,监控,防止物理线路的单点故障。
用于关键性节点服务器,高网络IO服务器,网络共享存储服务器等。。。。。
Linux bonding 驱动模块 提供了一种方法,用以把多个网络接口(network interface)组合成一个 逻辑的 "bonded" 接口。 Bonded 接口的工作方式取决于驱动的模式:不同的模式提供了热备份或负载均衡等不同的服 务。
此外,驱动还会监控链路的可用性。大多数目前发布的Linux内核都以模块(module)方式带了bonding驱动, ifenslave工具(主要配置工具)也都已经安装好。
• 轮询策略(round robin),mode=0,按照设备顺序依次传输数据包,提供负载均衡和容错能力 • 主备策略(active-backup),mode=1,只有主网卡处于工作状态,备网卡处于备用状态,主网卡坏掉后备网卡开始工作,提供容错能力 • 异或策略(load balancing (xor)),mode=2,根据源MAC地址和目的MAC地址进行异或计算的结果来选择传输设备,提供负载均衡和容错能力 • 广播策略(fault-tolerance (broadcast)),mode=3,将所有数据包传输给所有接口通过全部设备来传输所有数据,一个报文会复制两份通过bond下的两个网卡分别发送出去,提供高容错能力 • 动态链接聚合(lacp),mode=4,按照802.3ad协议的聚合自动配置来共享相同的传输速度,网卡带宽最高可以翻倍,链路聚合控制协议(LACP)自动通知交换机聚合哪些端口,需要交换机支持 802.3ad协议,提供容错能力 • 输出负载均衡模式(transmit load balancing),mode=5,输出负载均衡模式,只有输出实现负载均衡,输入数据时则只选定其中一块网卡接收,需要网卡和驱动支持ethtool命令 输入/输出负载均衡模式(adaptive load balancing),mode=6,输入和输出都实现负载均衡,需要网卡和驱动支持ethtool命令
CentOS双网卡绑定,实现负载均衡
bind0 IP 地址: 192.168.10.54
先关闭两张网卡
先关闭两张网卡
[root@uplooking ~]# ifdown ens33
[root@uplooking ~]# ifdown ens38
新建网卡配置文件
[root@uplooking /etc/sysconfig/network-scripts]#vim ifcfg-bond0
ifcfg-bond0 配置文件
TYPE=Ethernet
BOOTPROTO=static
NAME=bond0
DEVICE=bond0
IPADDR="192.168.10.54"
NETMASK=255.255.255.0
GATEWAY=192.168.10.2
ONBOOT=yes
BONDING_OPTS="miimon=100 mode=6" ##bonding 参数直接在网卡配置文件中指派,并且开机可以自动生效
\## mode=1 1为储备模式, 推荐为 6 ,不会浪费资源。
ifcfg-ens33 配置文件
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
MASTER=bond0
SLAVE=yes
ifcfg-ens38 配置文件
TYPE=Ethernet
BOOTPROTO=none
NAME=ens38
DEVICE=ens38
ONBOOT=yes
MASTER=bond0
SLAVE=yes
修改/etc/modprobe.d/dist.conf文件
在此文件中添加以下内容:
![img](https://ask.qcloudimg.com/http-save/yehe-1443828/8aa457595848b934f87ce972ebc1fe07.png)
alias bond0 bonding,表示系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0
miimon=100,表示系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线
mode=1,表示绑定模式为1
primary=eth0,系统首先eth0作为bond0接口与外界信息的传输接口
修改配置文件/etc/rc.local
在此文件中添加以下内容:
![img](https://ask.qcloudimg.com/http-save/yehe-1443828/3194cfd7252be46e2f30c15afdd782d5.png)
modprobe bonding miimon=100 mode=1
重启网络
systemctl restart network
观察验证:
[root@uplooking ~]# ifconfig
![img](https://ask.qcloudimg.com/http-save/yehe-1443828/f652b46a07f71eeee8b4c0da3cc51591.png)
查看 bind0 的状态
ip addr 或者 ifconfig
### 状态信息验证
cat /proc/net/bonding/bond0
文件可以显示 双网卡 配置信息。 ens 33 和 ens 38 的 启用状态。
通过查阅该文件,获取bond0 网卡的工作状态信息
通过断开不同网卡,观察改文件的信息变化。
[root@server-18 ~]# watch -n 1 "cat /proc/net/bonding/bond0"
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: ens37
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: ens33
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 3
Permanent HW addr: 00:0c:29:e6:3b:9d
Slave queue ID: 0
Slave Interface: ens38
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 3
Permanent HW addr: 00:0c:29:e6:3b:a7
验证负载均衡的效果:
http-02 ping 192.168.10.54 arp -a 查询 arp 表:发现 192.168.10.54 在 00:0C:29:58:4C:31 (ens33) 网卡上
![img](https://ask.qcloudimg.com/http-save/yehe-1443828/57d6cdc9847a1c03358743130cd0985a.png)
http-03 ping 192.168.10.54 arp -a 查询 arp 表:发现 192.168.10.54 在 00:0C:29:58:4C:3B (ens33) 网卡上
![img](https://ask.qcloudimg.com/http-save/yehe-1443828/4f801fba860386b32490ba68948e153a.png)
取消 bond0 网卡的方法
1、ifdown bond0 ##此时网络断开 2、移除ifcfg-bond0 网卡的配置文件,建议不要直接删除,而是移到别的位置,备份起来、 [root@server-18 /etc/sysconfig/network-scripts]#mv ifcfg-bond0 /root
echo -bond0 > /sys/class/net/bonding_masters ## 移除系统中的 bonding状态。
3、修改 ens33 ens38 网卡配置,解除 与 bond0 网卡的从属关系 BOOTPROTO=static MASTER=bond0 去掉 SLAVE=yes 去掉 加上自己网卡的原先配置。 4、 systemctl restart network 5、 ifconfig再次观察
参考:
https://www.eumz.com/2012-05/248.html
https://www.eumz.com/2012-05/251.html
https://oska874.github.io/%E9%97%AE%E9%A2%98/Linux%E5%8F%8C%E7%BD%91%E5%8D%A1%E9%85%8D%E7%BD%AE.html
https://juejin.cn/s/%E5%8F%8C%E7%BD%91%E5%8F%A3%E7%BD%91%E5%8D%A1%E4%BD%9C%E7%94%A8
https://www.cnblogs.com/visionfeng/p/5825078.html
https://cloud.tencent.com/developer/article/1923889