使用 iptables 在网络之间路由数据包

使用 iptables 在网络之间路由数据包

我正在尝试仅使用 iptables 创建某种代理。

Linux 计算机(我的代理)有两个端口:

  • p2p1 连接到互联网。
  • em1 连接到本地网络。

本地网络上有两台设备(不包括linux机器)。要连接到这些,我们应该(从互联网上的任何计算机)键入:

  • xx.xx.xx.xx:10001
  • xx.xx.xx.xx:10002

其中 xx.xx.xx.xx 是公共 IP(并且是动态的)。

可以通过访问以下 IP 从 em1 端口上的 linux 机器访问这些设备:

  • 192.168.3.100:80
  • 192.168.3.101:80

因此,在 p2p1 上路由到 xx.xx.xx.xx:10001 的所有流量都应重新定向到 em1 上的 192.168.3.100。

我还需要保留源 IP 或类似的内容,以便数据包能够找到返回的路径。

这是我在 IP 表脚本中使用的内容。

iptables -t nat -F  # Clear out any old rules.

MyIP=10.27.155.200
MyPort=10001
DestIP=192.168.3.100
DestPort=80

iptables -t nat -A PREROUTING --dst $MyIP -p tcp --dport $MyPort -j DNAT --to-destination $DestIP:$DestPort
iptables -t nat -A POSTROUTING -p tcp --dst $DestIP --dport $DestPort -j SNAT --to-source $MyIP
iptables -t nat -A OUTPUT --dst $MyIP -p tcp--dport $MyPort -j DNAT --to-destination $DestIP:$DestPort

显然存在一些问题,因为我的 IP 是动态的,但我每次都对其进行硬编码。此外,数据包一旦返回计算机,就不知道如何到达其原始来源。

我不知道从这里该去哪里。

答案1

要转发端口,您需要做的第一件事是使用以下两种方法之一在内核中启用转发:

  • /proc以 root身份修改设置;仅持续到重新启动为止:

    echo 1 > /proc/sys/net/ipv4/ip_forward

  • 修改设置/etc/sysctl.conf;这是持久的:

    附加net.ipv4.ip_forward=1/etc/sysctl.conf然后执行$ sudo sysctl -p

您需要做的第二件事是iptables使用以下语法配置转发规则:

iptables -t nat -A PREROUTING -i [external_interface] -p [protocol] \ 
--dport [external_port] -j DNAT --to-destination [internal_ip]:[internal_port]

所以使用你的脚本:

external_iface=p2p1
iptables -t nat -A PREROUTING -i $external_iface -p tcp \
--dport $MyPort -j DNAT --to-destination ${DestIP}:${DestPort}

这会将所有流量从 psp1 上的端口 10001(无论其 IP 地址如何)转发到 192.168.3.100 上的端口 80。在 192.168.3.100 上,流量似乎来自分配给 em1 的任何 IP 地址。

\规则中没有要求。它仅用于将规则分成两行。

相关内容