简洁版本
服务器 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.56862
到10.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