Hetzner 的 CentOS 8 服务器有一个通过 DHCP 获取的主 IP 和一个额外的 /29 子网。无论我选择哪个传出 IP,数据包始终通过主 IP 发送。我想为不同的服务(即 DNS 和 SMTP)选择不同的传出 IP。
匿名设置:
- 主 IP:1.0.0.213/27
- 次要子网:2.0.0.88/29
- 测试IP:2.0.0.89
- 网卡:enp3s0
添加 IP 次要子网:
$ nmcli con modify enp3s0 ipv4.addresses "2.0.0.89/32"
$ reboot
配置:
$ ip addr
1: lo: ...
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
inet 2.0.0.89/32 scope global noprefixroute enp3s0
valid_lft forever preferred_lft forever
inet 1.0.0.213/27 brd 1.0.0.223 scope global dynamic noprefixroute enp3s0
valid_lft 43105sec preferred_lft 43105sec
inet6 ...
inet6 ...
$ ip route
default via 1.0.0.193 dev enp3s0 proto dhcp metric 100
1.0.0.192/27 dev enp3s0 proto kernel scope link src 1.0.0.213 metric 100
使用我们在其他地方托管的 what's-my-ip 服务进行测试:
$ curl -v -v -v -v -v --silent --interface 2.0.0.89 ip.mycompany.tld
* Rebuilt URL to: ip.mycompany.tld/
* Trying XX.XX.XX.XX...
* TCP_NODELAY set
* Name '2.0.0.89' family 2 resolved to '2.0.0.89' family 2 <-- correctly bound to 2.0.0.89?
* Local port: 0
* Connected to ip.mycompany.tld (XX.XX.XX.XX) port 80 (#0)
> GET / HTTP/1.1
...
1.0.0.213 <-- Expected 2.0.0.89 here?!?
匿名 tcpdump 确认我们正在使用主 IP:
16:29:57.850153 IP (tos 0x0, ttl 64, id 4961, offset 0, flags [DF], proto TCP (6), length 60)
1.0.0.213.47307 > XX.XX.XX.XX.http: Flags [S], cksum 0xcae8 (incorrect -> 0x3f22), seq 1180758295, win 29200, options [mss 1460,sackOK,TS val 4199670061 ecr
0,nop,wscale 7], length 0
16:29:57.861321 IP (tos 0x0, ttl 57, id 0, offset 0, flags [DF], proto TCP (6), length 60)
XX.XX.XX.XX.http > 1.0.0.213.47307: Flags [S.], cksum 0xe167 (correct), seq 1203046991, ack 1180758296, win 28960, options [mss 1460,sackOK,TS val 255416431
1 ecr 4199670061,nop,wscale 7], length 0
16:29:57.861374 IP (tos 0x0, ttl 64, id 4962, offset 0, flags [DF], proto TCP (6), length 52)
1.0.0.213.47307 > XX.XX.XX.XX.http: Flags [.], cksum 0xcae0 (incorrect -> 0x8064), seq 1, ack 1, win 229, options [nop,nop,TS val 4199670072 ecr 2554164311]
, length 0
16:29:57.861468 IP (tos 0x0, ttl 64, id 4963, offset 0, flags [DF], proto TCP (6), length 133)
1.0.0.213.47307 > XX.XX.XX.XX.http: Flags [P.], cksum 0xcb31 (incorrect -> 0xf6dc), seq 1:82, ack 1, win 229, options [nop,nop,TS val 4199670072 ecr 2554164
311], length 81: HTTP, length: 81
Hetzner 的其他 IP 支持页面:https://docs.hetzner.com/robot/dedicated-server/ip/additional-ip-adresses/
我这里遗漏了什么?:-)
- CentOS 8.2.2004
- 防火墙 + 网络管理器
- 已启用 SELinux
答案1
你需要改变你的默认路由到您要使用的 IP 地址。您的输出显示1.0.0.213
当前默认值。类似:
ip route replace default via 1.0.0.193 dev eth0 src 2.0.0.89
答案2
显然这是因为我在民众区域,然后就忘了这件事了。我这样做的原因是允许 Docker 容器访问互联网。显然,这会导致所有非主 IP 伪装成主 IP,即使它们在接口上列出。
关闭伪装并重新启动即可解决问题:
$ firewall-cmd --remove-masquerade --zone=public --permanent
$ reboot
这确实给我留下了容器连接问题,但可能可以通过更精确的 SNAT/伪装规则来解决。