iptables将外部请求重定向到127.0.0.1


41

我有一个使用端口2222在127.0.0.1上运行的服务。我只需要将所有请求子网192.168.1.0/24 转发到192.168.2.2:2222(外部IP)到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

我该如何工作?

UPD:编辑地址方案。


我们需要澄清。交通从哪里来?交通原本去哪里?交通应该去哪里?在我阅读本文时,您希望将从192.168.1.0/24到127.0.0.1:2222的流量重定向到12.23.34.45:2222。但是沃伦(Warren)的答案假设您希望将从192.168.1.0/24到12.23.34.45:2222的流量重定向到127.0.0.1:222
Patrick

1
流量从192.168.1.0/24子网到192.168.2.2:2222,应转换为127.0.0.1:2222上的服务。我已纠正地址方案。
SimWhite 2014年

1
您是否想要一个规则,允许流量2222从子网在环回接口上移植192.168.1.0/24?这不仅仅是设置的单一规则类型。在这里看到:debuntu.org/...
SLM

是。据我了解,我需要添加masq规则?IP转发当然已经启用。
SimWhite 2014年

为什么不在“真实” IP上运行它,并过滤掉来自有害来源的流量呢?这实际上就是防火墙的目的……
vonbrand 2014年

Answers:


60

您正在使用的iptables规则可以使用,但是还需要进行另一项更改:

sysctl -w net.ipv4.conf.eth0.route_localnet=1

(用eth0nic 代替192.168.2.2

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


附加说明:您当前的iptables规则太宽泛。您的规则将指定-d 192.168.1.0/24 --dport 2222为目标匹配项,这意味着,如果您的计算机尝试与端口2222上的另一台主机通信(即出站流量),它也会被重定向。您需要将-d匹配项更改为-d 192.168.2.2,或添加-i eth0(或任何您的网卡是)。


8
很难找到此信息。
Wren T.

是的,非常有价值的难以找到的信息!谢谢!但是我没有route_localnet。还有其他名字吗?(在linux 2.6.30)ls /proc/sys/net/ipv4/conf/lan/:accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm转发mc_forwarding promote_secondaries rp_filter send_redirects标签
IMZ -伊凡Zakharyaschev

我发现,该补丁程序的route_localnet更新时间(2012年6月7日)比我的内核更新(2.6.30-std-def-alt15#1 SMP Mon Dec 14 UTC 2009年UTC)。好的,我将通过转发过程netcatncxinetd,或的端口转发选项ssh(当然,后者无效且愚蠢)来简单地实现所需的端口转发(从外到内)。因为很好,这种可能性就在那里)。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)

2
我的2美分:您可以使用sysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan

和其他人一样,此信息很难获得。谢谢,如果我能较早发现,将为我省去一吨的精力。
Stephen Simpson

3

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

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


如果没有sysctl voodo,这可能是最好的答案...
Lester Cheung

如果仅在本地主机上侦听端口222仍然无济于事(该规则不会更改目标地址)
sanmai

在这种情况下,请使用-j DNAT --to-destination w.x.y.z:222
dresende

2

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

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

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

netcatnc),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
}
# 

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)
# 

确实,连接确实可以通过!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.