Налаштуйте маршрутизацію та 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.