简洁版本

简洁版本

简洁版本

服务器 A(OpenBSD 4.7)连接到服务器 B(Windows)。服务器 B 的 IP 发生变化。服务器 A 应该能够通过旧 IP 和新 IP 连接到服务器 B。我们无法在服务器 B 上配置多个 IP。

长版本

我们有一台 OpenBSD 服务器作为接入点(ssh + authpf 规则),外部客户端可在此连接,然后打开与另一台内部服务器上的服务的连接。内部服务器 IP 即将更改。

为了给我们更多时间重新配置所有客户端以使用新的 IP 地址,我认为我们可以在 OpenBSD 机器上实现相当于 DNAT 的功能。如果这是一台 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。

我在测试箱上能够完成的最接近的结果是:

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 中已废弃我无法让任何类似的东西发挥作用。尝试实施新语法重定向规则失败,原因如下:

$ 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

当然,因为我试图重定向传出流量,将上述规则修改为“放入”也不起作用。

当前状态

最后在两台服务器之间的防火墙上应用了 NAT。成功了,但从学术兴趣来看,我仍然好奇这在 OpenBSD 中是否可行。

答案1

我不完全确定这是否是您想要的,但我使用类似这样的方法将流量重定向到另一个 IP。

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

语法尚未测试,但可能有效

FreeBSD 上也有类似的工作


编辑

查看 OpenBSD 手册页后,此语法可能有效:

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

答案2

我不认为pf可以做到这一点。pf有四种方法可以改变数据包:

  • route-to带有(和reply-to)选项的 数据包过滤规则
    • 这只会改变数据包的路由,而不会改变实际目的地
  • 规则nat
    • 这只会改变传出数据包的源地址/端口
  • 规则binat
    • 这只会改变传出数据包的源地址/端口和传入数据包的目标地址/端口。
    • (由于rdr是有状态的,我不明白为什么binat存在。)
  • 规则rdr
    • 这只会改变传入数据包的目标地址/端口

我试图将目标为 的传出数据包重定向10.193.130.31.5686210.0.0.30.56862。我可以在 Linux 上使用以下命令执行此操作iptables

sudo iptables -t nat -A OUTPUT -d 10.193.130.31 -p tcp --dport 56862 -j DNAT --to-destination 10.0.0.30

macOS我尝试通过添加以下内容来执行相同操作/etc/pf.conf

nat pass log (all) on en6 inet proto tcp from any to 10.193.130.31 port 56862 -> 10.0.0.30 port 56862

en6我的外部网络接口在哪里。

然后我添加了一个日志接口:

sudo ifconfig pflog0 create

最后,我重新加载了pf规则:

sudo pfctl -vf /etc/pf.conf

开头pf是:

sudo pfctl -e

然后是我的数据包tcpdump

sudo tcpdump 'tcp port 56862' -vv -lnttti en6

我创建了一个测试连接:

nc -v 10.193.130.31 56862

我在中看到了以下输出tcpdump

00:00:00.000000 rule 1/0(match): nat out on en6: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64)
  10.0.0.30.56862 > 10.193.130.31.56862: Flags [SEW], cksum 0x9730 (incorrect -> 0xd1e3), seq 3809148311, win 65535, options [mss 8961,nop,wscale 9,nop,nop,TS val 2314373431 ecr 0,sackOK,eol], length 0

这表明我的源已更改为10.0.0.30:56862,但目的地尚未改变。

当我使用规则运行类似的测试时rdr,没有得到任何输出(因为我没有传入数据包):

rdr pass inet proto tcp from any to 10.193.130.31 port 56862 -> 10.0.0.30 port 56862

相关内容