我的 UBuntu 服务器上设置了以下监听端口:IP。
12.345.67.890:3636
它可以完美地接收请求,但是,我现在想将对该 IP:PORT 的任何请求转发到另一个 IP:PORT,即:
09.876.54.321:3636
本质上我想做一个转发请求12.345.67.890:3636 -> 09.876.54.321:3636
。
我该如何在终端中进行操作?如果我想将其改回来,我该怎么做?还有没有办法测试数据是否正在转发以及是否设置正确?
谢谢!
编辑:我可以按如下方式操作吗,只是想知道如何测试它以及如何禁用它?
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 3636 -j DNAT --to-destination 09.876.54.321:3636
iptables -t nat -A POSTROUTING -j MASQUERADE
答案1
问题中的命令足以启用路由和转发12.345.67.890:3636到09.876.54.321:3636。
使用 iptables 的 LOG 目标来监视正在发生的事情:
iptables -I FORWARD -j LOG
您应该在 /var/log/syslog 中看到类似这样的内容:
Aug 19 08:43:23 hostname kernel: [190951.964227] IN=eth0 OUT=eth0 SRC=11.22.33.44 DST=09.876.54.321 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=51600 DF PROTO=TCP SPT=41960 DPT=3636 WINDOW=246 RES=0x00 ACK URGP=0
- SRC: 源 IP 地址
- DST:目标 IP 地址
- SPT:源端口
- DPT:目的端口
刷新 iptables 规则以清理所有内容:
iptables -F
答案2
禁用端口转发
到那个时刻删除端口路由功能,没有给出关闭转发的答案(已在 Ubuntu 18.04.2 上进行实验验证)。
致谢:@DT.DTDG 的问题表述得非常准确,谢谢。这个问题加上@Eric 的回答帮助我解决了一些问题,谢谢!我对这个主题进行了进一步的研究,所以我想与社区分享这些知识。
清除规则
为了清理路由规则,您需要将其从 NAT 路由表 (网络地址转换表) 中删除。您可以通过以下方式实现此目的:
iptables -F -t nat
否则:如果您错过了“-t nat”参数,问题中提到的规则将继续有效(例如在 Ubuntu 18.04.2 中)。
关闭转发
此外,内核参数需要单独的命令。如果您想要全部清理,您还必须:
sysctl net.ipv4.ip_forward=0
通常来说强烈建议不要启用在接口之间转发数据包在非路由器的系统中,出于安全原因。
附录
所有操作通常都需要提升的权限,请在之前
sudo
或以“root”身份运行它们。Ad-acta。配置路由的命令:
CUR_PORT = 当前机器端口
DES_IP = 目标机器 IP 地址
DES_PORT = 目标机器端口
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport CUR_PORT -j DNAT --to-destination DES_IP:DES_PORT
iptables -t nat -A POSTROUTING -j MASQUERADE
答案3
我正尝试做类似的事情并偶然发现了这一点。
运行了问题中给出的两个命令。但一切都失败了。我无法 curl google.com,甚至无法在同一台服务器上运行 curl 服务。
罪魁祸首是第二个命令。
$ iptables -t nat -A POSTROUTING -j MASQUERADE
这会在 iptables 中创建一条规则,例如
21 286 19120 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
删除此规则可修复该问题。
为了删除上述规则,请在相同的命令中更改-A
为:-D
$ sudo iptables -t nat -D PREROUTING -p tcp --dport 8585 -j DNAT --to-destination 192.168.1.101:80
$ sudo iptables -t nat -D POSTROUTING -j MASQUERADE