>Иметь свою AS неплохо, но тут тоже есть подводные камни. Ладно если
>канал упал и лежит, а если пропадание скачет? Время перестройки таблиц
>и анонсирование на рутерах занимает длительное время, если туда-сюда скакать, до
>20 минут может уйти. Лично у меня получилось вот так:
eth0 - локальная сеть, она же для канала №2
eth0:1 - локальная сеть для VPN-щиков.
eth1 - канал №1 в интернет
eth1.100 - VLAN между офисом и складом, проброшенный внутри канала №1
ppp0-pppXX - VPN подключения пользователей за пределами офиса/склада.
192.168.0.XXX - локальные пользователи.
Ограничения: всего 2 физических интерфейса, непонимание разных-там-протоколов и всякой всячины. Только Linux-платформа. Срок выполнения с отрицательным значением.
Задача: создать сказку для всех пользователей.
Результат: пользователи из офиса/склада ходят там, где надо (мир + локал), внешние пользователи могут использовать как внутренние, так и внешние сервисы.
=== скрипт
#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
#
# удалить все действующие правила
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# Всегда принимать трафик на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT
# Разрешить соединения, которые инициированы изнутри (eth0)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT
###
# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8800 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5190 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 6880:7000 -j REDIRECT --to-port 3128
# Слушаем почтовые порты и перенаправляем на почтовый сервер.
iptables -t nat -A PREROUTING -p tcp --dst 62.182.X.Y --dport 25 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 25 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dst 62.182.X.Y --dport 110 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 110 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dst 62.182.X.Y --dport 587 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 587 -j ACCEPT
# ADSL-модем настроен роутером (по некоторым причинам) и форвардит 4 порта на Fedora-box
# перенаправляем со второго интерфейса почту на почтовый сервер.
iptables -t nat -A PREROUTING -p tcp --dst 192.168.0.195 --dport 587 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 587 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dst 192.168.0.195 --dport 110 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 110 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dst 192.168.0.195 --dport 143 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 143 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dst 192.168.0.195 --dport 25 -j DNAT --to-destination 192.168.0.222
iptables -A FORWARD -i eth1 -d 192.168.0.222 -p tcp --dport 25 -j ACCEPT
# Разрешаем соединение с PPTP-сервером для всех;
iptables -A INPUT -m tcp -p tcp --dport 1723 -j ACCEPT
# Разрешаем протокол GRE для всех;
iptables -A INPUT -p gre -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -m state --state NEW -p gre -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -m state --state NEW -p gre -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state NEW -p gre -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW -p gre -j ACCEPT
#
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth0 -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth1 -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
# World for warehouse:
iptables -A FORWARD -i eth1.100 -o eth0 -j ACCEPT
# чтобы можно было много раз запускать скрипт.
/sbin/ip rule del table 1
/sbin/ip rule del table 2
/sbin/ip rule del table 1
/sbin/ip rule del table 2
/sbin/ip rule del table 1
/sbin/ip rule del table 2
/sbin/ip rule del table 1
/sbin/ip rule del table 2
/sbin/ip rule del table 1
/sbin/ip rule del table 2
#Задание правил маршрутизации IP по источнику для DSL
/sbin/ip rule add from 192.168.0.195 lookup 1
/sbin/ip route add 192.168.0.0/24 via 192.168.0.195 table 1
/sbin/ip route add 192.168.100.0/24 via 192.168.100.1 table 1
/sbin/ip route add 0/0 via 192.168.0.205 table 1
#Задание правил маршрутизации IP по источнику
#для кабельного модема
/sbin/ip rule add from 62.182.X.Y lookup 2
/sbin/ip route add 192.168.0.0/24 via 192.168.0.195 table 2
/sbin/ip route add 192.168.100.0/24 via 192.168.100.1 table 2
/sbin/ip route add 0/0 via 62.182.X.Y table 2
/sbin/ip route add default equalize nexthop via 62.182.X.Y dev eth1 weight 1 nexthop via 192.168.0.205 dev eth0 weight 2
# Включить forward
echo 1 > /proc/sys/net/ipv4/ip_forward
=== конец скрипта
=== вывод /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:YY:XX
inet addr:192.168.0.195 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: xxxxxxxxxxxxxxxxxxxxx Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4882528 errors:0 dropped:0 overruns:0 frame:0
TX packets:4852570 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1807257021 (1.6 GiB) TX bytes:1667394752 (1.5 GiB)
Interrupt:21 Base address:0x6000
eth0:1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.1.195 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:21 Base address:0x6000
eth1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:62.182.X.Y Bcast:62.182.X.Z Mask:255.255.255.252
inet6 addr: xxxxxxxxxxxxxxxxxxxx Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3515408 errors:0 dropped:0 overruns:0 frame:0
TX packets:1371371 errors:0 dropped:0 overruns:0 carrier:0
collisions:11090 txqueuelen:1000
RX bytes:993204705 (947.1 MiB) TX bytes:250501114 (238.8 MiB)
Interrupt:20 Base address:0xa400
eth1.100 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.100.1 Bcast:192.168.100.7 Mask:255.255.255.248
inet6 addr: xxxxxxxxxxxxxxxxxxxxx Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18898 errors:0 dropped:0 overruns:0 frame:0
TX packets:24132 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1297122 (1.2 MiB) TX bytes:32352819 (30.8 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:63621 errors:0 dropped:0 overruns:0 frame:0
TX packets:63621 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:84760923 (80.8 MiB) TX bytes:84760923 (80.8 MiB)
# пользовательские подключения:
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.1.195 P-t-P:192.168.1.152 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1
RX packets:51537 errors:0 dropped:0 overruns:0 frame:0
TX packets:50700 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:4715996 (4.4 MiB) TX bytes:14402777 (13.7 MiB)
ppp1 Link encap:Point-to-Point Protocol
inet addr:192.168.1.195 P-t-P:192.168.1.154 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1
RX packets:36127 errors:0 dropped:0 overruns:0 frame:0
TX packets:33257 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:2996923 (2.8 MiB) TX bytes:6929575 (6.6 MiB)
=== конец /sbin/ifconfig
=== вывод /sbin/route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.152 * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.154 * 255.255.255.255 UH 0 0 0 ppp1
62.182.X.Z * 255.255.255.252 U 0 0 0 eth1
192.168.100.0 * 255.255.255.248 U 0 0 0 eth1.100
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
default 62.182.X.Z 0.0.0.0 UG 0 0 0 eth1
=== конец /sbin/route
Ключевой момент: в настройках у eth0 и eth1 не указаны шлюзы (gateway) по-умолчанию.
Скрипт может иметь лишние строчки, но времени на оптимизацию банально нету. И так работает :)