我正在尝试使用 SSH 将 Windows 计算机本地端口 3389 转发到 Redhat 服务器上某个任意端口(在非特权区域),该端口由我保护在防火墙后面,然后将 Redhat 服务器上的非特权端口转发到用户的远程桌面。本质上创建一个高度专业的 VPN,它只处理一项任务:使用我可以控制的加密隧道将用户带到防火墙后面的系统。
我知道几年前使用以下命令可以实现这一点:
iptables -A OUTPUT -t nat --dport ${LOCAL UNPRIV PORT} \
-j DNAT ${ANOTHER SYSTEM}:${REMOTE PORT}
但从我读到的内容来看,似乎该功能已被删除,并且我在 /var/log/messages 中收到了该消息
kernel: NAT: no longer support implicit source local NAT
我发现一些资源表明,从内核 2.6.X - 2.6.10 开始,有一种方法可以使用 IP_NF_NAT_LOCAL 在内核中启用此功能,但显然在较新的内核中它已被删除。我曾尝试转发所有本地流量,以便它进入 PREROUTING 链,但成功率有限,这感觉是个坏主意,因为这样我就必须在服务器上打开非特权端口,以便我可以将其反馈到 eth0 接口。我相信如果有更多时间,我可以找出某种奇怪的临时解决方案或解决方法,但我宁愿不要对我的防火墙脚本进行太多破解。似乎一定有一种更简单的方法,我没有看到。社区提供的任何帮助或指导都将非常有帮助!提前致谢
答案1
我不确定我是否理解了,但我认为你只是在错误的链中。:-) 当我第一次使用 iptables 时,我也感到困惑。但向前这当地的port${LOCAL UNPRIV PORT}
是下面的语句:
$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT}
-j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}
这是语义问题和 netfilter 工作方式的混合:在过去,转发本地端口需要连接到转发的框,以及到目的地的第二个连接。Iptables 只需一步即可完成此操作。因此,您无需两个连接 - 而是将流量转发到该端口直接到目的地。Netfilter 会执行所有健全性检查和簿记:只有属于有效连接的数据包才会进行 NAT,因此可以转发。
启用 DNAT 不允许转发任何数据包。您还必须添加一条规则:
$IPT -N INET-PRIV
$IPT -A FORWARD -i eth0 -o eth1 -j INET-PRIV
$IPT -A FORWARD -j DROP
$IPT -A INET-PRIV -p tcp -d ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j ACCEPT
$IPT -A INET-PRIV -j DROP
当然,您必须启用转发功能。
echo "1" > /proc/sys/net/ipv4/ip_forward
专业版 iptables:更安全、更灵活、每个连接使用的内存和 CPU 更少
陷阱:使用 iptables 将连接从一台内部机器转发到另一台内部机器(将其反馈回 eth0)是没有意义的(当然你总是可以直接连接),转发本地生成的流量不起作用(端口转发守护进程可能会有所帮助 - 但通常没有意义)
这可能就是问题所在:您尝试在非路由器上使用 NAT,因此您应该使用转发守护程序或完全跳过这个额外的端口转发并执行以下操作:
ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-box
在 special-vpn-box 上,您只能使用 iptables 允许来自路由器的传入连接和到 ${ANOTHER SYSTEM}:${REMOTE PORT} 的传出连接。这样,special-vpn-box 的用户只能访问 ${ANOTHER SYSTEM}:${REMOTE PORT},如果他们不受信任,他们将无法执行任何其他操作。
答案2
以下是我针对本地主机转发专门执行的操作:
iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 3306 -j DNAT --to-destination ip.ip.ip.ip
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE
sysctl -w net.ipv4.conf.all.route_localnet=1
确保你替换了ip.ip.ip.ip
你的真实公共 IP 以及--dport 3306
你想要转发的端口。
最后运行 sysctl 命令并更新你的/etc/sysctl.conf
您可以sysctl.ctl
使用以下命令更新以允许 localhost 的路由:
echo "net.ipv4.conf.all.route_localnet=1" >> /etc/sysctl.conf
现在这一切看起来都很简单,但确实需要一些研究和追查。请注意并了解转发 localhost/127.0.0.1 需要此方法,并且典型的其他示例不起作用。一些不适用于 localhost 的解决方案示例:
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to ip.ip.ip.ip:3306
iptables -t nat -A POSTROUTING -d ip.ip.ip.ip -j MASQUERADE
http://realtechtalk.com/iptables_how_to_forward_localhost_port_to_remote_public_IP-1788-articles
答案3
# Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp \
--dport ${LOCAL UNPRIV PORT} -j DNAT --to-destination ${ANOTHER SYSTEM}:${REMOTE PORT}
iptables -t nat -A POSTROUTING -p tcp \
--dst ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j SNAT --to-source ${LOCAL SYSTEM}