如何使用 Linux 作为网关?

如何使用 Linux 作为网关?

注意:如果客户端设备(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

电脑A 连接很好路由器
电脑甲和乙连接良好(ping、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

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

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

计算机 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

(无 ping 响应)

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

答案1

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

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

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

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

允许来自 eth1(内部接口)的数据包从 eth0(外部接口)发出。

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

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

答案2

为了让两台作为网关的 Linux 计算机之间的路由正常工作,需要满足以下几点:

  • 两个网关都需要具有相互之间的物理链路(如果要链接虚拟机,则需要虚拟链路)。
  • 必须将路由添加到路由器上的两个接口。

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • 必须在两个网关上为远程网络指定本地网关。这使得本地网络上的计算机知道将数据包发送到远程网络的位置。网关应该是将数据包发送到远程网络的计算机的 IP 地址。

  • 希望在网络之间发送流量的计算机还必须了解哪个本地网关正在处理进出远程网络的流量。这通常是通过动态主机控制协议 (DHCP) 完成的,但是如果您打算使用单独的 Internet 网关,则需要在需要访问 Internet 和其他网络的计算机上指定两者(例如,通过DHCP 和其他网络的网关通过路由)。
  • 两个网关的 IP 转发都必须处于活动状态。
  • 必须启用 IP 伪装才能允许 NAT 在网关之间运行。

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    您可能需要指定源和目标,因为您使用相同的接口进行伪装:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    和另一个网关:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    对于每个网关,应在适当的接口上接受本地网络流量,如下所示:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    或者

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

很多的 链接相似的 问题可以为您解决遇到的问题提供参考。

在这种特殊情况下,问题似乎在于两台计算机上的路由和网关设置均未完成,并且尚未使用 iptables 启用网络地址转换 (NAT),从而允许网关承载来自其他子网上的计算机的请求代表他们。

在设置 Internet 连接时,这样做也很重要,因为您负责连接的一端(例如,使用 Linux 计算机作为 PPPoE 连接的网关)。

相关内容