Назад | Перейти на главную страницу

Как маршрутизировать пакеты с сетевых интерфейсов на локальный хост?

Я настраиваю Orange Pi для соединения двух сетевых интерфейсов. Один из них подключен к шлюзу, другой - к сетевому интерфейсу термопринтера чеков. Я хотел бы перехватывать пакеты, отправляемые из сети, которые предназначены для принтера через порт 9100, чтобы я мог изменить их перед отправкой на принтер.

Моя аппаратная установка выглядит следующим образом: eth1 подключен к шлюзу, eth2 подключен к термопринтеру чеков со статическим IP 192.168.0.20.

На моем Orange pi я запускаю Linux 4.18.7, собранный из Yocto с пакетом поддержки платы OpenEmbedded.

Я предпринимаю следующие шаги для инициализации моста:

brctl addbr kc_bridge
brctl addif kc_bridge eth1
brctl addif kc_bridge eth2
ifconfig kc_bridge up

На этом этапе я могу проверить связь с принтером с любого устройства в той же сети и отправить его на печать (например, echo "Hello World" | nc 192.168.0.20 9100)

Затем я включаю маршрутизацию на localhost, включаю переадресацию ip и modprobe br_netfilter, чтобы включить маршрутизацию на мостах:

echo 1 > /proc/sys/net/ipv4/conf/all/route_localnet
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe br_netfilter

Затем я добавляю правило iptables, которое должно изменить адрес назначения на localhost любого пакета, предназначенного для принтера на порту 9100, и начинаю прослушивать этот порт:

iptables -t nat -A PREROUTING -d 192.168.0.20/32 -i kc_bridge -p tcp --dport 9100 -j DNAT --to-destination 127.0.0.1:9100
nc -l 9100

Я ожидал, что это покажет любые данные, которые направляются на localhost, но когда я отправляю данные на принтер с другого устройства в той же сети, они не отображаются здесь и не печатаются.

Используя tcpdump, я вижу, что пакеты не маршрутизируются на localhost, и соединение, похоже, не инициируется:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
09:31:14.821538 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578716123 ecr 0,nop,wscale 7], length 0
09:31:15.839876 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578717141 ecr 0,nop,wscale 7], length 0
09:31:17.856296 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578719157 ecr 0,nop,wscale 7], length 0
09:31:22.020901 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578723321 ecr 0,nop,wscale 7], length 0

Что мне не хватает для маршрутизации пакетов с мостовых сетевых интерфейсов на localhost?

Обновить

Используя команду iptables, я могу подтвердить, что правила iptables выполняются:

iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 400 packets, 77939 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   360 DNAT       tcp  --  kc_bridge *       0.0.0.0/0            192.168.0.20         tcp dpt:9100 to:127.0.0.1:9100

Chain INPUT (policy ACCEPT 2 packets, 120 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 291 packets, 25966 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 405 packets, 49112 bytes)
 pkts bytes target     prot opt in     out     source               destination   

Пакеты принимаются на всех портах:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 9100 -j ACCEPT
  1. Проверьте счетчики DNAT править с iptables-save -c -t nat команда. Он не должен быть нулевым.
  2. Также вы должны разрешить входящие пакеты для этого порта.
iptables -A INPUT -p tcp --dport 9100 -j ACCEPT
  1. Используйте инструмент conntrack для вывода списка таблицы conntrack. Ты можешь использовать conntrack -E отслеживать события conntrack в реальном времени.
  2. Проверить вывод ip route get 127.0.0.1 from 192.168.0.50 iif kc_bridge команда.