我想REDIRECT
在 NATPREROUTING
链中创建一个 iptables 规则,将到端口 80 的连接重定向到 8080。但我只想对输入数据包(发往本机)执行此操作,而不是转发数据包(例如发往 Internet)。
在链中的规则中,有没有办法PREROUTING
区分发往本机的数据包和正在转发的数据包,并采取不同的处理方式?
理想的做法是不需要在规则中枚举特定的接口或 IP 地址,因为这种方式不太灵活(例如,如果接口或 IP 地址发生变化,则需要更新 iptables 规则,这会变得更加复杂)。
我还对使用 nftables 的等效功能感兴趣。
答案1
我认为你注定要手动列出所有“本地”IP 地址。根据我对这个 netfilter 数据包流图,直到后所有的 PREROUTING 链——这是有道理的,因为链毕竟被称为PRE路由...
答案2
我刚刚遇到了addrtype
模块,它似乎能够根据目标地址是否为本地地址来区分传入的数据包。因此,这可以用来区分输入数据包和转发数据包。
例如:
iptables -A PREROUTING -t nat -p tcp --dport 80 -m addrtype --dst-type LOCAL -j REDIRECT --to-port 8080
对于 nftables 来说,等价的似乎是fib
模块。但我还没有测试过。
nft add rule ip nat prerouting tcp dport 80 fib daddr . iif type local redirect to :8080