Здесь есть множество примеров того, как пересылать IP-трафик на Linux-машине, и несколько примеров того, как пересылать трафик с одного интерфейса на другой. Однако большинство последних примеров связано с подключением одной машины к Интернету - у меня есть FPGA, подключенная к машине с Windows, с коробкой Redhat в качестве посредника.
FPGA выдает данные в eth 0 блока redhat, которые затем я хочу переслать машине Windows на eth 1. И FPGA, и окно Windows находятся в разных подсетях, а машина redhat используется, потому что fpga имеет линия 40G выходит из него, а у машины Windows нет карты 40G (скорости передачи данных для этого конкретного случая достаточно низки, чтобы линия 40G не была близка к необходимой - она не должна переполнять линию выхода 1G на eth1). Я пробовал это (безрезультатно):
sudo iptables -t nat -A POSTROUTING -d <windows ip> --out-interface eth1 -j MASQUERADE
sudo iptables -A FORWARD -d <fpga's ip> --in-interface eth0 -j ACCEPT
Я уже изменил sysctl, чтобы разрешить пересылку через ipv4.
Если я открою шлюзы и скажу машине redhat отправить все, что получает на eth0, на eth1, он отправит какой-то mDNS-запрос на eth1 и ничего не переадресовывает ... Я использую wirehark для просмотра трафика на коробке Redhat.
Я не любитель нетворкинга, поэтому я буду благодарен за объяснение того, что я делаю / не делаю.
Спасибо.
РЕДАКТИРОВАТЬ: Может быть, мне нужно прояснить один момент: IP-адрес назначения пакетов FPGA не является машиной Windows; это коробка красной шляпы. Я хочу, чтобы redhat отправлял копию пакета в Windows.
ОБНОВИТЬ:
После небольшого осмотра; Я нашел ответ: MAC-адрес FPGA и MAC-адрес карты redhat 40G не синхронизировались должным образом. Исправив это, я решил мою проблему.
Первое: вам нужен NAT? Пока можно предположить, что он вам нужен, иначе вы можете пропустить первый iptables
введенную вами команду и настроить статический маршрут (или, возможно, настроить маршрут по умолчанию для Windows через поле RedHat). В остальном первое правило верно.
По второй команде: вы добавили правило «принимать» пересылку входящего трафика от eth0
на IP-адрес FPGA, что я считаю неправильным, потому что трафик из ПЛИС, поэтому команда выглядит примерно так:
$ sudo iptables -A FORWARD -s <FPGA's ip> -i eth0 -j ACCEPT
Затем вам нужно правило, разрешающее потоку трафика в обратном направлении:
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Также вы должны увидеть, добавляется ли (-A
) правило правильное (например, если есть другие правила, которые могут помешать). Вы можете увидеть текущую конфигурацию с помощью iptables -vnL FORWARD
. Помните, что правила оцениваются от первого до последнего: выигрывает первый матч.
PS: Я предлагаю вам добавить правило, разрешающее пинг ICMP для отладки проблем сети / маршрутизации:
$ sudo iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
$ sudo iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT