
Я использую компьютер Linux (raspberry pi) для совместного использования VPN-подключения через ethernet. Я хочу, чтобы raspberry pi подключался к интернету обычным образом (не через VPN). Я очень близок к тому, чтобы это заработало, но я не знаю, как настроить DNS для сети eth1.
Connection to the internet: eth0 192.168.11.21/24, gateway 192.168.11.1
vpn connection: tun0 <- openvpn connection
vpn sharing network: eth1 192.168.5.1/24 <- this maching is the gatway for the vpn sharing network
Конфигурация eth1:
eth1: /etc/network/interface
auto eth1
iface eth1 inet static
address 192.168.5.1
netmask 255.255.255.0
У меня dnsmasq работает как DHCP-сервер для eth1 (сеть общего доступа vpn)
# Configuration file for dnsmasq.
#
interface=eth1
dhcp-range=192.168.5.50,192.168.5.150,12h
конфигурация vpn
Я хочу, чтобы трафик, идущий только от eth1, использовал vpn. Я настраиваю маршруты самостоятельно, используя отдельную таблицу маршрутизации.
# extract from openvpn config
route-noexec
route-up "/etc/openvpn/route-up.sh"
down "/etc/openvpn/down.sh"
# route-up.sh
/sbin/ip route add $trusted_ip/32 via $route_net_gateway table vpn
/sbin/ip route add 0.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add 128.0.0.0/1 via $route_vpn_gateway table vpn
Мне также пришлось выполнить несколько команд для настройки отдельной таблицы маршрутизации:
# make a new routing table called vpn
echo 200 vpn >> /etc/iproute2/rt_tables
# add a rule to use the routing table for the addresses on eth1
ip rule add from 192.168.5.0/24 table vpn
Связываем интерфейсы:
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Тестирование:
Я подключил ноутбук с Windows к сети VPN-обмена. Он может напрямую подключаться к интернет-адресам. Но использование доменных имен DNS-поиска не удается. Я не нашел работающего способа настройки DNS.
Я попробовал добавить это в dnsmasq
server=<dns-server-address>
Я также попробовал добавить эту строку под eth1 в /etc/network/interfaces
dns-nameservers <dns-server-address>
Это привело к тому, что resolvconf -l вернул следующее:
# resolv.conf from eth1.inet
# Generated by ifup for eth1.inet
nameserver <dns-server-address1>
nameserver <dns-server-address2>
но /etc/resolv.conf остается прежним:
# Generated by resolvconf
nameserver 127.0.0.1
Я даже пробовал редактировать /etc/resolv.conf напрямую. - Но он автоматически обновляется и почти сразу же перезаписывается.
--редактировать --
Моя цель — создать установку, которая не требует какой-либо особой настройки на клиенте в сети VPN-обмена. (Я буду подключать устройства, которые невозможно настроить)
Я бы также хотел отправлять DNS-запросы через VPN, если это возможно.
--редактирование 2--
Во-первых. Я переключился на тестирование с клиентом Linux. Изменение resolv.conf для добавления моего сервера DNS заставляет работать подключение к интернету через vpn.
Однако - похоже, мне подойдет решение 5. Это перехват DNS-пакетов и их изменение для направления на новый DNS-сервер?
У меня не заработало. Я выложу здесь свою конфигурацию. Я что-то упустил?
# iptables-save
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*mangle
:PREROUTING ACCEPT [51:3878]
:INPUT ACCEPT [49:3758]
:FORWARD ACCEPT [2:120]
:OUTPUT ACCEPT [30:3438]
:POSTROUTING ACCEPT [32:3558]
-A PREROUTING -p tcp -m tcp --dport 53 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -p udp -m udp --dport 53 -j MARK --set-xmark 0x1/0xffffffff
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*nat
:PREROUTING ACCEPT [4:337]
:INPUT ACCEPT [3:277]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 198.18.0.1
-A PREROUTING -i tun0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 198.18.0.2
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*filter
:INPUT ACCEPT [41189:45918808]
:FORWARD ACCEPT [63803:44422296]
:OUTPUT ACCEPT [33919:5341216]
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# ip route list table vpn
0.0.0.0/1 via 172.21.24.1 dev tun0
81.171.74.16 via 192.168.11.1 dev eth0
128.0.0.0/1 via 172.21.24.1 dev tun0
# ip route list table main
default via 192.168.11.1 dev eth0
default via 192.168.11.1 dev eth0 metric 202
172.21.24.0/23 dev tun0 proto kernel scope link src 172.21.24.57
192.168.5.0/24 dev eth1 proto kernel scope link src 192.168.5.1
192.168.11.0/24 dev eth0 proto kernel scope link src 192.168.11.21
192.168.11.0/24 dev eth0 proto kernel scope link src 192.168.11.21 metric 202
# ip rule
0: from all lookup local
32764: from all fwmark 0x1 lookup vpn
32765: from 192.168.5.0/24 lookup vpn
32766: from all lookup main
32767: from all lookup default
# cat /etc/resolv.conf
# Generated by resolvconf
nameserver 127.0.0.1
# On the client
# cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.5.1
-- правка 3 --
# tcpdump -i tun0 -n port 53
23:44:29.787915 IP 192.168.5.1.53 > 192.168.5.128.38840: 36460 4/0/0 A 157.7.203.102, A 157.7.154.23, A 116.58.172.182, A 157.7.235.92 (101)
23:44:29.788071 IP 192.168.5.1.53 > 192.168.5.128.38840: 37999 0/0/0 (37)
23:44:30.619149 IP 192.168.5.1.53 > 192.168.5.128.58425: 3383 1/0/0 A 129.169.10.40 (47)
23:44:30.620635 IP 192.168.5.1.53 > 192.168.5.128.58425: 11649 0/1/0 (83)
Глядя на это, мы получаем DNS-ответы, но они не доходят до клиента (192.168.5.128). Верно? Теперь мне нужно выяснить, как это исправить...
решение1
Вы не уточнили, хотите ли вы, чтобы DNS-серверы были специфичны для вашего компьютера Windows, для всех клиентов OpenVPN или, возможно, даже для вашего RPI, а также хотите ли вы, чтобы DNS-запросы проходили через VPN или нет.
1.Отдельные клиентские (через OpenVPN) и RPI DNS.
Это самый простой случай: настройте клиентские DNS-серверыв клиенте, и RPI DNS в/etc/resolv.conf.
2.Отдельные клиентские (вне OpenVPN) и RPI DNS.
То же, что и выше, за исключением того, что вам придется добавить следующее правило маршрутизации в RPI:
ip route add 8.8.8.8/32 via Your.Router.IP.Address dev Your.Non.VPN.Interface table vpn
Я предположил, что ваш (Windows) клиент использует DNS Google, 8.8.8.8.
3. Альтернативно, вы можете помечать DNS-пакеты от клиентов и направлять их черезосновнойтаблица маршрутизации:
iptables -A PREROUTING -t mangle -p tcp --dport 53 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -p udp --dport 53 -j MARK --set-mark 1
ip rule add from all fwmark 1 table main
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
4.Одни и те же DNS-серверы для RPI и клиентов, как через OpenVPN, так и извне.
То же самое, что и в пунктах 1 или 2, только используйте тот же набор DNS.
5.Автоматическая настройка для всех клиентов OpenVPN, разумеется, через OpenVPN.
Вы можете подумать, что настройка DNS индивидуально для каждого VPN-клиента утомительна, особенно если вам нужно настроить DNS в сети сервера, а не так просто, как у Google. Сначала вам придется перенести опцию DNS с сервера на RPI-клиент, добавив следующий параметр в файл конфигурации сервера:
push "dhcp-option DNS 10.66.0.4"
Эта опция записывается в переменную с именеминостранный_вариант_{n}: первый вариант, продвинутый таким образом, будет иметьп=1, а его значение (в приведенном выше случае) равно:
foreign_option_1="dhcp-options DNS 10.66.0.4"
Эта переменная автоматически передается ввверхскрипт, где вам придется разбить его на три части, извлекая IP-адрес, скажем,$var3, и теперь вы можете добавить следующие строки в своймаршрут-вверхсценарий:
iptables -t mangle -A PREROUTING -p tcp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1
ip rule add fwmark 1 table vpn
iptables -t nat -A PREROUTING -p tcp --dport 53 -i tun0 -j DNAT --to-destination $var3
iptables -t nat -A PREROUTING -p udp --dport 53 -i tun0 -j DNAT --to-destination $var3
Чтобы это работало, вамможетнужно отключить фильтр обратного пути: я не уверен, потому что на моем ноутбуке Arch Linux я это делаюнетнужно сделать это, в то время как на моей рабочей станции Debian яделать. Так что я сейчас немного сбит с толку, извините за это.