系统实现路由转发功能

系统实现路由转发功能

0.前言

  这里主要尝试实现在两个虚拟机系统中,一台虚拟机通过另外一台虚拟机当作网关来上网的功能(网关虚拟机下面简称为R,客户端虚拟机下面简称C)

1.编辑网卡

  首先需要设置一个自定义的内网网卡模式,让虚拟机C只有内网的连接,进入VM界面,点击编辑进入虚拟网络编辑界面

  点击添加网络,添加出VMnet2,设置为仅主机模式,子网ip这里设置为192.168.32.0,子网掩码是255.255.255.0

2.设置网卡

  首先建立两个虚拟机

  虚拟机R为网卡代理虚拟机,虚拟机C为客户端,点击虚拟机R进行虚拟机设置

  点击网络适配器,连接外网,设置为桥接模式或者是nat模式,这里都无所谓,能上网即可,网卡2连接为内网,设置为自定义,选择3.1所编辑好的VMnet2

  上面已经设置好虚拟机R的相关网卡设置,接下来就是客户主机的网卡连接内网,同样的选择对应的虚拟机C,点击编辑虚拟机设置,将网络适配器改为配好的内网VMnet2

3. ip配置

  通过3.2的步骤,我们已经成功实现了对于两台虚拟机的网卡部署和相关配制,接下里就是检验网卡的配置ip情况

  首先在虚拟机R中执行ifconfig命令

  可以看到在虚拟机R的ip网卡中,ens33网卡的ip地址为192.168.70.173(这里需要提及一下,由于不习惯使用桥接模式,最终还是改为了nat模式进行连接),ens37网卡的ip地址未192.168.32.131,这说明我们虚拟机R的设置成功了

  接下来使用ping指令检查能否上网:

  发送数据包成功,显然能够上网,接下来查看虚拟机C的配置情况

  可以看到在虚拟机C的ip网卡中,ens33网卡的ip地址为192.168.32.128,这说明我们虚拟机C的设置成功了

  接下来依旧是使用ping指令检查能否上网:

  显然是无连接的,这前期的ip搭建基本完毕了

4.配置客户端网关和DNS

  由于我们需要从客户端传过网关ip进行上网操作,所以这里客户端需要将网关配置为虚拟机R知道内网网卡ip地址,dns配置为114.114.114.114,首先是配置DNS

1
2
vim   /etc/resolv.conf
nameserver 114.114.114.114

  接下来配置网关,配置的忘光有两种做法,一种是临时的做法,使用route命令:

1
route add default gw 192.168.32.131 dev ens33

  该指令就是将网关修改为192.168.32.131,但是这种修改是具有临时性的,当虚拟机重新启动或者网卡重新启动时,网关依旧会变更为原来的默认网关,还有一种做法就是永久性修改,修改/etc/sysconfig/ network-scripts/ifcfg-ens33文件(就是你对应的网卡文件,我这里是ens33)

1
2
vim  /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.32.131 #设置本机连接的网关的IP地址

  按照实际情况加入网关主机的内网网卡ip地址即可

5.设置路由转发

  这里的设置比较简单,就是打开相关的sysctl.conf文件,加入一行代码并执行即可:

1
2
3
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

  首先对于sysctl.conf,该文件包含了Linux系统的内核参数配置,net.ipv4.ip_forward = 1表示启用IPv4的IP转发功能,最后使用sysctl –p进行重新加载sysctl.conf文件中的配置,以使更改生效。执行该命令后,系统会自动应用新的内核参数配置,包括启用IP转发功能。启用IP转发功能后,Linux系统可以将收到的数据包转发到其他网络中。这也就是我们设置成网关主机中重要的一步

6.使用iptable设置转发

1
2
iptables -t nat -A POSTROUTING -o ens33 -j  MASQUERADE 
iptables -A FORWARD -i ens37 -j ACCEPT

  前一个命令会在iptables的nat表中添加一条POSTROUTING规则,用于对从ens33网卡出去的数据包进行NAT转换。具体来说,-o ens33表示匹配输出接口为ens33的数据包,-j MASQUERADE表示将源IP地址替换为本机的IP地址,并且动态分配端口号。这样可以实现网关的功能,后一个命令会在iptables的filter表中添加一条FORWARD规则,用于允许从ens37网卡进入的数据包通过Linux系统进行转发。具体来说,-i ens37表示匹配输入接口为ens37的数据包,-j ACCEPT表示允许这些数据包通过。

  设置完毕后,客户端的虚拟机C就可以上网了

  使用ping的功能ping下百度,可恶,还是失败了,通过思考,大抵每一步都没有出错,除了对于网关的配置,网上的永久配置教学不一,有的是修改network文件,有的要求是修改对应网卡的配置文件,都有道理,我选择后者失败了,首先进行排错,这里采用暂时性的网关配置,也就是前面提到的:

1
route add default gw 192.168.32.131 dev ens33

  果然是网关的问题,使用暂时性的网关修改就已经能实现一台虚拟机通过另外一台虚拟机当作网关来上网的功能,但是对于永久网关的修改之前都是通过可视化界面进行依旧修改的,用过几次命令行的修改,但我的印象里应该是可以直接通过vim /etc/sysconfig/network-scripts/ifcfg-ens33修改网关的,首先重启客户端,取消掉网关的临时修改,重新配置

1
2
vim  /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.32.131 #设置本机连接的网关的IP地址

  在这个过程中发现在reconf中输入DNS后重启还是会被消掉DNS的配置,所以这里直接写入ifcig文件中会方便很多,可以用这几个命令进行检查

1
2
ip route show dev ens33
nmcli dev show ens33 | grep DNS

  可以发现我们的dns是配置成功了,但是网关还是配置失败了


系统实现路由转发功能
https://one-null-pointer.github.io/2023/06/20/Linux运维——linux系统实现路由转发功能/
Author
liaoyue
Posted on
June 20, 2023
传送口