我有一个使用端口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:编辑地址方案。
我有一个使用端口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:编辑地址方案。
Answers:
您正在使用的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(或任何您的网卡是)。
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标签
route_localnet更新时间(2012年6月7日)比我的内核更新(2.6.30-std-def-alt15#1 SMP Mon Dec 14 UTC 2009年UTC)。好的,我将通过转发过程netcat(nc)xinetd,或的端口转发选项ssh(当然,后者无效且愚蠢)来简单地实现所需的端口转发(从外到内)。因为很好,这种可能性就在那里)。
sysctl -w net.ipv4.conf.all.route_localnet=1
您可以重定向到localhost,但不能重定向到回送(127.0.0.0/8)。环回是一个漏洞。您必须重定向到您的真实界面之一。尝试使用REDIRECT。
iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222
-j DNAT --to-destination w.x.y.z:222
如果正确答案route_localnet不起作用怎么办?
如果您的内核不包含的补丁route_localnet,那么...升级内核!
或者,通过运行侦听外部接口并转发流量的进程,还有其他方法可以将进入一个接口的流量转发到另一个接口的另一个端口(特别是本地主机)。
netcat(nc),xinetd和ssh(可能还有更多)都是能够执行此操作的程序示例(尽管选择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)
#
确实,连接确实可以通过!