от Lucifer

openvpntech_logo_rounded_antialiased

Проблема (или защо изобщо правя толкова сложно решение) – по една или друга причина, когато не съм си в къщи имам достъп до една Linux машина. Искам да имам достъп до Windows машината в нас. Разбира се имам OpenVPN инсталиран на ръба на домашната мрежа. Разбира се искам да използвам VPN връзка за да е по-сигурно, но пък и не искам да прекарвам целия трафик през VPN връзката, а само RDP-то.

Както за всеки друг проблем – и за този можете да намерите решение в Интернет. В случая най-елегантното решение е netns – Network Name Spaces – Виртуален дял от мрежовия стак в който има напълно различни правила за адреси, iptables и така на татък.

Горе долу решението изглежда така:

Създаваме netns с избрано име:

ip netns add showcasenets

Вдигаме loopback интерфейс (все пак има програми които си искат loopback-a)

ip netns exec showcasenets ip addr add 127.0.0.1/8 dev lo
ip netns exec showcasenets ip link set lo up

Създаваме виртуални VPN интерфейси

ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns showcasenets up

Задаваме IP адреси и default route-ове за виртуалните интерфейси:

ip addr add 10.200.200.1/24 dev vpn0
ip netns exec showcasenets ip addr add 10.200.200.2/24 dev vpn1
ip netns exec showcasenets ip route add default via 10.200.200.1 dev vpn1

Разрешаваме NAT на адресните заявки от виртуалния VPN интерфейс през изходящия за компютъра интерфейс

iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o eth0 -j MASQUERADE

За всеки случай разрешаваме IP Forwarding:

sysctl -q net.ipv4.ip_forward=1

Последната стъпка е да създадем конфигурация на Net Name Space-а в /etc/netns/showcasenets:

mkdir -p /etc/netns/showcasenets
echo ‘nameserver 8.8.8.8’ > /etc/netns/showcasenets/resolv.conf

По този начин имате създаден виртуална мрежова среда. Следващата стъпка е да стартирате VPN-а вътре в нея:

ip netns exec showcasenets openvpn –config /some/openvpn/config &

Така вече имаме VPN във мрежовия name space. Всяко приложение стартирано в този name space ще излиза през VPN връзката, без да пречи на други трафик. Това става използвайки:

ip netns exec showcasenets sudo -u USER command

След като си свършите работата, няма да е лошо да възстановим средата (освен ако не искате да си я оставите така)

Първо убиваме OpenVPN:

killall openvpn

После убиваме всички процеси в netns адресното пространство и изтриваме конфигурацията, спираме IP Forwarding-a и премахваме правата в IP Tables за routing на трафика. Накрая трием адресното пространство:

ip netns pids showcasenets | xargs -rd’\n’ kill

rm -rf /etc/netns/showcasenets

sysctl -q net.ipv4.ip_forward=0

iptables -D INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -D POSTROUTING -s 10.200.200.0/24 -o eth0 -j MASQUERADE

ip netns delete showcasenets

Разбира се идеята не е нова. И като цяло използвах този скрипт като отправна точка, но като добър плагиат го преработих. Скрипта ми по принцип е писан под Slackware, но така като го гледам не виждам да има проблем да работи под всяка OS имаща sudo, ip и iptables …

Моят код – тук

Използвайте със здраве и дано ви помогне …

Надявам се да спестя малко работа на някого …

Ваш,
Lucifer

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

 

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.