IPTABLES 作为路由器是否总是需要伪装/SNAT?

IPTABLES 作为路由器是否总是需要伪装/SNAT?

如果我将 Linux 机器设置为 DSL 网关后面的路由器,我是否需要启用伪装或 SNAT?

从逻辑上讲,我认为我需要做的就是启用 ip_forwarding(完成),但如果我不执行任何 NAT,互联网流量就会中断。

配置如下(抱歉,图表不对)

互联网---[ppp0_DSL router_eth0]----192.168.1.x-----[eth0_ubunturouter_eth1]------192.168.2.x

如果 NAT 在宽带路由器上运行,那么我也需要在 ubuntu 路由器上运行它吗?

以下是 ubuntu 路由器 iptables 的配置...

  # Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*nat
:PREROUTING ACCEPT [10859:2328892]
:INPUT ACCEPT [1002:126271]
:OUTPUT ACCEPT [1256:91484]
:POSTROUTING ACCEPT [638:43890]
COMMIT
# Completed on Thu Oct 29 12:48:19 2015
# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*filter
:INPUT ACCEPT [5:803]
:FORWARD ACCEPT [127:18532]
:OUTPUT ACCEPT [5:431]
# INPUT to allow ssh and ping from internal network
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "ssh on eth1"
-A INPUT -p icmp -j ACCEPT -m comment --comment "allow ping from internal"
-P INPUT DROP
# god table to handle traffic forwarding and test icmp
-N god
-A god -d 8.8.4.4 -j REJECT
-A god -d 8.8.8.8 -j DROP
# forward configured to explicitly route between interfaces - this could be redundant
-A FORWARD -i eth1 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j ACCEPT
-A FORWARD -p tcp -j ACCEPT -m comment --comment "all tcp"
-A FORWARD -p udp -j ACCEPT -m comment --comment "all udp"
-A FORWARD -p icmp -j god -m comment --comment "all icmp"
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -i eth1 -j ACCEPT
-P FORWARD DROP
# output to allow web traffic and icmp from router
-A OUTPUT -o eth1 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-P OUTPUT DROP
COMMIT
# Completed on Thu Oct 29 12:48:19 2015

此配置不断导致互联网瘫痪,但如果我添加

-A POSTROUTING -o eth0 -j SNAT --to 192.168.1.1

但是为什么???为什么这个盒子只能与 SNAT 一起工作,而这是不需要的,因为它已经在 DSL 路由器上安装了?

                • 更新 - - - - - - -

从评论中可以看出,Radhil 和 MichaelB 都是正确的。我没有考虑到宽带路由器上除了一个子网(本例中为 192.168.1.0)之外的任何路由都缺乏。不幸的是,这个特定的宽带路由器没有提供添加额外静态路由的方法,因此我在本例中启用来自内部子网的基于源的路由的解决方案是使用 PREROUTING 表来链接流量。

例如

A PREROUTING -i eth1 -m mac --mac-source xx:xx:xx:xx:xx:xx -j DNAT --to 192.168.2.200

然后

-A FORWARD -s 192.168.2.200 -j DROP

这显然是一个糟糕的解决方案(这样做是因为 IPTABLES 不允许在 PREOUTING / POSTROUTING 表中进行 DROP,但我只是将其作为能够在这些受限情况下基于源进行路由的一个例子)。

答案1

DSL 路由器在 192.168.1.0 上运行自己的 NAT,对吗?这就是它要分发的网络。

所以答案是它不知道任何事物任何 192.168.2.0 网络,因此不会尝试对其进行 NAT。它可能会将该流量转发到 Internet,但 Internet 会立即丢弃这些私有 IP。它可能也没有路由信息来通过您的盒子返回到您的第二个网段,所以无论如何您都没有返回路径,除非您在某处将其设置为静态路由并且没有指出这一点。

因此,您需要为 DSL 路由器提供它所期望的内容。要么找到一种方法来更改其设置,使其同时对两个网段进行 NAT,并为 192.168.2.0 设置到 Ubuntu 的静态路由,要么像您找到的那样在您的路由器上设置 NAT。

答案2

这是因为 DSL 调制解调器不知道 192.168.2.* 网络,当路由器从 192.168.2.x 接收到数据包时,它假定必须通过默认网关进行回复,因为它没有到该子网的特定路由。

如果您的 DSL 路由器能够配置静态路由,那么这将解决问题,如果不能,您将需要在路由器上配置 NAT,以便路由器看到的所有流量都来自本地网络(就 DSL 路由器所见而言)

相关内容