iptables 将外部请求重定向到 127.0.0.1

Sim*_*ite 54 iptables port-forwarding network-interface

我有一个服务在 127.0.0.1 上运行,端口为 2222。我需要将所有请求转发到 192.168.2.2:2222(外部 IP),仅从子网 192.168.1.0/24 到 127.0.0.1:2222。

我正在尝试使用它,但它不起作用。

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它发挥作用?

UPD:编辑地址方案。

phe*_*mer 80

您正在使用的 iptables 规则将起作用,但您还需要进行一项额外的更改:

sysctl -w net.ipv4.conf.eth0.route_localnet=1
Run Code Online (Sandbox Code Playgroud)

(更换eth0网卡192.168.2.2驻留)

默认情况下,此值为0,它指示内核不路由发往 的外部流量127.0.0.0/8。这只是为了安全,因为这样的流量是不正常的。

  • 这个信息出奇地难找。 (14认同)
  • 我的 2 美分:您可以使用 `sysctl -w net.ipv4.conf.all.route_localnet=1` 为所有接口启用此参数 (2认同)

dre*_*nde 8

您可以重定向到本地主机,但不能重定向到环回 (127.0.0.0/8)。环回是一个漏洞。您必须重定向到您的真实界面之一。尝试使用重定向。

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222

  • 在这种情况下,请使用“-j DNAT --to-destination wxyz:222” (4认同)
  • 谢谢@dresende,`-j DNAT --to-destination 127.0.0.1:<port>` 效果很好!<br/>这是我用来将连接转发到侦听端口 1186 的 MariaDB 服务器的完整命令:`iptables - t nat -A PREROUTING -i eth0 -p tcp --dport 1186 -j DNAT --to-destination 127.0.0.1:1186` (4认同)
  • 如果仅在本地主机上侦听端口 222,仍然没有帮助(该规则不会更改目标地址) (2认同)

imz*_*hev 5

如果正确答案不起作用怎么route_localnet办?...

如果您的内核不包含 的补丁route_localnet,那么...升级内核!

或者还有其他方法可以通过运行一个在外部接口上侦听并转发流量的进程,将来自一个接口的流量转发到另一个接口上的另一个端口(特别是本地主机)。

netcat( nc)、xinetdssh(或许还有更多)都是能够执行此操作的程序示例(尽管选择ssh会很奇怪且无效)。

xinetd我为此编写了一个配置。现在该服务会自动启动:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 
Run Code Online (Sandbox Code Playgroud)

vaio.ob是该主机在外部网络接口上的名称。)

之后service xinetd reload,让我们检查它是否正在监听:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 
Run Code Online (Sandbox Code Playgroud)

事实上,联系确实存在!