无法在多 IP CentOS 8 上设置传出 IP

无法在多 IP CentOS 8 上设置传出 IP

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/伪装规则来解决。

相关内容