OpenBSD pf – 实现相当于iptables DNAT

简洁版本

服务器A(OpenBSD 4.7)连接到服务器B(Windows)。 服务器B的IP更改。 服务器A应该能够连接到服务器B旧的和新的IP。 我们无法在服务器B上configuration多个IP

长版

我们有一个OpenBSD服务器充当接入点(ssh + authpf规则),外部客户端连接,然后打开到另一个内部服务器上的服务的连接。 内部服务器IP将会改变。

为了让我们有更多的时间来重新configuration所有的客户端来使用新的IP地址,我想我们可以在OpenBSD框中实现相当于DNAT的function。 如果这是一个Linux机器,我可以使用下面的DNAT规则,这个规则可以让我从盒子本身连接到真实IP(10.68.32.215)或新IP上的远程服务。

$ sudo iptables -t nat -A OUTPUT -d 10.68.99.99 -j DNAT --to-dest 10.68.32.215 $ ssh-keyscan -t rsa 10.68.32.215 # 10.68.32.215 SSH-2.0-OpenSSH_4.3 10.68.32.215 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAy/GCd47aaRkBOu72v9Ysqk48Ngd6budStvdwnvMOTLiYoz6M81cTq7SskWctXx57cz6Ijnv1sbzcmDpFMUsN5vHk+6NxfrLzO0M1zh7UezY54FakgaavSdCiy15vGw/Lifntp5kMKkjgC5o42O+RUVw5iCpR8nsu/2/kR2smcVR1G3R8EunjCZWEptOCHz3Iup7FTMd4Pw/xmt+8u+5ZyHKu+uaLWQl6I12rzLiQJNyMLVdhba54FGiJDFUfcXtgM7cFli6xlrE3dnbboQE/7/cuj/N11QwTvHuU07NtrubefZE1VahWb146ph31blsW5NSiyFwL2I7rxFFoPQMbuQ== $ ssh-keyscan -t rsa 10.68.99.99 # 10.68.99.99 SSH-2.0-OpenSSH_4.3 10.68.99.99 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAy/GCd47aaRkBOu72v9Ysqk48Ngd6budStvdwnvMOTLiYoz6M81cTq7SskWctXx57cz6Ijnv1sbzcmDpFMUsN5vHk+6NxfrLzO0M1zh7UezY54FakgaavSdCiy15vGw/Lifntp5kMKkjgC5o42O+RUVw5iCpR8nsu/2/kR2smcVR1G3R8EunjCZWEptOCHz3Iup7FTMd4Pw/xmt+8u+5ZyHKu+uaLWQl6I12rzLiQJNyMLVdhba54FGiJDFUfcXtgM7cFli6xlrE3dnbboQE/7/cuj/N11QwTvHuU07NtrubefZE1VahWb146ph31blsW5NSiyFwL2I7rxFFoPQMbuQ== 

我们的OpenBSD版本是4.7,但是我们可以根据需要进行升级。 如果这个DNAT不可能的话,我们可能会在防火墙上做一个NAT。

我能够在testing框中完成的最接近的是:

 pass out on em1 inet proto icmp from any to 10.68.31.99 nat-to 10.68.31.247 

不幸的是, pfctl -s state告诉我, nat-to转换 IP,而我需要翻译的目的地。

 $ sudo pfctl -s state all icmp 10.68.31.247:7263 (10.68.30.199:13437) -> 10.68.31.99:8 0:0 

我也发现了很多关于以rdr开头的规则,并且包含->符号来表示翻译,但是看起来这个语法在4.7中已经过时了,而且我不能得到任何类似于工作的东西。 试图实现新的语法redirect规则失败:

 $ echo match out on em1 to 10.68.31.99 rdr-to 10.68.31.247 | sudo pfctl -f - stdin:1: rdr-to can only be used inbound 

当然,因为我试图redirect传出stream量,修改上面的规则“传入”也不起作用。

当前状态

结束在两台服务器之间的防火墙上应用NAT。 尽pipe从学术的angular度来看,这个技巧还是好奇的,如果在OpenBSD中这是可行的。

我不完全确定,如果这是你想要的,但我使用这种东西redirect到另一个IP的stream量。

 rdr pass on $ext_if proto icmp from any to $OLD_IP -> $NEW_IP 

语法没有testing,但可能工作

类似的工作在FreeBSD上


编辑

查看OpenBSD的manpages之后,这个语法可能会起作用:

 pass in on $ext_if proto icmp from any to $OLD_IP rdr-to $NEW_IP