如何使用 iptables 将本地主机流量转发到远程主机?

Jon*_*han 5 redhat routing iptables centos

我想设置我的 CentOS 6.5 机器以将与 localhost (127.0.0.1) 的连接转发到远程机器上的相同端口(例如 10.0.3.10)。

我已经尝试了下面的 iptables 规则,但是当我尝试连接时,它只是挂起:

iptables -t nat -I OUTPUT --src 0/0 --dst 127.0.0.1 -p tcp --dport 8888 \
    -j DNAT --to-destination=10.0.3.10:8888
Run Code Online (Sandbox Code Playgroud)

tcpdump在远程机器上运行,我可以看到没有传入流量。我已经做了一些谷歌搜索,但没有发现任何特别有用的东西。我还确认我的sysctl.conf文件包含net.ipv4.ip_forward = 1.

编辑我添加了日志记录以响应以下评论之一。当我去 127.0.0.1:8888 时它不产生输出,但去 10.0.3.10 时确实产生输出:

# Generated by iptables-save v1.4.7 on Tue Jul 29 12:52:17 2014
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [11:1008]
:OUTPUT ACCEPT [11:1008]
:LOGGING - [0:0]
-A OUTPUT -p tcp -m tcp -d 10.0.3.10 --dport 8888 -j LOGGING
-A LOGGING -j LOG --log-prefix "IPTABLES: "
-A LOGGING -j ACCEPT
-A OUTPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 8888 -j DNAT --to-destination 10.0.3.10:8
888
COMMIT
# Completed on Tue Jul 29 12:52:17 2014
# Generated by iptables-save v1.4.7 on Tue Jul 29 12:52:17 2014
*filter
:INPUT ACCEPT [50:2776]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:4336]
COMMIT
# Completed on Tue Jul 29 12:52:17 2014
Run Code Online (Sandbox Code Playgroud)

小智 6

该技巧涉及为您的出站接口启用 localhost/localnet 路由处理:

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

然后这有效:

iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 8888 -j DNAT --to-destination 10.0.3.10
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)


Huy*_*ens 4

我不知道如何在这台机器上配置 iptables 来做你想要的事情。在这种情况下我通常使用 SSH 隧道。我发现它很容易设置(这里是个人意见!);-)但是......你需要在本地主机上有一个 SSH 连接(不需要从远程访问!)。

本例中的命令语法为:

ssh -f -C -N -L [<bind address>:]<local port>:<remote host name>:<remote service port> [-p <ssh port>] [<username>@]<remote host outside name>
Run Code Online (Sandbox Code Playgroud)

所以对你来说这意味着:

ssh -f -C -N -L 127.0.0.1:8888:10.0.3.10:8888 localhost
Run Code Online (Sandbox Code Playgroud)