2013/08/12

интернет два провайдера с dhcp

Вводная.
  1. два провайдера
  2. у обоих dhcp
  3. хотелка использовать обоих
  4. Все материалы предоставленные в статье вы используете на свой страх и риск (это типа моя отмазка)

Ну что кодим
1. Я взял за основу вот эти статьи + напильник
2. переименовываем сетевые интерфейсы в системе (изменения применяться после reboot) мне нравятся осмысленые названия сетёвок
/etc/udev/rules.d/70-persistent-net.rules
# PCI device 0x1969:/sys/devices/pci0000:00/0000:00:1c.5/0000:08:00.0 (atl1c)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="04:7d:7b:a8:bc:0c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth_inet1"

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.1/0000:02:00.0 (iwlwifi)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="74:e5:0b:db:cf:cc", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="eth_inet2"


3. да и не забываем что надо подправить /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth_inet1
iface eth0 inet dhcp


auto eth_inet2
iface eth0 inet dhcp
auto br_kvm iface br_kvm inet static pre-up brctl addbr $IFACE address 172.17.0.1 netmask 255.255.255.0










4. Включаем nat  /etc/sysctl.d/nat.conf
net.ipv4.ip_forward=1

5. делаем две таблицы /etc/iproute2/rt_tables
11    t_eth_inet1
12    t_eth_inet2

6. ставим пакет iptables-persistent и создаём базовый файл
/etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Sun Aug 11 16:33:05 2013
*filter
:INPUT DROP [36:4565]
:FORWARD DROP [0:0]
:OUTPUT DROP [1:40]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sun Aug 11 16:33:05 2013

7. Переходим к dhcp-client (он у меня выполняет всю грязную работу)
/etc/dhcp/dhclient.conf переопределяем скрипт
script "/etc/dhcp/dhclient-script";

8. копируем скрипт из /sbin/dhclient-script в /etc/dhcp/dhclient-script
и накладываем изменения
--- /sbin/dhclient-script 2013-05-28 03:00:32.000000000 +0600
+++ /etc/dhcp/dhclient-script 2013-08-10 00:10:17.000000000 +0600
@@ -235,7 +235,7 @@
                 fi
 
                 # set default route
-                ip -4 route add default via ${router} dev ${interface} \
+                ip -4 route add default via ${router} dev ${interface} table t_${interface} \
                     ${if_metric:+metric $if_metric} >/dev/null 2>&1
 
                 if [ -n "$if_metric" ]; then
@@ -313,7 +313,7 @@
 
             # set default route
             for router in $new_routers; do
-                ip -4 route add default via ${router} dev ${interface} \
+                ip -4 route add default via ${router} dev ${interface} table t_${interface} \
                     ${if_metric:+metric $if_metric} >/dev/null 2>&1
 
                 if [ -n "$if_metric" ]; then

Делаем так чтоб скрипт писал gw каждого провайдера в свою таблицу

9. Важный скрипт он делает nat, gw
/etc/dhcp/dhclient-exit-hooks.d/nat
# vim:set syntax=sh
#         set >/tmp/000
nat_interface="br_kvm"
nat_subnet="172.17.0.0/24"
gw_list=""

RUN="yes"

if [ "$RUN" = "yes" ]; then
 if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] || [ "$reason" = "TIMEOUT" ]; then
      #Файрвол
      if [[ "`iptables -S FORWARD | grep "o ${interface}" | grep ${nat_interface}`" == *${nat_subnet}* ]]; then
         nat_str="`iptables -S FORWARD | grep "o ${interface}" | grep ${nat_interface} | tail -n 1 | cut -f 2- -d' '`"
         iptables -D ${nat_str}
         nat_str="`iptables -S FORWARD | grep "i ${interface}" | grep ${nat_interface} | tail -n 1 | cut -f 2- -d' '`"
         iptables -D ${nat_str}
      fi
      iptables -A FORWARD -s ${nat_subnet} -i ${nat_interface} -o ${interface} -j ACCEPT
      iptables -A FORWARD -d ${nat_subnet} -i ${interface} -o ${nat_interface} -j ACCEPT 
      #nat
      if [[ "`iptables -t nat -S POSTROUTING | grep ${interface}`" == *${nat_subnet}* ]]; then
         nat_str="`iptables -t nat -S POSTROUTING | grep ${interface} | grep ${nat_subnet}| tail -n 1 | cut -f 2- -d' '`"
         iptables -t nat -D ${nat_str}
      fi
      iptables -t nat -A POSTROUTING -s ${nat_subnet} -o ${interface} -j SNAT --to ${new_ip_address}
      #разброс трафика по интерфейсам
      if [[ "`ip rule show | grep ${interface}`" == *t_${interface}* ]]; then
         nat_str="`ip rule show | grep ${interface} | tail -n 1 | cut -f 2- -d':'`"
         ip rule del ${nat_str}
      fi
      ip rule add from ${new_ip_address} lookup t_${interface}
      #gw
      for i in `ifconfig | grep "Link encap" | grep "eth_inet" | awk '{printf $1" "}'`; do
         if [[ `ip route show table t_${i} | grep "default"` == *default* ]] ; then
            gw_list="${gw_list} nexthop `ip route show table t_${i} | grep "default" | cut -f 2- -d' '` weight 1 "
         fi
      done
         ip route del default
         ip route add default scope global ${gw_list}
 fi
fi

Собственно всё
и на последок файл nat.tat.xz https://drive.google.com/folderview?id=0Bxc-zRqh3G-fYUpvZ0NBNGd4c1E&usp=sharing

Комментариев нет:

Отправить комментарий