我正在尝试仅使用 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 地址。
\
规则中没有要求。它仅用于将规则分成两行。