我正在尝试通过 2 个 NAT 为 ssh 设置端口转发
第一个路由器将我的互联网 IP 转换为我的外部网络 (10.1.7.0)。在外部网络中,有第二个路由器对我的内部网络 (192.168.1.0) 进行 NAT。
目标服务器连接到外部网络和内部网络。
我无法更改外部路由器的端口转发选项。当前配置为将 SSH 和 HTTP 端口转发到内部网络的路由器。
Internet
+
|
v
+-----------------+ +------------------+
| Outer Router | | Inner Router |
|-----------------| |------------------|
| | SSH HTTP | |
+----+ +--------------------->| |
| | | | |
| | | | |
| +-------+---------+ +------+---------+-+
| | | |
| | | |
| | | |
| | +------------------+ | SSH |
| | | Server | | |
| | |------------------| | |
| +-----------> |<-------+ |
| | | |HTTP (testing)
| +------------------+ |
| |
+------v------------------+ |
| Outer Workstation | +-------------------+ |
|-------------------------| | Inner Workstation| |
| | |-------------------| |
| | | |<----------------+
+-------------------------+ | |
+-------------------+
当从外部工作站连接到内部路由器的地址时,SSH 和 HTTP 都可以正常工作。
当使用 HTTP 从互联网连接到我的公共 IP 时,连接也工作正常。
但是 SSH 只是超时。很可能是因为回复没有正确路由回去。
我怀疑是因为 SSH 本身,还是因为服务器同时连接到内部和外部网络。
有什么想法可以解决这个问题吗?
服务器上的路由当前是:
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
我必须改变这个吗?如果是这样怎么办?
这种缺乏行为可能是由不对称路由和禁止它的外部路由器的特性引起的。服务器通过另一个连接(使用其默认网关连接到 Internet)路由 ssh 回复,外部路由器丢弃数据包。尝试使用
iptraf
或监控流量tcpdump
并查看数据包在服务器的哪条线路上输出。Iptraf 有一个连接视图,在屏幕的下部显示数据包。您可能必须向内部路由器添加源 NAT 规则,以使 SSH 数据包以正确的方式返回。编辑:来自外部工作站的连接不通过外部路由器。它只是使用同一子网的 ip 直接连接到内部路由器,并且可以直接从服务器的外部接口接收数据包,因为它也在同一子网中。
要澄清这一点,请考虑适当的 NAT 是如何工作的。当外部路由器从 Internet 的 SSH 端口接收到数据包时,其“TO”地址和端口将被重写为内部路由器的适当值。数据包的“FROM”地址保持不变。内部路由器收到数据包并再次重写 TO 地址和端口,但 FROM 地址保持不变,即 SSH 数据包来自的原始可路由 IP 地址。内部路由器将数据包传递到服务器(如果所有端口转发都正确配置),服务器中的 sshd 接收它并直接向外部路由器发送回复。如果外部路由器配置为丢弃非对称路由的数据包,它会发现发送方没有内部路由器的地址并将其回收到大容器中。
如果服务器连接到两个网络,您可以将端口从外部 NAT 设备(我假设这是服务器的 gw)直接转发到服务器吗?