Имеется FreeBSD 8.2, PF и ALTQ включены в ядро.
Два внешних интерфейса смотрящих на двух разных провайдеров ext_if и ext_if_yota имеющие адреса соответственно ext_ip и ext_ip_yota
Подробнее про yota, может это имеет значение: подключение через wimax роутер, соответственно через него ещё одна маршрутизация и на внутреннем интерфейсе серый адрес.
Один внутренний интерфейс (локальная сеть) int_if. Во внутренней сети находится почтовый сервер, FTP сервер, VPN сервер к которым нужно обращаться по ext_ip, так как обратные dns записи настроены именно на этот ip
Задачи в идеале:
1 - выпустить исходящий трафик по обоим каналам с возможностью переключения конфига либо на балансировку нагрузки между двумя каналами (round-robin), либо по спискам (этот список ip на один канал, этот список ip на другой канал)
2 - http трафик должен проходить через прозрачный squid
Задача для начала: заставить ходить трафик через squid по обоим каналам, так как сейчас всё полностью идёт через default gateway, которым является ip адрес из сети первого провадйера, а squid вообще не работает. Соответственно если сменить default gateway на ext_ip_yota, то весь трафик идёт на второму каналу, а почта перестаёт работать. Также не работает проброс из внешней сети на ftp сервер (может кто сразу увидит ошибку, что я там намудрил с ftp-proxy
Часть pf.conf
Код: Выделить всё
ext_if="em1"
ext_ip="80.X.X.X"
int_if="em0"
int_ip="192.168.0.1"
ext_if_yota="igb1"
ext_ip_yota="192.168.10.2"
int_net="192.168.0.0/24"
set block-policy drop
set skip on lo0
scrub in all
nat on $ext_if from $int_net to any -> ($ext_if)
nat on $ext_if_yota from $int_net to any -> ($ext_if_yota)
vpn="192.168.0.X"
mail="192.168.0.X"
ftp="192.168.0.X"
rdr pass on $ext_if proto tcp from any to $ext_if port {25,110,143} -> $mail
rdr pass on $ext_if proto tcp from any to $ext_if port 1723 -> $vpn
rdr pass on $ext_if proto gre from any to $ext_ip -> $vpn
rdr-anchor "ftp-proxy/*"
rdr pass on $ext_if proto tcp from any to $ext_if port {20,21} -> $ftp
rdr pass on $int_if inet proto tcp from $int_net to !$int_net port 80 -> $int_ip port 3128
# Deny all
block log all
# Antispoof
antispoof log for $int_ip
# From me to me
pass on lo0 all
# Pass all outgoing packets on internal interface
pass out on $int_if from any to $int_net
# Pass in quick any packets destined for the gateway itself
pass in quick on $int_if from $int_net to $int_if
# Load balance outgoing tcp traffic from internal network
pass in on $int_if route-to { ($ext_if $ext_ip), ($ext_if_yota $ext_ip_yota) } round-robin \
proto tcp from $int_net to any flags S/SA modulate state
# Load balance outgoing udp and icmp traffic from internal network
pass in on $int_if route-to { ($ext_if $ext_ip), ($ext_if_yota $ext_ip_yota) } round-robin \
proto {udp,icmp} from $int_net to any keep state
# General "pass out" rules for external interfaces
pass out on $ext_if proto tcp from any to any flags S/SA modulate state
pass out on $ext_if proto {udp,icmp} from any to any keep state
pass out on $ext_if_yota proto tcp from any to any flags S/SA modulate state
pass out on $ext_if_yota proto {udp,icmp} from any to any keep state
# Route packets from any IPs on $ext_if to $ext_ip and same for $ext_if_yota and $ext_ip_yota
pass out on $ext_if route-to ($ext_if_yota $ext_ip_yota) from $ext_if_yota to any
pass out on $ext_if_yota route-to ($ext_if $ext_ip) from $ext_if to any
ns1="80.X.X.X"
ns2="80.Y.Y.Y"
pass proto {tcp,udp} from {$ext_ip,$int_net} to {$ns1, $ns2} port 53 keep state
# FTP
anchor "ftp-proxy/*"
pass in on $ext_if inet proto tcp to $ext_if port 21
pass proto tcp from $int_net to $int_ip port 3128 keep state
Часть squid.conf
Код: Выделить всё
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
acl localnet src 192.168.0.0/24
acl nolimit_ip src "/usr/local/etc/squid/acl/nolimit_ip.conf"
acl deny_sites dstdomain "/usr/local/etc/squid/acl/deny_sites.conf"
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny to_localhost
http_access allow localnet
http_access allow localhost
http_access allow nolimit_ip
http_access deny localnet deny_sites
http_access deny all
http_reply_access allow all
icp_access allow all
miss_access allow all
http_port 192.168.0.1:3128 transparent
cache_mem 64 MB
cache_dir ufs /usr/local/etc/squid/cache 20000 16 256
access_log /var/squid/logs/access.log squid
cache_log /var/squid/logs/cache.log
cache_store_log /var/squid/logs/store.log
logfile_rotate 3
pid_filename /var/squid/logs/squid.pid
log_fqdn on
error_directory /usr/local/etc/squid/errors/ru
coredump_dir /usr/local/etc/squid/cache