如何使用 Linux 作为网关?

Sop*_*rez 19 networking routing

注意:如果客户端设备(computer B在这个例子中)想要通过网关计算机获取互联网,他们可能仍然需要配置名称服务器解析。此处不作解释(网关不一定服务于互联网)。

我试图了解网络路由的基础知识。
所以我正在试验我的局域网(我现在不需要互联网,只需要局域网通信)。

我知道网络配置问题是一件相当复杂的事情,但我只是想让一台计算机(比如 A)充当另一个(比如 B)(都运行 Ubuntu Linux)的网关
我只需要 B 能够到达路由器,只有 A 才能到达。

情况是这样的:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2
Run Code Online (Sandbox Code Playgroud)

计算机A 连接路由器正常
计算机A和B连接罚款(平,SSH ...等)之间
计算机 B无法访问计算机 A的路由器

我在想,只需在 B 计算机A上添加作为默认网关在 A 上激活IP 转发将使 B 能够到达 A 的路由器:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0
Run Code Online (Sandbox Code Playgroud)

在计算机 A(中间网关)上:

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

电脑 B 仍然可以 ping 电脑 A,但 A 的路由器不应答:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C
Run Code Online (Sandbox Code Playgroud)

(无 ping 响应)

这是使运行 Linux 的计算机以简单的方式充当另一台计算机的网关的正确过程吗?

use*_*469 28

你快到了,你只需要确保流量回到 B。现在你已经将流量从 B 转发到外部世界,但 A 不知道如何让流量回到 B。你需要 A 保持一些状态通过它的连接。为此,您需要启用NAT。您已经有了允许转发的第一步。然后您需要使用以下命令添加一些防火墙规则iptables

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

这表示:在网络地址转换表上,在我们找出输出 eth0(外部)上的数据包的路由后,将返回地址信息替换为我们自己的返回地址信息,以便返回数据包到达我们。另外,请记住我们是这样做的(就像一个记住这个连接的查找表)。

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

允许想要来自 eth1(内部接口)的数据包离开 eth0(外部接口)。

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

使用我们之前的查找表来查看到达外部接口的数据包是否实际上属于已经从内部发起的连接。