Centos 7 с двумя сетевыми интерфейсами в одной сети, один из которых не отвечает на пинг извне
У меня только что установлен centos7 с 2 активными интерфейсами в той же сети, как это IP-шоу addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 40:a8:f0:1e:50:54 brd ff:ff:ff:ff:ff:ff
inet 213.78.236.190/26 brd 213.78.236.191 scope global eno1
valid_lft forever preferred_lft forever
inet6 fe80::42a8:f0ff:fe1e:5054/64 scope link
valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 40:a8:f0:1e:50:55 brd ff:ff:ff:ff:ff:ff
4: eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 40:a8:f0:1e:50:56 brd ff:ff:ff:ff:ff:ff
inet 213.78.236.175/26 brd 213.78.236.191 scope global eno3
valid_lft forever preferred_lft forever
inet6 fe80::42a8:f0ff:fe1e:5056/64 scope link
valid_lft forever preferred_lft forever
5: eno4: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 40:a8:f0:1e:50:57 brd ff:ff:ff:ff:ff:ff
таблица маршрутизации выглядит следующим образом:
default via 213.78.236.129 dev eno1
213.78.236.128/26 dev eno1 proto kernel scope link src 213.78.236.190
213.78.236.128/26 dev eno3 proto kernel scope link src 213.78.236.175
проблема в том, что у меня есть доступ только к интерфейсу с 213.78.236.190 из внешнего мира, то есть из другой сети. Я могу пинг-это, подключиться к SSH сделать все, что угодно. Но на 213.78.236.175 я могу подключиться только из локальной сети. Он не отвечает на пинг извне, я вижу пакеты, поступающие по tcpdump, но ответа нет.
iptables чистый
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Я знаю, что это должно работать, потому что это заменяет centos6 с подобной конфигурацией и на centos 6, работавшей с самого начала, просто настройте ip на обоих интерфейсах и gw по умолчанию на одном интерфейсе. Я отключил NetworkManager, я подозревал, что он что-то напутал. Я включил ip_forwarding в sysctl.conf
cat /proc/sys/net/ipv4/ip_forward
1
даже если я не думаю, что мне нужно. Я вижу пакеты icmp, приходящие извне в tcpdump, но ничего не выходит. Ниже описано, что произойдет, если я пингуюсь с машины 213.65.165.84. Ip, который я пингую, является 213.78.236.175
tcpdump -i eno3 -n -p| grep ICMP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno3, link-type EN10MB (Ethernet), capture size 65535 bytes
10:52:09.531494 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 23, length 64
10:52:10.531489 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 24, length 64
10:52:11.531492 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 25, length 64
10:52:12.531483 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 26, length 64
tcpdump -i eno1 -n -p| grep ICMP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno1, link-type EN10MB (Ethernet), capture size 65535 bytes
и это то, что происходит, если я пинг другой IP 213.78.236.190 с той же машины
tcpdump -i eno1 -n -p| grep ICMP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno1, link-type EN10MB (Ethernet), capture size 65535 bytes
10:58:45.973485 IP 213.65.165.84 > 213.78.236.190: ICMP echo request, id 16705, seq 5, length 64
10:58:45.973522 IP 213.78.236.190 > 213.65.165.84: ICMP echo reply, id 16705, seq 5, length 64
10:58:46.973483 IP 213.65.165.84 > 213.78.236.190: ICMP echo request, id 16705, seq 6, length 64
10:58:46.973515 IP 213.78.236.190 > 213.65.165.84: ICMP echo reply, id 16705, seq 6, length 64
После того, как kasperd заметил, я обновил запись с помощью tcpdump с параметром -p, чтобы предотвратить случайный режим, и проверил в wireshark, чтобы увидеть, что запросы ping приходят с правильным mac-адресом. Таким образом, проблема заключается в том, что ядро по какой-то причине отбрасывает пакеты.
3 ответа
Хотя вы упомянули, что iptables был чистым, вы упомянули, что вы недавно установили CentOS 7, поэтому мне было интересно, активен ли программный брандмауэр по умолчанию для CentOS 7, firewalld, и, если да, блокирует ли он эхо-ответы ICMP для одного из его зоны. Например, если firewalld активен, для его GUI запуск firewall-config и проверка "ICMP Filter" для каждой зоны покажет, есть ли фильтры для "echo-request" и "echo-reply". Если он блокировал их, вы все равно могли видеть эхо-запросы с помощью tcpdump. Вы также можете проверить с помощью "firewall-cmd --list-all-zone", ища строку "icmp-blocks" для каждой зоны.
Проблема заключается в изменении RHEL 6 и более поздних версий, а также изменения настроек rp_filter в ядре. Посмотрите на http://access.redhat.com/solutions/53031
Я могу придумать одно объяснение, которое соответствует всем описанным симптомам. На маршрутизаторе была настроена статическая запись ARP, сопоставляющая этот IP-адрес с MAC-адресом интерфейса на старом сервере.
Когда пакеты поступают извне, маршрутизатор не отправляет никакого запроса ARP, поскольку у него уже есть запись для этого IP-адреса.
Коммутатор при получении пакетов будет искать MAC-адрес назначения в своей CAM, но не найдет его, потому что старый сервер с таким MAC-адресом больше не находится в этой сети. Таким образом, коммутатор будет транслировать пакеты на все интерфейсы (кроме того, от которого он получил пакет).
Когда вы запускаете tcpdump на сервере, интерфейс по умолчанию переключается в случайный режим. В случайном режиме отображаются все пакеты, даже если их адрес назначения не совпадает. Если вы использовали -p
флаг tcpdump, сетевой интерфейс будет игнорировать эти пакеты и не отправлять их ядру.
Ядро доставляет пакеты в tcpdump, но стек IP не обрабатывает их из-за неправильного MAC-адреса назначения.
При отправке эхо-запроса с другого хоста в локальной сети запись ARP на маршрутизаторе не влияет ни на что. Другой хост отправит запрос ARP, а ваш сервер отправит ответ ARP. В этих случаях эхо-запросы будут отправлены на правильный MAC-адрес. Таким образом, эхо-запросы будут видны только правильному интерфейсу, и, поскольку MAC-адрес назначения является правильным, стек IP будет обрабатывать эти пакеты.