dyn*_*ous 7 linux redhat iptables loopback forwarding
我正在尝试使用 SSH 将 Windows 机器本地端口 3389 端口转发到某个任意端口(在非特权区域)上的 redhat 服务器,我在防火墙后面保护,然后将 redhat 服务器上的非特权端口转发到用户远程桌面。本质上创建一个高度专业化的 VPN,它只处理一项任务:使用我可以控制的加密隧道将用户带到防火墙后面的系统。
我知道几年前可以使用以下命令:
iptables -A OUTPUT -t nat --dport ${LOCAL UNPRIV PORT} \
-j DNAT ${ANOTHER SYSTEM}:${REMOTE PORT}
Run Code Online (Sandbox Code Playgroud)
但是从我读到的内容来看,该功能似乎已被删除,并且我在 /var/log/messages 中收到了消息
kernel: NAT: no longer support implicit source local NAT
Run Code Online (Sandbox Code Playgroud)
我发现从内核 2.6.X - 2.6.10 开始,有一种方法可以使用 IP_NF_NAT_LOCAL 在内核中启用它,但显然在最近的内核中它被删除了。我已经尝试转发所有本地流量,以便它进入 PREROUTING 链,但成功有限,这感觉是个坏主意,因为那时我必须打开服务器上的非特权端口,以便将其反馈给eth0 接口。我确信如果有更多的时间我可以找出某种奇怪的问题或解决方法,但我宁愿不要那么多地破解我的防火墙脚本。似乎必须有一种更简单的方法来做到这一点,我没有看到。社区可以提供的任何帮助或指导都会非常有帮助!提前致谢
Gan*_*ell 11
我不完全确定我是否理解,但我认为你只是在错误的链中。:-) 当我第一次使用 iptables 时,我也很困惑。但要顺便转发的本地端口$ {LOCAL UNPRIV PORT}是以下语句:
$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT}
-j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}Run Code Online (Sandbox Code Playgroud)
它是语义问题和 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 DROPRun Code Online (Sandbox Code Playgroud)
当然,您必须启用转发。
echo "1" > /proc/sys/net/ipv4/ip_forwardRun Code Online (Sandbox Code Playgroud)
Pro iptables:更安全,更灵活,每个连接使用的内存和 CPU 更少
反对 iptables:将连接从内部机器转发到内部机器(将其反馈到 eth0)对 iptables 没有意义(当然你总是可以直接连接),转发本地生成的流量不起作用(端口转发守护进程可能会有所帮助 - 但通常没有意义)
正是这可能是问题所在:您尝试在非路由器上使用 NAT,因此您应该使用转发守护程序或完全跳过这个额外的端口转发并执行以下操作:
ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-boxRun Code Online (Sandbox Code Playgroud)
在 special-vpn-box 上,您只能使用 iptables 允许来自路由器的传入连接和到 ${ANOTHER SYSTEM}:${REMOTE PORT} 的传出连接。这样 special-vpn-box 的用户只能访问 ${ANOTHER SYSTEM}:${REMOTE PORT} 并且如果他们不受信任将无法做任何其他事情。
小智 5
这是我专门为本地主机转发所做的:
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
Run Code Online (Sandbox Code Playgroud)
确保您替换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
Run Code Online (Sandbox Code Playgroud)
现在这一切看起来简单而美好,但确实需要进行一些研究和追捕。请注意并理解转发 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
Run Code Online (Sandbox Code Playgroud)
http://realtechtalk.com/iptables_how_to_forward_localhost_port_to_remote_public_IP-1788-articles