Linux 默认带有 ip forward 功能,只不过因为各种原因,默认的配置把该功能关闭了。本文通过 demo 来演示 Linux 的 ip forward 功能,具体场景为:开启 Linux 的 ip forward 功能,让 Linux 称为具有路由能力的主机,从而支持在两个局域网之间转发数据包。演示环境的网络结构如下图所示:

本示例的演示环境为 Vmware Workstation,三台虚机的操作系统均为 Ubuntu 16.04。

配置虚机 computer1 的网卡

添加一个新的 network adapter(可以理解为虚机添加了一块网卡),并选择网络连接方式为 "Custom:Specific virtual network",笔者选择的虚拟交换机为 VMnet10:

应用上面的配置后,通过 ip addr 命令查看,笔者的虚机中多出了一个名为 ens38 的网卡:

下面我们来配置 ens38 的 IP 信息,打开并编辑 /etc/network/interfaces 文件,添加下面的内容:

auto ens38
iface ens38 inet static
address 192.168.1.5
netmask 255.255.255.0

保存上面的文件,然后重启 networking 服务:

$ sudo systemctl restart networking

然后就可以看到 ens38 被分配了 IP 192.168.1.5:

配置虚机 computer2 的网卡

和虚机 computer1 相同,我们也为虚机 computer2 添加一块虚拟网卡,需要注意的是,请选择一个不同的虚拟交换机(笔者选择的是 VMnet11):

笔者系统中新的网卡名称也是 ens38,以同样的方式设置该网卡的 IP 为 192.168.2.5,具体过程不再赘述:

配置 linux router 的网卡

为虚拟机 linux router 添加网卡,连接到虚拟交换机 VMnet10:

通过 ip addr 命令查看,发现新增了网卡 ens38,配置该网卡的 IP 地址为 192.168.1.254。注意,该网卡的 IP 与 computer1 的 IP 在同一个网段中(192.168.1.0/24)。
接着为 linux router 添加另一块网卡并连接到虚拟交换机 VMnet11:

通过 ip addr 命令查看,发现新增了网卡 ens39,配置该网卡的 IP 地址为 192.168.2.254。注意,该网卡的 IP 与 computer2 的 IP 在同一个网段中(192.168.2.0/24)。也就是说 linux router 主机有一块网卡连接网络 192.168.1.0/24,另一块网卡连接网络 192.168.2.0/24:

在 /etc/network/interfaces 文件中添加的内容如下:

auto ens38
iface ens38 inet static
address 192.168.1.254
netmask 255.255.255.0 auto ens39
iface ens39 inet static
address 192.168.2.254
netmask 255.255.255.0

此时从 computer1 ping 192.168.1.254 是连通的:

从 computer2 ping 192.168.2.254 也是连通的:

但是 computer1 与 computer2 不能相互连通。

配置 linux router 的 ip forward

ip forward 属于 linux 内核的功能,我们可以通过修改内核的参数来启用或禁用该功能。先通过下面的命令查看 ip forward 功能是否启用:

$ cat /proc/sys/net/ipv4/ip_forward

如果返回值为 1,说明该功能已经启用,否则就是没有启用。Ubuntu 系统默认没有启用该功能,所以我们需要通过修改配置来启用它。
其实非常简单,编辑文件 /etc/sysctl.conf,去掉 net.ipv4.ip_forward=1 前面的注释:

修改 /etc/sysctl.conf 文件后需要执行指令 sudo sysctl -p 后新的配置就会生效。通过这种方式修改后的配置会一直生效,包括重启系统。如果想临时测试一下 ip forward 功能,可以通过下面的命令临时修改一下配置:

$ sudo sysctl -w net.ipv4.ip_forward=

这样在系统重启后,配置就恢复为默认值了。

配置 linux router 的 iptables 规则

除了 ip forward,还需要为 linux router 主机添加适当的 iptables 规则:

$ sudo iptables -A FORWARD -i ens38 -o ens39 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i ens39 -o ens38 -j ACCEPT

添加这两条 iptables 规则后,iptables 就能够按照相应的规则的在我们设置的网卡之间(ens38 和 ens39)转发数据包了。

为 computer1 和 computer2 添加路由规则

最后,我们需要为 computer1 和 computer2 添加合适的路由信息。
computer1 上的默认路由信息是不能把数据包路由到网络 192.168.2.0/24 的。我们需要手动添加对应的路由信息:

$ sudo ip route add 192.168.2.0/ via 192.168.1.254 dev ens38

这样就完成了所有的配置。

检查结果

让我们从 computer1(192.168.1.5) ping computer2(192.168.2.5) 试试:

$ ping -c  192.168.2.5

从 computer1 可以成功 ping 到 computer2,说明我们配置的 linux ip forward 已经开始工作了!

参考:
How to Turn a Linux Server into a Router to Handle Traffic Statically and Dynamically – Part 10

Linux ip forward的更多相关文章

  1. 第一种SUSE Linux IP设置方法

    第一种SUSE Linux IP设置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168. ...

  2. linux ip白名单、防火墙白名单 设置

    http://blog.csdn.net/catoop/article/details/50476099 登录信息在 /var/log/secure linux ip白名单 配置文件:/etc/hos ...

  3. linux IP动态变动之后 , 需要做的杂项操作

    linux的动态ip经常变来变去,目前还没找到固定它不变化的方法.所以每次变动之后都需要做以下的操作,极其麻烦.(必须找到让linux IP 固定的方法) 1.先找到变化之后的动态ip地址 ifcon ...

  4. VMware下配置Linux IP,解决Linux ping不通

    因为安装好VMware8.0后,把VMware服务都设成手动的了,导致有些功能不好使,费了半天劲, 如果安装Linux时选择DHCP自动分配IP,需要启动服务: VMware DHCP service ...

  5. Linux ip

    工具/原料 linux系统 putty 方法/步骤   Linux下查看IP一般都是用命令在终端查看了,使用命令行来进行查看.   想要在图形界面查看的朋友也有办法,不过就比较复杂,不如一条命令来得痛 ...

  6. Linux IP 路由实现

    以下代码取自 kernel . [数据结构] 该结构被基于路由表的classifier使用,用于跟踪与一个标签(tag)相关联的路由流量的统计信息,该统计信息中包含字节数和报文数两类信息. 这个结构包 ...

  7. Linux IP代理筛选系统(shell+proxy)

    代理的用途 其实,除了抓取国外网页需要用到IP代理外,还有很多场景会用到代理: 通过代理访问一些国外网站,绕过被某国防火墙过滤掉的网站 使用教育网的代理服务器,可以访问到大学或科研院所的内部网站资源 ...

  8. linux ip 转发设置 ip_forward

    工作原理: 内网主机向公网发送数据包时,由于目的主机跟源主机不在同一网段,所以数据包暂时发往内网默认网关处理,而本网段的主机对此数据包不做任何回应.由于源主机ip是私有的,禁止在公网使用,所以必须将数 ...

  9. Linux ip netns 命令

    ip netns 命令用来管理 network namespace.它可以创建命名的 network namespace,然后通过名字来引用 network namespace,所以使用起来很方便. ...

随机推荐

  1. [20180730]exadata与行链接.txt

    [20180730]exadata与行链接.txt --//最近一段时间在看<expert oracle exadata>,智能扫描的三大优化方法是:字段投影,谓词过滤,存储索引.大多数智 ...

  2. CSS| 框模型-margin

    CSS margin 属性 设置外边距的最简单的方法就是使用 margin 属性. margin 属性接受任何长度单位,可以是像素.英寸.毫米或 em. margin 可以设置为 auto.更常见的做 ...

  3. Centos 如何关闭自动更新

    法一 安装Centos 6.5后,系统yum自动更新状态默认为开启,若禁止系统自动更新需要手动关闭. 1.进入yum目录 [root@localhost ~]$ cd /etc/yum 2.编辑yum ...

  4. [SequenceFile_1] Hadoop 序列文件

    1. 关于 SequenceFile 对于日志文件来说,纯文本不适合记录二进制类型数据,通过 SequenceFile 为二进制键值对提供了持久的数据结构,将其作为日志文件的存储格式时,可自定义键(L ...

  5. kettle 合并记录步骤中的 关键字段和 比较字段的说明

    该步骤用于将两个不同来源的数据合并,这两个来源的数据分别为旧数据和新数据,该步骤将旧数据和新数据按照指定的关键字匹配.比较.合并. 需要设置的参数: 旧数据来源:旧数据来源的步骤 新数据来源.新数据来 ...

  6. 11LaTeX学习系列之---LaTeX的特殊字符

    目录 目录 前言 (一)源代码 (二)输出效果 目录 本系列是有关LaTeX的学习系列,共计19篇,本章节是第11篇. 前一篇:10LaTeX学习系列之---Latex的文档结构 后一篇:12LaTe ...

  7. Intent加强

    Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...

  8. GUI_事件监听机制与ActionListener演示

    事件监听机制组成: 事件源:(awt包或者swing包中的那些图形界面组件)(被打的那个人,被点击的组件,可以承受某些事件,但不是所有事件都能承受) 事件:每个事件源都有自己特有的对应事件和共性事件( ...

  9. C#反射の反射详解

    C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转) 一.什么是反射 反射(Reflection):这是.N ...

  10. 方程:方程(equation)是指含有未知数的等式

    方程(equation)是指含有未知数的等式.是表示两个数学式(如两个数.函数.量.运算)之间相等关系的一种等式,使等式成立的未知数的值称为“解”或“根”.求方程的解的过程称为“解方程”. 方程中文一 ...