Как перенаправить трафик, используя альтернативную таблицу маршрутизации с ipfw?
Я пытался встроить обратный прокси в инфраструктуру компании. У нас есть 2 оптических линии ISP.
- tun0 - интерфейс первого провайдера, выходные пакеты должны использовать fib=0, шлюз ip xxxx
- vr1 - интерфейс второго провайдера, выходные пакеты должны использовать fib=1, шлюз ip yyyy
- vr0 - интерфейс локальной сети, шлюз ip 192.168.0.1
Второй интерфейс провайдера был настроен через ipfw.
Конфигурация ipfw выглядела так:
ipfw -f -q flush
ipfw nat 1 config if vr1 deny_in same_ports reset redirect_port tcp 192.168.0.3:80 80
ipfw add 00010 check-state :default
ipfw add 00020 setfib 1 log logamount 200 tag 2 ip from any to any tagged 1 keep-state :default
ipfw add 00050 nat 1 log logamount 200 tag 1 ip from any to any via vr1
ipfw add 00100 allow ip from any to any via lo0
ipfw add 00200 deny ip from any to 127.0.0.0/8
ipfw add 00300 deny ip from 127.0.0.0/8 to any
ipfw add 00400 deny ip from any to ::1
ipfw add 00500 deny ip from ::1 to any
ipfw add 00600 allow ipv6-icmp from :: to ff02::/16
ipfw add 00700 allow ipv6-icmp from fe80::/10 to fe80::/10
ipfw add 00800 allow ipv6-icmp from fe80::/10 to ff02::/16
ipfw add 00900 allow ipv6-icmp from any to any ip6 icmp6types 1
ipfw add 01000 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
ipfw add 65000 allow ip from any to any
so it translates traffic from port 80 on vr1 interface to web server in local network and sets fib=1 for packets from second provider. Log looks like this:
Feb 13 10:37:34 gateway kernel: ipfw: 50 Nat TCP 146.185.157.19:36346 84.204.61.126:80 in via vr1
Feb 13 10:37:34 gateway kernel: ipfw: 20 SetFib 1 TCP 146.185.157.19:36346 192.168.0.3:80 out via vr0
Feb 13 10:37:34 gateway kernel: ipfw: 20 SetFib 1 TCP 192.168.0.3:80 146.185.157.19:36346 in via vr0
Feb 13 10:37:34 gateway kernel: ipfw: 20 SetFib 1 TCP 192.168.0.3:80 146.185.157.19:36346 out via vr1
Feb 13 10:37:34 gateway kernel: ipfw: 50 Nat TCP 192.168.0.3:80 146.185.157.19:36346 out via vr1
That i need to do is to direct traffic to 127.0.0.1:8088 or 192.168.0.1:8088 so it goes to reverse proxy.
То, что я сделал, было:
ipfw -f -q flush
ipfw add 00005 setfib 1 log logamount 200 all from any to any via vr1 keep-state
ipfw add 00010 fwd localhost,8088 log logamount 200 all from any to me 80 in via vr1
ipfw add 00015 allow ip from any to any
at first sight it works but when i look in log i see
журнал:
Feb 13 11:21:18 gateway kernel: ipfw: 5 SetFib 1 TCP 146.185.157.19:55774 84.204.61.126:80 in via vr1
Feb 13 11:21:18 gateway kernel: ipfw: 10 Forward to [::1]:8088 TCP 146.185.157.19:55774 84.204.61.126:80 in via vr1
Feb 13 11:21:18 gateway kernel: ipfw: 5 SetFib 1 TCP 84.204.61.126:80 146.185.157.19:55774 out via tun0
So it goes out via tun0. Nothing outs via vr1. Нехорошо. I'd like to know how do i tell ipfw to make traffic run from vr1 back to vr1. setfib seems doesn't work. I don't have much experience in tuning firewalls, and i'm totally stuck. Я не знаю. Maybe i should use nat to 192.168.0.1. Я пытался, но безрезультатно. Это выглядело так:
ipfw nat 1 config if vr1 deny_in same_ports reset redirect_port tcp 192.168.0.1:8088 80
ipfw add 00010 check-state :MEGAFON_INBOUND
ipfw add 00020 setfib 1 log logamount 200 ip from any to any tagged 1 keep-state :MEGAFON_INBOUND
ipfw add 00050 nat 1 log logamount 200 tag 1 ip from any to any via vr1
ipfw add 00060 allow ip from any to any
журнал:
ipfw: 50 Nat TCP 146.185.157.19:51022 84.204.61.126:80 in via vr1
И это все. Что я делаю неправильно? I don't even know if i should use nat, fwd or divert. I'll appreciate any clue.
0 ответов
Ну вот чего я добился после сильной головной боли
#!/bin/sh
ipfw -f -q flush
ISP1_IF="tun0"
ISP2_IF="vr1"
LAN_IF="vr0"
REDIRECT_PORTS_ISP1="redirect_port tcp 127.0.0.1:8088 80
redirect_port tcp 192.168.0.3:443 443
redirect_port tcp 192.168.0.4:25 25
redirect_port tcp 192.168.0.4:587 587
redirect_port tcp 192.168.0.4:465 465
redirect_port tcp 192.168.0.4:143 143
redirect_port tcp 192.168.0.4:993 993
redirect_port tcp 192.168.0.4:110 110
redirect_port tcp 192.168.0.11:8008 8008
redirect_port tcp 192.168.0.11:8448 8448
redirect_port tcp 192.168.0.5:3000 55000"
REDIRECT_PORTS_ISP2="redirect_port tcp 127.0.0.1:8089 80
redirect_port tcp 192.168.0.3:443 443
redirect_port tcp 192.168.0.4:25 25
redirect_port tcp 192.168.0.4:587 587
redirect_port tcp 192.168.0.4:465 465
redirect_port tcp 192.168.0.4:143 143
redirect_port tcp 192.168.0.4:993 993
redirect_port tcp 192.168.0.4:110 110
redirect_port tcp 192.168.0.11:8008 8008
redirect_port tcp 192.168.0.11:8448 8448
redirect_port tcp 192.168.0.5:3000 55000"
ipfw nat 1 config if ${ISP1_IF} deny_in reset same_ports ${REDIRECT_PORTS_ISP1}
ipfw nat 2 config if ${ISP2_IF} deny_in reset same_ports ${REDIRECT_PORTS_ISP2}
ipfw add 00300 check-state :isp1
ipfw add 00400 check-state :isp2
ipfw add 00500 set 1 skipto 02000 all from any to any in recv ${LAN_IF}
ipfw add 00500 set 2 skipto 03000 all from any to any in recv ${LAN_IF}
ipfw add 01000 skipto 02000 all from any to any in recv ${ISP1_IF}
ipfw add 01100 skipto 03000 all from any to any in recv ${ISP2_IF}
ipfw add 01200 skipto 02000 all from any to any out xmit ${ISP1_IF}
ipfw add 01300 skipto 03000 all from any to any out xmit ${ISP2_IF}
ipfw add 01400 skipto 04000 all from any to any
# 2000 - 2999 : isp1
# nat
ipfw add 02000 nat 1 all from any to any in recv ${ISP1_IF}
ipfw add 02100 skipto 02200 all from any to any keep-state :isp1
ipfw add 02200 setfib 0 all from any to any in recv ${LAN_IF}
ipfw add 02300 setfib 0 all from 127.0.0.1 to any out
# nat
ipfw add 02400 nat 1 all from any to any out xmit ${ISP1_IF}
ipfw add 02500 skipto 04000 all from any to any out xmit ${ISP1_IF}
# nat
ipfw add 02600 nat 1 all from 127.0.0.1 to any out
ipfw add 02999 skipto 04000 all from any to any
# 3000 - 3999 : isp2
# nat
ipfw add 03000 nat 2 all from any to any in recv ${ISP2_IF}
ipfw add 03100 skipto 03200 all from any to any keep-state :isp2
ipfw add 03200 setfib 1 all from any to any in recv ${LAN_IF}
ipfw add 03300 setfib 1 all from 127.0.0.1 to any
# nat
ipfw add 03400 nat 2 all from any to any out xmit ${ISP2_IF}
ipfw add 03500 skipto 04000 all from any to any out xmit ${ISP2_IF}
# nat
ipfw add 03600 nat 2 all from 127.0.0.1 to any out
ipfw add 03999 skipto 04000 all from any to any
ipfw add 60000 allow all from any to 127.0.0.1 8088
ipfw add 60000 allow all from any to 127.0.0.1 8089
ipfw add 61000 allow ip from any to any via lo0
ipfw add 61010 deny ip from any to 127.0.0.0/8
ipfw add 61020 deny ip from 127.0.0.0/8 to any
ipfw add 61030 deny ip from any to ::1
ipfw add 61040 deny ip from ::1 to any
ipfw add 61050 allow ipv6-icmp from :: to ff02::/16
ipfw add 61060 allow ipv6-icmp from fe80::/10 to fe80::/10
ipfw add 61070 allow ipv6-icmp from fe80::/10 to ff02::/16
ipfw add 61080 allow ipv6-icmp from any to any ip6 icmp6types 1
ipfw add 61090 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
ipfw add 65000 allow ip from any to any
/etc/sysctl.conf
net.inet.ip.fw.one_pass=0
Также мне нужно было запустить два экземпляра traefik
setfib 0 traefik
на порт 8088 и
setfib 1 traefik
по порту 8089
потому что в противном случае трафик от обоих провайдеров прекратился, когда демон ppp вышел из строя (на интерфейсе tun0)
также я переключаю fib для dnsmasq, когда переключаюсь на другого провайдера
переключиться на второго провайдера я делаю
ipfw set disable 1