Bridge + nftables: как перенаправить входящий трафик HTTP/HTTPS на локальный порт 8080?
Я настроил мост и хотел бы перенаправить трафик HTTP/HTTPS, проходящий по нему, на локальный порт (8080), чтобы можно было далее обрабатывать его с помощью mitmproxy.
До сих пор я использовал комбинацию правил ebtables и iptables. К сожалению, мне пришлось узнать, что eatables больше не поддерживает таблицу «broute» и вместо этого мне следует использовать nftables .
Используемое программное обеспечение:
- КАЛИ Линукс 2019.4
- nftables v0.9.2
- митмппрокси v4.0.4
Как я создавал мост:
root@kali:~# ip link add name br0 type bridge
root@kali:~# ip link set dev br0 up
root@kali:~# ip link set dev eth0 master br0
root@kali:~# ip link set dev eth2 master br0
Мои интерфейсы:
root@kali:~# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.178.67 netmask 255.255.255.0 broadcast 192.168.178.255
ether 00:01:c0:1b:4b:31 txqueuelen 1000 (Ethernet)
root@kali:~# ifconfig eth2
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:01:c0:1b:4b:b2 txqueuelen 1000 (Ethernet)
root@kali:~# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::e8c3:adff:fe19:f804 prefixlen 64 scopeid 0x20<link>
inet6 2003:e5:3f18:d100:201:c0ff:fe1b:4b31 prefixlen 64 scopeid 0x0<global>
ether 00:01:c0:1b:4b:31 txqueuelen 1000 (Ethernet)
Моя таблица маршрутизации:
root@kali:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default fritz.box 0.0.0.0 UG 0 0 0 br0
192.168.178.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
Сначала я думал, что моей цели будет довольно легко достичь. Тем не менее, оказалось, что nftables (пока) не поддерживает и 'broute' (см. этот пост). К счастью, в сообщении также упоминалось обходное решение.
Тем не менее, мне потребовалось довольно много времени, чтобы все это реализовать. Поэтому я решил задокументировать то, что делаю. Пожалуйста, не стесняйтесь комментировать или предлагать еще лучшее решение.
Спасибо!
Тоби
1 ответ
Вот что сработало для меня:
root@kali:~# nft add table bridge t1
root@kali:~# nft add chain bridge t1 c1 { type filter hook prerouting priority 0\; }
root@kali:~# nft add rule bridge t1 c1 tcp dport 80 meta pkttype set host ether daddr set 00:01:c0:1b:4b:31 counter
root@kali:~# nft add rule bridge t1 c1 tcp dport 443 meta pkttype set host ether daddr set 00:01:c0:1b:4b:31 counter
root@kali:~# nft add table inet t2
root@kali:~# nft add chain inet t2 c2 { type nat hook prerouting priority 0\; }
root@kali:~# nft add rule inet t2 c2 tcp dport 80 counter redirect to 8080
root@kali:~# nft add rule inet t2 c2 tcp dport 443 counter redirect to 8080
Правила в цепочке «c1» отвечают за изменение адреса назначения Ethernet трафика HTTP(S) на MAC-адрес локального устройства, а правила в цепочке «c2» перенаправляют порты назначения TCP с 80/443 на 8080, где mitmproxy слушает.
Наконец, вот как я запустил mitmproxy:
root@kali:~# mitmproxy —-mode transparent —-showhost —-set block_global=false
Это не идеально, но, по крайней мере, мне кажется, что это работает.