我正在尝试使用 pf 将外部 IP 地址转发到另一个外部 IP 地址。等效的 iptables 命令是iptables -t nat -A OUTPUT -d [ipaddress1] -j DNAT --to-destination [ipaddress2]
。
我已经在我的 pf.conf 中尝试了各种形式的 nat 和 rdr,例如:($int_if
是内部接口、$ext_if
外部接口、$out_ad
是 ipaddress1(要重定向的地址)和$res_ad
是 ipaddress2(要重定向到的地址)
nat on $int_if from 127.0.0.1 to $out_ad -> $res_ad
rdr pass on $ext_if proto tcp from $out_ad to $res_ad -> 127.0.0.1
rdr pass on $int_if proto tcp from 127.0.0.1 to $out_ad -> $res_ad
rdr pass log proto tcp from any to $out_ad -> $res_ad
nat from $out_ad to $res_ad -> 127.0.0.1
nat on $ext_if from $out_ad to $res_ad -> $ext_if
rdr on $int_if proto tcp from any to $out_ad -> $res_ad
rdr pass quick on $ext_if proto tcp from any to $out_ad -> $res_ad
这些似乎都不起作用。我sysctl net.inet.ip.forwarding=1
也设置了。任何帮助都将不胜感激。谢谢
答案1
sysctl net.inet.ip.forwarding=1
这只会在您的机器上启用路由。如果您创建一个允许任何目标 IP 到达外部接口(至少在理论上),它就可以工作(在此示例中,10.20.30.40 是您的最终目的地)
pass in inet proto tcp from any to 10.20.30.40
(只是一个想法)
但是你的 rdr 规则将不起作用,因为它们恰好位于同一个接口上,而(根据一些论坛帖子)这是不允许的,或者根本不起作用
另一方面,公共 NAT 规则应该可以工作,但是您将丢失最终目的地的原始 IP 地址。(有意的?)
nat on $ext_if inet from any to 10.20.30.40 -> ($ext_if:0) port 1024:65535
pass on $ext_if inet from any to 10.20.30.40 keep state
(或同代理状态)
为了调试目的,尝试启用规则的日志记录(通过将日志添加到 pass 规则,启用 pflog 和以下命令)
/etc/rc.conf
...
pflog_enable="YES"
pflog_logfile="/var/log/pflog
...
# tcpdump -i pflog0 -n -e -ttt
哦,也许请提供一些简单的网络结构;)