如何使用Linux作为网关?


16

注意:如果客户端设备(computer B在此示例中)要通过网关计算机获得Internet,则可能仍需要配置名称服务器解析。这里没有解释(网关不一定服务于互联网)。

我试图了解网络路由的基础知识。
因此,我正在尝试使用LAN(我现在不需要Internet,仅需要LAN通信)。

我知道网络配置问题是一件相当复杂的事情,但是我只是想使一台计算机(例如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路由器的连接良好。
计算机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

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

(无回应)

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

Answers:


21

您几乎就在那儿,您只需要确保流量能回到B。现在您已经将流量从B转发到外界,但是A不知道如何将流量返回到B。您需要A保持一些状态通过它的连接。为此,您需要启用NAT。您已经有了允许转发的第一步。然后,您需要使用以下命令添加一些防火墙规则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

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


确实有一个简洁的解释。是否必须在计算机A上执行所有代码块?
Sopalajo de Arrierez,2015年

@SopalajodeArrierez是的,这些都在“网关”计算机上执行。系统B不需要知道任何有关路由的信息,除非它想到达任何其他机器,它就将数据包发送到B(它是默认的GW)。
user1794469

经过测试,可以在台式机上的Ubuntu v14和Utilite Pro(来自CompuLabs的嵌入式服务)上的Ubuntu v12上工作。非常感谢您扩展每行的功能。我研究并发现了许多长期有效的解释。我希望这个问题解答线程将来对其他人有用。
Sopalajo de Arrierez,2015年

@ user1794469在网关接口为虚拟接口(即分接接口)时是否相同?你可以在这里看看吗?
公羊

1

为了使在充当网关的两台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连接的网关)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.