我正在尝试通过 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
我必须改变这一点吗?如果需要,该怎么做?
答案1
这种行为缺失可能是由不对称路由和禁止它的外部路由器功能造成的。服务器通过另一个连接(使用其默认网关到互联网)路由 ssh 回复,外部路由器丢弃数据包。尝试使用或监控流量,iptraf
看看tcpdump
数据包在服务器的哪条线路上输出。Iptraf 有一个连接视图,其中的数据包显示在屏幕的下部。您可能必须向内部路由器添加源 NAT 规则,以使 SSH 数据包以正确的方式返回。
编辑:来自外部工作站的连接不经过外部路由器。它只是使用来自同一子网的 IP 直接连接到内部路由器,并且可以直接从服务器的外部接口接收数据包,因为这也位于同一子网中。
为了澄清这一点,请考虑适当的 NAT 是如何工作的。当外部路由器从互联网接收到 SSH 端口的数据包时,其“TO”地址和端口将被重写为内部路由器的相应值。数据包的“FROM”地址保持不变。内部路由器接收数据包并再次重写 TO 地址和端口,但 FROM 地址保持不变,即 SSH 数据包来自的原始可路由 IP 地址。内部路由器将数据包传递到服务器(如果所有端口转发都配置正确),服务器中的 sshd 接收数据包并直接向外部路由器发送回复。如果外部路由器配置为丢弃非对称路由的数据包,它将看到发送者没有内部路由器的地址,并将在 big bin 中回收它。内部路由器中的 SNAT 或源 NAT 将重写 FROM 地址,以便服务器将数据包返回到内部路由器,然后返回到外部路由器,后者再返回到原始发送者。
答案2
如果服务器连接到两个网络,您能否将端口从外部 NAT 设备(我假设这是服务器的 gw)直接转发到服务器?