Linux가 잘못된 소스 IP를 선택함

Linux가 잘못된 소스 IP를 선택함

k8s 클러스터에서 실행 중인 EC2 인스턴스가 있습니다. 이 인스턴스에는 세 개의 카드로 구성된 세 개의 블록이 있습니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:9c:bb:70:ee:be brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.206/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 2821sec preferred_lft 2821sec
---
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:7a:d4:ac:64:b4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::7a:d4ff:feac:64b4/64 scope link
       valid_lft forever preferred_lft forever
9: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:54:4e:b4:b4:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.6.4/24 brd 10.0.6.255 scope global dynamic eth2
       valid_lft 2863sec preferred_lft 2863sec
    inet6 fe80::54:4eff:feb4:b4e8/64 scope link
       valid_lft forever preferred_lft forever

eth1은 아직 올바르게 구성되지 않았으므로 무시하십시오.

ping -I 10.0.6.4 www.google.cometh2에서 인터넷으로 ping()을 하면 Linux가 기본 인터페이스의 IP를 선택하는 것을 알 수 있습니다.

[ec2-user@ip-10-0-2-206 ~]$ sudo tcpdump -i eth2 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
14:19:08.968772 IP 10.0.2.206 > 142.251.42.36: ICMP echo request, id 17679, seq 9, length 64
14:19:09.992871 IP 10.0.2.206 > 142.251.42.36: ICMP echo request, id 17679, seq 10, length 64
14:19:11.016767 IP 10.0.2.206 > 142.251.42.36: ICMP echo request, id 17679, seq 11, length 64

보시다시피 소스 IP가 로 잘못 선택 10.0.2.206되었습니다 10.0.6.4.

[ec2-user@ip-10-0-2-206 ~]$ ip rule
0:      from all lookup local
511:    from 10.0.6.4 lookup 10002
512:    from all to 10.0.2.4 lookup main
512:    from all to 10.0.2.185 lookup main
512:    from all to 10.0.2.233 lookup main
1024:   from all fwmark 0x80/0x80 lookup main
32766:  from all lookup main
32767:  from all lookup default

[ec2-user@ip-10-0-2-206 ~]$ sudo ip route show table 10002
default via 10.0.6.1 dev eth2 src 10.0.6.4
10.0.6.0/24 dev eth2 proto kernel scope link src 10.0.6.4

[ec2-user@ip-10-0-2-206 ~]$ sudo ip route show table main
default via 10.0.2.1 dev eth0
default via 10.0.6.1 dev eth2 metric 10002
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.206
10.0.2.4 dev eni379b345d249 scope link
10.0.2.185 dev eni0231b3becdb scope link
10.0.2.233 dev eni5be9f7773c7 scope link
10.0.6.0/24 dev eth2 proto kernel scope link src 10.0.6.4
169.254.169.254 dev eth0

[ec2-user@ip-10-0-2-206 ~]$ ip route get 172.217.174.68 from 10.0.6.4
172.217.174.68 from 10.0.6.4 via 10.0.6.1 dev eth2 table 10002 uid 1000
    cache

모든 구성이 올바른 것 같지만 소스 주소는 여전히 기본 인터페이스에서 가져옵니다. 내가 무엇을 놓치고 있나요?

답변1

아직 보지 못한 유일한 곳주의 깊은iptables 입니다. 그 안에서 다음 항목을 발견했습니다.

Chain AWS-SNAT-CHAIN-0 (1 references)
target     prot opt source               destination
AWS-SNAT-CHAIN-1  all  --  anywhere            !ip-10-0-0-0.xxxx.compute.internal/16  /* AWS SNAT CHAIN */

Chain AWS-SNAT-CHAIN-1 (1 references)
target     prot opt source               destination
SNAT       all  --  anywhere             anywhere             /* AWS, SNAT */ ADDRTYPE match dst-type !LOCAL to:10.0.2.206 random-fully

더 자세히 검색해 본 주제에 대한 AWS 설명서를 찾았습니다.https://docs.aws.amazon.com/eks/latest/userguide/external-snat.html

명령을 실행했을 때 문서에 따르면 가상 머신에서 항목이 제거되었습니다 kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true.SNAT

완료되면 eth2의 ping에 올바른 소스 IP가 표시됩니다 10.0.6.4.

관련 정보