有一个隔离的 LAN(完全隔离,无法访问外部,外部也无法访问它)。但是其中一台服务器有 2 个 NIC,其中一个在我们的开发 LAN 上,另一个在隔离的 LAN 上。
目标是从开发 LAN 访问隔离 LAN 内的特定 TCP 服务。例如,我想从开发 LAN(例如 dev-laptop-01)访问隔离 LAN 内服务器(例如 iso-server-01)的 SSH 服务,具有“网关”角色的服务器(例如 gw-server)应在开发 LAN 上公开 SSH 服务并将其转发/重定向到隔离 LAN 上的服务提供商。
我想要使用iptables
以下配置:
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 10022 -j DNAT --to iso-server-01
iptables -t nat -A POSTROUTING -p tcp -m tcp -s iso-server-01 --sport 22 -j SNAT --to-source gw-server
sysctl net.ipv4.ip_forward=1
但它不起作用。当我从我的 dev-laptop-01 发出时,ssh -p 10022 gw-server
我收到一个Connection timed out
错误。
解决这个问题的最佳方法是什么?
PS:我正在运行 RHEL 6.6。
答案1
我没有通过使用 iptables 找到答案。
但它们还有其他选择:
SSH
当需要 SSH 服务时,可能可以“链接” ssh 连接来实现上述结果,但在其他情况下则不起作用。
可以使用 SSH 隧道。类似以下内容(要在 gw-server 上执行,请注意 gw-server-dev 解析为 dev LAN 的 IP 地址):
ssh -f -N -L gw-server-dev:10022:iso-server-01:22 <user>@gw-server-dev
此解决方案的优点在于,即使隔离服务不使用加密,我们也能通过 SSH 享受加密的好处。而且它应该适用于任何 TCP 服务。
缺点是如果此命令崩溃,则没有简单的方法重新启动它。但是 ssh 相当稳定。
西奈特
我还发现,使用 xinet 可以实现我想要的任何 TCP 服务。
以下是示例文件:
service iso-server-01-ssh
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
redirect = iso-server-01 22
log_on_failure += USERID
}
(/etc/services 中必须有一个与 iso-server-01-ssh 相对应的端口。在我们上面的例子中,该端口为 10022)。
iptables
我没有答案。所以如果你有一个可行的答案,我会将你的答案标记为已接受的答案。我的答案只是为那些寻找类似解决方案但对替代方案感到满意的人提供的(我对替代方案也满意,我只是对无法让 iptables 做我想做的事情感到“沮丧” ;-) )。