我理解IPTables 中prerouting
和postrouting
链的作用,但我不明白output
和input
链的作用。因此,在 NATing 中,我们使用中的
更改目标 IP 或端口,或使用 中的 或 更改源 IP 以将回复发送到正确的接口。DNAT
prerouting
SNAT
MASQURADE
postrouting
input
在这种情况下,我发现和链毫无用处output
。有人能快速给我解释一下它们(input
和)吗?output
答案1
INPUT
并OUTPUT
遍历链以查找在本地机器上运行的应用程序传送和发送的数据包。
如果应用程序发出一个数据包,它会遍历
app -> OUTPUT -> POSTROUTING -> interface
相反,传送到应用程序的数据包会穿过
interface -> PREROUTING -> INPUT -> app
当转发的数据包穿过
interface -> PREROUTING -> FORWARD -> POSTROUTING -> interface
请注意,MASQUERADE
只是的一个特例SNAT
,其中源地址取自接口。
另请参阅这张照片或者您可以在iptables
教程中找到许多类似的内容。
编辑
如果您要DNAT
对从应用程序发送的数据包执行操作,则必须使用OUTPUT
,因为DNAT
仅在中有效PREROUTING
,并且从应用程序传出的数据包永远不会遍历PREROUTING
。
同样地,对于SNAT
,INPUT
并且POSTROUTING
在将应用程序发送到 应用程序 的情况下,虽然我不确定SNAT
中的当前状态INPUT
,但它可能已损坏并且实际上无法工作。
由于大多数伪装发生在路由器转发数据包时,因此您不会经常看到此类应用程序。
答案2
INPUT/OUTPUT 链中的 NAT 表允许对 Linux 路由器内部本地生成的流量进行 NAT 操作。
如果在 POSTROUTING/PREROUTING 中使用 NAT,则意味着要转发/已转发的流量和发往本地计算机的流量都将被 NAT
如果您只想对本地机器的流量进行 NAT 并保持转发的流量完好无损,则可以在 INPUT/OUTPUT 中使用 NAT。
例如:您有一个 Linux 路由器,它同时用作 DNS 服务器,由于特殊原因,您需要更改本地 DNS 流量的目标端口,但又不想改变路由流量,那么您可以使用 NAT INPUT/OUTPUT。