如何使用 NAT 将 Linux 服务器设置为路由器

Ste*_*eng 12 linux nat routing fedora iptables

我们有一个简单的路由器,它具有对称类型的 NAT,但是由于该路由器没有为我们提供任何调试接口,我们无法确定特定数据包是否到达了 NAT。

因此,我们要设置一台 LINUX 计算机,使其成为具有对称 NAT 的路由器,这样我们就可以将所有数据包捕获到这个“NAT”并获得我们想要的信息。我们如何在 linux(Fedora 系统,内核 2.6.xx)上执行此操作?

Moh*_*enN 18

要将 Linux 机器设置为路由器,您需要以下内容

1- 在盒子上启用转发

echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

假设您的公共接口是 eth1,本地接口是 eth0

2- 设置 natting 规则:

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

3- 接受来自 eth0 的流量:

iptables -A INPUT -i eth0 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

4- 允许从公共接口建立连接。

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

5- 允许传出连接:

iptables -A OUTPUT -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我不久前否决了这一点,因为步骤 3-5 不相关,并且可能会无意中向世界公开网络服务。 (3认同)
  • INPUT 和 OUTPUT 链分别影响实际寻址到路由器的数据包和路由器实际生成的数据包。您需要的是 FORWARD 链上的规则,它处理通过的数据包。 (2认同)
  • 嗯,我不这么认为。我在 Internet 上找到的所有 Netfilter 图都表明 OUTPUT 链仅适用于本地进程生成的数据包。例如:http://upload.wikimedia.org/wikipedia/commons/8/8f/Diagrama_linux_netfilter_iptables.gif (2认同)

mul*_*t3d 12

我认为其他答案忽略了一些要点。这是另一种方法,假设 iptables 处于新状态,再次使用 eth0 作为内部接口,使用 eth1 作为外部接口:

  1. 在内核中启用IP转发:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    # or
    sysctl -w net.ipv4.ip_forward=1
    
    Run Code Online (Sandbox Code Playgroud)

    要在重新启动后保留此更改,请net.ipv4.ip_forward=1在 中添加或取消注释/etc/sysctl.conf或 中的文件/etc/sysctl.d

  2. 在 eth1 上启用伪装以重写传出数据包的源地址。--random如果您确实想要对称 NAT,则最后需要:

    iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE --random
    
    Run Code Online (Sandbox Code Playgroud)
  3. 配置转发规则。默认情况下,iptables 将无条件转发所有流量。您可能希望限制来自互联网的入站流量,但允许所有传出流量:

    # Allow traffic from internal to external
    iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
    # Allow returning traffic from external to internal
    iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT
    # Drop all other traffic that shouldn't be forwarded
    iptables -A FORWARD -j DROP
    
    Run Code Online (Sandbox Code Playgroud)

请注意,我们没有触及过滤器表中的 INPUT 或 OUTPUT 链;这些与路由器无关。

要在重新启动后保留这些防火墙更改:

iptables-save > /etc/sysconfig/iptables
systemctl enable --now iptables
Run Code Online (Sandbox Code Playgroud)

此步骤将根据 Linux 发行版的不同而有所不同。