SSH不能通过双重NAT工作

我正在尝试通过2个NAT设置ssh端口转发

第一台路由器将我的互联网IP转换为我的外部networking(10.1.7.0)。 在外部networking中,有第二个路由器对我的内部networking(192.168.1.0)执行NAT。

目标服务器连接到外部networking和内部networking。

我无法更改外部路由器的端口转发选项。 目前configuration为将SSH和HTTP端口转发到内部networking的路由器。

Internet + | v +-----------------+ +------------------+ | Outer Router | | Inner Router | |-----------------| |------------------| | | SSH HTTP | | +----+ +--------------------->| | | | | | | | | | | | | +-------+---------+ +------+---------+-+ | | | | | | | | | | | | | | +------------------+ | SSH | | | | Server | | | | | |------------------| | | | +-----------> |<-------+ | | | | |HTTP (testing) | +------------------+ | | | +------v------------------+ | | Outer Workstation | +-------------------+ | |-------------------------| | Inner Workstation| | | | |-------------------| | | | | |<----------------+ +-------------------------+ | | +-------------------+ 

当从外部工作站连接到内部路由器的地址时,SSH和HTTP都可以正常工作。

当从互联网连接到我的公共IP与HTTP,连接工作正常。

然而,SSH只是超时。 很可能是因为回复没有正确回传。

我怀疑它是因为SSH本身,还是因为服务器连接到内部和外部networking。

任何想法如何我可以解决这个问题?

服务器上的路由目前是:

 ip route show default via 10.1.7.254 dev eth0 metric 100 10.1.7.0/24 dev eth0 proto kernel scope link src 10.1.7.1 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 

我必须改变这个吗? 如果这样怎么样?

这种行为不足可能是由不对称路由和禁止它的外部路由器的function造成的。 服务器通过其他连接(使用其默认网关到Internet)将ssh回复回去,外部路由器丢弃数据包。 尝试使用iptraftcpdump监视stream量,并查看服务器的哪个线路上的数据包得到输出。 Iptraf有一个连接视图,显示在屏幕下方的数据包 。 您可能需要将源NAT规则添加到内部路由器,以使SSH数据包恢复正确。

编辑:来自外部工作站的连接不通过外部路由器。 它只是使用来自同一子网的IP直接连接到内部路由器,并且可以直接从服务器的外部接口接收数据包,因为它们在同一个子网上。

为了澄清这一点,请考虑适当的NAT如何工作。 当外部路由器从互联网接收到SSH端口的数据包时,其“TO”地址和端口被重写为适当的内部路由器值。 数据包的“FROM”地址保持不变。 内部路由器接收数据包并重新写入TO地址和端口,但是FROM地址保持不变,即SSH数据包的原始可路由IP地址。 内部路由器将数据包传递到服务器(如果所有的端口转发configuration正确),服务器中的sshd会接收数据包,并直接将回复发送到外部路由器。 如果外部路由器被configuration为丢弃非对称路由的分组,则将看到发送者没有内部路由器的地址,并且将在大容器中回收它。 内部路由器中的SNAT或源NAT将以这样的方式重写FROM地址,即服务器将数据包返回到内部路由器,而后者又返回到外部路由器,而后者返回到原始发送者。

如果服务器连接到两个networking,您是否可以将外部NAT设备(我认为这是服务器的gw)的端口直接转发到服务器?