
У меня есть сервер OpenVPN и клиент, и я хочу использовать этот туннель для доступа не только ко всему 10.0.8.0/24
интернету, но и ко всему интернету. Пока что пинг сервера с клиента через tun0
интерфейс работает, и наоборот.
Однако пинг www.google.com
с клиента tun0
не работает (все пакеты теряются).
Я решил, что мне следует настроить сервер так, чтобы любой пакет, поступающий из tun0
пункта назначения в Интернете, пересылался, поэтому я придумал следующую строку конфигурации iptables:
interface_connecting_to_the_internet='eth0'
interface_openvpn='tun0'
internet_ip_address=`ifconfig "$interface_connecting_to_the_internet" | sed -n s'/.*inet \([0-9.]*\).*/\1/p'`
iptables -t nat -A POSTROUTING -o "${interface_connecting_to_the_internet}" -j SNAT --to-source "${internet_ip_address}"
echo '1' > /proc/sys/net/ipv4/ip_forward
Однако это не работает, пакеты по-прежнему теряются, и мне интересно, что могло быть не так с моей настройкой.
Некоторые подробности:
ip route дает на сервере:
default via 176.31.127.254 dev eth0 metric 3
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
127.0.0.0/8 via 127.0.0.1 dev lo
176.31.127.0/24 dev eth0 proto kernel scope link src 176.31.127.109
ip route дает на клиенте:
default via 192.168.1.1 dev wlan0 proto static
10.8.0.1 via 10.8.0.5 dev tun0
10.8.0.5 dev tun0 proto kernel scope link src 10.8.0.6
127.0.0.0/8 via 127.0.0.1 dev lo scope link
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.109
- клиент использует адаптер Wi-Fi
wlan0
и адаптер TUNtun0
. - сервер использует адаптер Ethernet
eth0
и адаптер TUNtun0
. VPN охватывает
10.0.8.0/24
и клиент, и Linux используют Linux 3.6.1.
решение1
Подводя итоги обсуждения:
Чтобы добраться до определенного хоста A через VPN от клиента C к серверу S, необходимо:
- включить переадресацию IP на S (
sysctl -w net.ipv4.ip_forward=1
) - включите либо маскировку, либо snat через iptables на S:
iptables -t nat -A POSTROUTING -o ext_if -j MASQUERADE
илиiptables -t nat -A POSTROUTING -o ext_if-j SNAT --to-source ext_ip
с очевидным значениемext_if
иext_ip
. - настроить соответствующую маршрутизацию на C, либо (S обозначает IP-адрес Sв VPN):
- установив явный маршрут к A через S:
ip route add A via S dev vpn_if
- путем установки маршрута по умолчанию через S:,
ip route add default via S dev vpn_if
где также необходимо установить соответствующий маршрут к Sip route add S via previous_gateway dev prev_if
:. - с помощью
push "redirect-gateway def1"
на сервере, в этом случае OpenVPN установит маршруты к C0.0.0.0/1
и128.0.0.0/1
на C через S, которые являются более конкретными, чем маршрут по умолчанию, и могут быть легко удалены при остановке туннеля.
- установив явный маршрут к A через S: