Налаштуйте маршрутизацію та iptables для нового VPN-з'єднання для переадресації ** лише ** порти 80 та 443


8

У мене є нове VPN-з'єднання (за допомогою openvpn), яке дозволяє мені прокладати деякі обмеження провайдера. Хоча це працює добре, він забирає весь трафік через vpn. Це викликає у мене проблеми з завантаженням (моє підключення до Інтернету набагато швидше, ніж дозволяє vpn), і з віддаленим доступом. Я запускаю ssh-сервер і запускаю демон, який дозволяє мені планувати завантаження через телефон.

У мене є існуюче Ethernet-з'єднання на eth0, а нове VPN-з'єднання на tun0.

Я вважаю, що мені потрібно встановити маршрут за замовчуванням, щоб використовувати моє існуюче з'єднання eth0 в мережі 192.168.0.0/24, і встановити шлюз за замовчуванням на 192.168.0.1 (мої знання хиткі, оскільки я цього не робив протягом багатьох років ). Якщо це правильно, то я не зовсім впевнений, як це зробити !. Моя поточна таблиця маршрутів:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         10.51.0.169     0.0.0.0         UG    0      0        0 tun0     0     0      0
10.51.0.1       10.51.0.169     255.255.255.255 UGH   0      0        0 tun0     0     0      0
10.51.0.169     0.0.0.0         255.255.255.255 UH    0      0        0 tun0     0     0      0
85.25.147.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0     0     0      0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0

Після виправлення маршрутизації, я вважаю, що мені потрібно використовувати iptables, щоб налаштувати передпрограмування або маскування, щоб змусити все для порту призначення 80 або 443 через tun0. Знову ж таки, я не зовсім впевнений, як це зробити!

Все, що я знайшов в Інтернеті, намагається зробити щось набагато складніше, а намагатися сортувати деревину з дерев виявляється складною.

Будь-яка допомога буде дуже вдячна.

ОНОВЛЕННЯ

Поки з різних джерел я спільно сформував наступне:

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

Зараз це, здається, працює. За винятком цього немає!

Підключення до заблокованих веб - сайти будуть йти через, з'єднання не на порти 80 і 443 будуть використовувати з'єднання без VPN.

Однак підключення порту 80 і 443, які не є заблокованими веб-сайтами, також використовують підключення, яке не є VPN!

Оскільки загальна мета була досягнута, я порівняно щасливий, але було б непогано знати, чому це працює не так правильно.

Будь-які ідеї?

Для довідки, тепер у мене є 3 таблиці маршрутизації, основна, Інтернет та vpn. Перелік їх такий:

Основні:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 

Інтернет:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 
192.168.0.1 dev eth0  scope link  src 192.168.0.73

VPN:

default via 10.38.0.205 dev tun0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1

Наведений вище сценарій працює як очікувалося. Я просто очікував побачити трафік від адреси 10. у netstat. Однак весь трафік бере початок з 192 року, але порт 80 і 443 спрямований через VPN. Я вирішу все рішення у відповідь, але підказки @anttir пропонують iproute2 та fwmark. Я не натрапив на них, і без них я все одно бив головою об цегляну стіну!
Стів

Відповіді:


4

Отже, більшість цього вище, але все рішення було таким:

Редагувати / etc / iproute2 / rt_tables та додати 2 рядки внизу:

101 internet
102 vpn

Ви можете дати цим таблицям інші імена, які мають більше сенсу, просто будьте послідовними.

Тоді вам потрібно створити сценарій (я його назвав rt_setup) в /etc/init.d

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

Тоді, очевидно, зв’яжіть його з /etc/rc2.d (я використовую ubuntu, runlevel може відрізнятися для вас). Переконайтеся, що ви надаєте йому номер S вище, ніж посилання openvpn!

Сценарій робить ряд речей. У верхній частині встановлюються змінні, з деякими твердженнями perl та awk, які використовуються для підбору динамічних IP-адрес та адрес шлюзу. Другий розділ очищає таблиці, які ви встановлюєте в ipruote2, та копіює в них поточну таблицю маршрутизації. Потім він створює два нові маршрути і два шлюзи за замовчуванням для них, при цьому VPN - один через VPN, а Інтернет - через мою локальну мережу.

Я не впевнений, що наступні 2 рядки необхідні, але вони дозволяють ip переадресацію для використання в iptables.

Далі сценарій створює деякі правила, де шукати трафік, що походить з відповідної IP-адреси, і де шукати, якщо трафік спеціально позначений.

РОЗРОБКА та ПЕРЕВІРКА гарантують, що трафік, який походить з адреси, отримує відповідь!

Кінцевий параметр iptables PREROUTING - це частина тегів трафіку і забезпечує те, що все, що йде до портів 80 або 443, позначено для використання Таблиці 2 (VPN)

Останні два рядки видаляють шлюз VPN із таблиці маршрутизації за замовчуванням та додають назад мій шлюз локальної мережі.

На даний момент процес працює чудово. VPN запускається по мірі появи машини, і цей сценарій запускається через кілька секунд (я можу додати стан сну лише для того, щоб VPN повністю ініціалізувався перед запуском цього сценарію). Моє з'єднання з віддаленим доступом (ssh тощо) чудово працює. Мої з'єднання, які не переходять до портів 80 або 443, використовують моє локальне з'єднання, але весь веб-трафік проходить через VPN та обходить елементи управління, встановлені моїм провайдером!

Як я сказав у коментарі під своїм запитанням, я б навіть не почав дивитись на цей маршрут без пропозиції @anttir. Позаду з цією пропозицією, сайти http://blog.khax.net/2009/11/28/multi-gateway-routing-with-iptables-and-iproute2/ та http://linux-ip.net/ html / adv-multi-internet.html були дуже корисними (навіть якщо код не на 100% повний!)


1
Одне остаточне доповнення, я додав a sleep 20у верхній частині сценарію, оскільки підключення openvpn не закінчилось вчасно. Я також додав echo 2 > /proc/sys/net/ipv4/conf/tun0/rp_filterдо сценарію, оскільки необхідно відключити фільтр зворотного пакету для tun0. Коли відповідь повертається з tun0 з адресою джерела S, фільтр зворотного пакета перевіряє, "якщо я повинен перенести пакет на адресу S, і він би не пройшов через tun0, я скину пакет" - і тому, коли роблю це пошук не існує дійсного Fwmark, він визначає, що маршрут був би звичайним маршрутом за замовчуванням, тому він скидає пакет.
Стів

Мені довелося відредагувати ваш сценарій, щоб він працював на мене. Останній рядок, route add default gw 192.168.0.1 eth0здавалося, спрямовував трафік порту 80/443 через локальний шлюз замість tun0 за призначенням. Зміна останнього рядка на, route add default tun0здається, робить для мене трюк.

1

маршрутизація за протоколом є складним. Зазвичай таблиця маршрутизації використовується для перевірки шлюзу відповідно до IP-адреси призначення та використання або openvpn, або шлюзу за замовчуванням 192.168.0.1.

Простіше було б встановити, наприклад, Squid http-проксі на іншому кінці VPN та встановити браузер для використання проксі.

Ви б не використовували iptables, оскільки це змінило б IP-адресу призначення HTTP-з'єднання, і воно не працюватиме.

Ви можете створити нову таблицю маршрутизації (/ etc / iproute2 / rt_tables) з маршрутом за замовчуванням, встановленим до кінцевої точки VPN, використовуйте iptables fwmark (-j MARK) для позначення всіх HTTP-пакетів, а потім використовуйте ip правило для створення спеціального правила позначені пакети для використання нової таблиці маршрутизації.


Спасибі за вашу допомогу. Я обов'язково погляну на них. Речі дещо складні в тому, що я не маю контролю над кінцем сервера, просто моя сторона. Крім того, я не можу використовувати кальмари, тому що мені потрібно маршрутизувати трафік https через з'єднання, і кальмар не так добре працює з цим.
Стів

Як щодо маршрутизації лише декількох IP-адрес через VPN та інший світ поза VPN?
Antti Rytsölä

Я думав про маршрутизацію лише декількох IP-адрес, але список змінюється, коли сайти рухаються, і мені потрібно зробити це простою у використанні для інших користувачів ПК. Я почав переглядати налаштування нової таблиці маршрутизації та маркування пакетів. Позначення пакетів було легким бітом, це не так впевнені таблиці маршрутизації. Я можу встановити для VPN, що виглядає правильно, і одного для всього іншого, що виглядає правильно, але я не впевнений, що робити з main, оскільки це все ще встановлено за замовчуванням (Що таке VPN). Досі грає ...
Стів

linux-ip.net/html/adv-multi-internet.html ip правило show та ip rule add fwmark 4 таблиця 4 пріоритет 10000
Antti Rytsölä

До оригіналу додано оновлення, яке деталізує, де я поки що! А-а! Щойно зрозумів, що я відредагував вашу відповідь, а не моє запитання. Вибачте! Я цього не використовував і не розумів, що можу відредагувати відповідь іншої людини!
Стів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.