Я относительно новичок в мире сетевых технологий, хотя я занимался кодированием и знаю кое-что из системного администратора в течение длительного времени. и вот я всего в одном шаге от места назначения.
В целом картина такова: дома я использую один 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 Метрика: 1eth0 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 27
ВВЕРХ ТРАНСЛЯЦИИ МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1eth1 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 29
ТРАНСЛЯЦИЯ ВВЕРХ ВСЕГО МУЛЬТИ-МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1eth2 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 2A
ТРАНСЛЯЦИЯ ВВЕРХ ВСЕГО МУЛЬТИ-МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1lo 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 Метрика: 1vlan1 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 27
ТРАНСЛЯЦИЯ ВВЕРХ ВСЕГО МУЛЬТИ-МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1vlan2 Link encap: Ethernet HWaddr C0: C1: C0: 1A: E0: 28
ВВЕРХ ТРАНСЛЯЦИИ МУЛЬТИКАСТ MTU: 1500 Метрическая система: 1wl0.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
Надеюсь, это поможет