Назад | Перейти на главную страницу

как туннелировать только определенные хосты через клиент openvpn на томате

Я относительно новичок в мире сетевых технологий, хотя я занимался кодированием и знаю кое-что из системного администратора в течение длительного времени. и вот я всего в одном шаге от места назначения.

В целом картина такова: дома я использую один LinkSys E3000 в качестве шлюза (пока не знаю, его имя), беспроводной точки доступа и никаких других устройств маршрутизации / коммутации. Он обслуживает 1 ПК и 1 Mac с LAN, 1 Mac Mini + 1 iPad + 2 смартфона с WIFI.

Моя цель - использовать клиент openvpn на E3000 (с томатной прошивкой) и пропускать через него весь WiFi-трафик моего iPad и смартфона, а для других устройств маршрут остается тем же маршрутом, отличным от openvpn.

Пока я могу подключить клиент openvpn на E3000 к серверу openvpn, туннелировать весь трафик всех моих устройств через это соединение openvpn. Остается только выбрать способ маршрутизации по IP-адресу источника (по крайней мере, как я предполагаю) в туннель, не беспокоя других.

Я выучил некоторые «iptables» и «route» за последние несколько дней, но без особого успеха, так что вот мой вопрос. Вот некоторая информация, которая поможет вам получить структуру.

ifconfig -a output, некоторые бесполезные строки разделены полосами, а в веб-интерфейсе C0: C1: C0: 1A: E0: 28 - WAN, C0: C1: C0: 1A: E0: 27 - LAN, C0: C1: C0: 1A : E0: 29 - это точка доступа Wi-Fi 2,4G, C0: C1: C0: 1A: E0: 2A - точка доступа Wi-Fi 5G.

корень @ маршрутизатор: / tmp / home / root # ifconfig -a

br0 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 27
inet addr: 192.168.1.1 Bcast: 192.168.1.255 Маска: 255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU: 1500 Метрика: 1

eth0 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 27
ВВЕРХ ТРАНСЛЯЦИИ МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1

eth1 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 29
ТРАНСЛЯЦИЯ ВВЕРХ ВСЕГО МУЛЬТИ-МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1

eth2 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 2A
ТРАНСЛЯЦИЯ ВВЕРХ ВСЕГО МУЛЬТИ-МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1

lo Link encap: Локальный шлейф
inet адрес: 127.0.0.1 Маска: 255.0.0.0 inet6 адрес: :: 1/128 Область: Хост

ppp0 Link encap: протокол точка-точка
inet адрес: 172.200.1.43 P-t-P: 172.200.0.1 Маска: 255.255.255.255 ТОЧКА ВВЕРХ ТОЧКА ВЫПОЛНЯЕТСЯ МУЛЬТИКАСТ MTU: 1480 Метрика: 1

vlan1 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 27
ТРАНСЛЯЦИЯ ВВЕРХ ВСЕГО МУЛЬТИ-МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1

vlan2 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 28
ВВЕРХ ТРАНСЛЯЦИИ МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1

wl0.1 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 29
MULTICAST MTU: 1500 Метрическая система: 1

brctl показать вывод

root@router:/tmp/home/root# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.c0c1c01ae027   no      vlan1
                            eth1
                            eth2

перед скриптом маршрутизации openvpn

root@router:/tmp/home/root# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.200.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         172.200.0.1     0.0.0.0         UG    0      0        0 ppp0

push-сервер openvpn

PUSH: Received control message: 'PUSH_REPLY,redirect-gateway,dhcp-option DNS 8.8.8.8,route 172.20.0.1,topology net30,ping 10,ping-restart 120,ifconfig 172.20.0.6 172.20.0.5'

стандартный сценарий маршрутизации openvpn

Apr 24 14:52:06 router daemon.notice openvpn[1768]: /sbin/ifconfig tun11 172.20.0.6 pointopoint 172.20.0.5 mtu 1500
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 72.14.177.29 netmask 255.255.255.255 gw 172.200.0.1
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 172.20.0.5
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 172.20.0.5
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 172.20.0.1 netmask 255.255.255.255 gw 172.20.0.5

маршрут после openvpn

root@router:/tmp/home/root# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.20.0.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun11
72.14.177.29    172.200.0.1     255.255.255.255 UGH   0      0        0 ppp0
172.200.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
172.20.0.1      172.20.0.5      255.255.255.255 UGH   0      0        0 tun11
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         172.20.0.5      128.0.0.0       UG    0      0        0 tun11
128.0.0.0       172.20.0.5      128.0.0.0       UG    0      0        0 tun11
0.0.0.0         172.200.0.1     0.0.0.0         UG    0      0        0 ppp0

кое-что, что я заметил и попробовал: * в веб-интерфейсе клиента openvpn есть опция «Создать NAT в туннеле», если я проверю это, есть следующий сценарий (вероятно, выполняется после установления соединения openvpn)

root@router:/tmp/home/root# cat /tmp/etc/openvpn/fw/client1-fw.sh
#!/bin/sh
iptables -I INPUT -i tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.1.0/255.255.255.0 -o tun11 -j MASQUERADE

если я сниму отметку с этой опции, последняя строка не появится. Тогда я предполагаю, что моя проблема будет решена с помощью команд iptables и NAT, у меня просто недостаточно знаний, чтобы понять их. Я пробовал бежать

iptables -t nat -I POSTROUTING -s 192.168.1.6 -o tun11 -j MASQUERADE

вручную после подключения openvpn (192.168.1.6 - это IP-адрес моего iPad), затем мой iPad получает доступ в Интернет с туннелем openvpn, однако все другие устройства не могут подключиться к Интернету.

в случае необходимости вот iptables о NAT

root@router:/tmp/home/root# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            192.168.1.0/24      
WANPREROUTING  all  --  0.0.0.0/0            172.200.1.43        
upnp       all  --  0.0.0.0/0            172.200.1.43        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
SNAT       all  --  192.168.1.0/24       192.168.1.0/24      to:192.168.1.1 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain WANPREROUTING (1 references)
target     prot opt source               destination         
DNAT       icmp --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.1 

Chain upnp (1 references)
target     prot opt source               destination         
DNAT       udp  --  0.0.0.0/0            0.0.0.0/0       udp dpt:5353 to:192.168.1.3:5353 

Заранее спасибо за то, что помогли и прочитали это так много, я надеюсь, что я сделал все, что вам нужно, чтобы помочь :)

Я делал что-то немного по-другому, но все равно добивался того же. Думал, что поделюсь этим здесь.

Я настроил свой маршрутизатор Tomato как клиент OpenVPN, чтобы он маршрутизировал ВСЕ интернет-трафик через VPN. Для этой цели я использовал службу StrongVPN.com, и они предоставили пошаговые инструкции, поэтому выполнить эту часть было довольно легко. Google "Tomato OpenVPN Setup Tutorial StrongVPN", и вы найдете его

Но с «выборочной маршрутизацией только для определенных хостов» было очень сложно.

В итоге я реализовал его как сценарий «WAN UP» (в графическом интерфейсе Tomato: Администрирование-> Скрипты-> WAN UP). Код ниже - это то, что я положил в эту коробку. В нем много комментариев, объясняющих, что происходит. Он во многом основан на коде, который я нашел здесь:

http://linksysinfo.org/index.php?threads/route-only-specific-ports-through-vpn-openvpn.37240/

И чтение этой статьи было чрезвычайно полезным:

http://linux-ip.net/html/adv-multi-internet.html

Вот код:

# This code goes in the WAN UP section of the Tomato GUI.
#
# This script configures "selective" VPN routing. Normally Tomato will route ALL traffic out
# the OpenVPN tunnel. These changes to iptables allow some outbound traffic to use the VPN, and some
# traffic to bypass the VPN and use the regular Internet instead.
#
#  To list the current rules on the router, issue the command:
#      iptables -t mangle -L PREROUTING
#
#  Flush/reset all the rules to default by issuing the command:
#      iptables -t mangle -F PREROUTING
#

#
# First it is necessary to disable Reverse Path Filtering on all
# current and future network interfaces:
#
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
      echo 0 > $i
done

#
# Delete and table 100 and flush any existing rules if they exist.
#
ip route flush table 100
ip route del default table 100
ip rule del fwmark 1 table 100
ip route flush cache
iptables -t mangle -F PREROUTING

#
# Copy all non-default and non-VPN related routes from the main table into table 100.
# Then configure table 100 to route all traffic out the WAN gateway and assign it mark "1"
#
# NOTE: Here I assume the OpenVPN tunnel is named "tun11".
#
#
ip route show table main | grep -Ev ^default | grep -Ev tun11 \
  | while read ROUTE ; do
      ip route add table 100 $ROUTE
done
ip route add default table 100 via $(nvram get wan_gateway)
ip rule add fwmark 1 table 100
ip route flush cache

#
# Define the routing policies for the traffic. The rules will be applied in the order that they
# are listed. In the end, packets with MARK set to "0" will pass through the VPN. If MARK is set
# to "1" it will bypass the VPN.
#
# EXAMPLES:
#
#  All LAN traffic will bypass the VPN (Useful to put this rule first, so all traffic bypasses the VPN and you can configure exceptions afterwards)
#    iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1
#  Ports 80 and 443 will bypass the VPN
#    iptables -t mangle -A PREROUTING -i br0 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 1
#  All traffic from a particular computer on the LAN will use the VPN
#    iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range 192.168.1.2 -j MARK --set-mark 0
#  All traffic to a specific Internet IP address will use the VPN
#    iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 216.146.38.70 -j MARK --set-mark 0
#  All UDP and ICMP traffic will bypass the VPN
#    iptables -t mangle -A PREROUTING -i br0 -p udp -j MARK --set-mark 1
#    iptables -t mangle -A PREROUTING -i br0 -p icmp -j MARK --set-mark 1

# By default all traffic bypasses the VPN
iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1

# Spotify explicitly uses the VPN
iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 78.31.8.1-78.31.15.254 -j MARK --set-mark 0
iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 193.182.8.1-193.182.15.254 -j MARK --set-mark 0

Наконец-то я это сделал :-)

я использую v1.28.9054 MIPSR2-beta K26 USB vpn3.6, но должен работать с другими, так как это сеть.

OpenVPN хочет настроить всю вашу маршрутизацию, вы должны остановить это ...

В VPN-туннелировании / клиентском / базовом

Снимите флажок «Создать NAT в туннеле» в разделе «VPN-туннелирование» / «Клиент» / «Дополнительно».

Снимите флажок "Перенаправлять интернет-трафик".

Пользовательская конфигурация, добавьте строку: route-nopull

В Администрирование / Сценарии / Брандмауэр убедитесь, что у вас есть:

iptables -I FORWARD -i br0 -o tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -o br0 -j ACCEPT
iptables -I INPUT -i tun11 -j REJECT
iptables -t nat -A POSTROUTING -o tun11 -j MASQUERADE

Перезагрузка и альт, у тебя ничего нет ...

Затем в сценарии запуска VPN (лучший выбор) или, если ваша VPN запускается с WAN, введите свой адрес Administration / Scripts / WANUP

sleep 30
ip route flush table 200
ip route flush cache
ip rule add from 192.168.1.11 lookup 200
ip rule add from 192.168.1.13 lookup 200
VPN_GW=`ifconfig tun11 | awk '/inet addr/ {split ($2,A,":"); print A[2]}'`
ip route add table 200 default via $VPN_GW dev tun11

Это, вероятно, не самый «лучший» или «правильный» способ сделать это, но он работает. Только сейчас 192.168.1.11 и 192.168.2.13 пройдет через туннель OpenVPN. Все остальные устройства и их трафик будут локальными.

Это было чрезвычайно важно для меня, так как я не хотел, чтобы мой торрент-трафик Transmission проходил через VPN. Какой-то парень вроде SgtPepperKSU смотрит на это и, вероятно, смеется ... В общем, от одного нуба маршрутизации к другому ...

Поддерживает ли эта прошивка iproute2, которая может поддерживать более одной таблицы маршрутов на основе src ip.

echo "200 ovpn" >> /etc/iproute2/rt_tables
ip rule add from YOUR.WIFI.IP.S table ovpn

и добавляем правило маршрута для таблицы

ip route add default via VPN.ROUTE.IP.ADDR dev vpn_dev table ovpn
ip route flush cache

вы можете сослаться на это: Linux Advanced Routing & Traffic Control HOWTO : http://lartc.org/howto/index.html

Или, поскольку вы китаец, вы можете прочитать мой блог на эту тему: http://wangxu.me/blog/p/675

Надеюсь, это поможет