Проблема (или защо изобщо правя толкова сложно решение) – по една или друга причина, когато не съм си в къщи имам достъп до една 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 MASQUERADEip netns delete showcasenets
Разбира се идеята не е нова. И като цяло използвах този скрипт като отправна точка, но като добър плагиат го преработих. Скрипта ми по принцип е писан под Slackware, но така като го гледам не виждам да има проблем да работи под всяка OS имаща sudo, ip и iptables …
Моят код – тук
Използвайте със здраве и дано ви помогне …
Надявам се да спестя малко работа на някого …
Ваш,
Lucifer
Вашият коментар