Поўны тунэль OpenVPN абрывае сеанс SSH: выпраўце шлях адказу
Маршрут па змаўчанні накіроўвае адказы SSH у тунэль. Закмапіце пір, адфільтруйце redirect-gateway або маршрутызуйце па крыніцы, пакуль не страцілі хост.
Уключэнне кліента OpenVPN з поўным тунэлем на машыне, да якой вы падключаецеся па SSH, можа абарваць сеанс за секунду, і машына пры гэтым нічога не робіць няправільна. Тунэль не мяняе тое, як пакеты дасягаюць сервера; ён мяняе тое, як выходзяць адказы. Як толькі маршрут па змаўчанні паказвае на tun0, адказ вашаму кліенту SSH трапляе ў сетку правайдэра, у якой няма маршруту назад да вашага адрасу. Злучэнне завісае, наступная спроба сканчаецца тайм-аўтам, а дэман увесь гэты час слухае порт 22.
Прачытайце табліцу маршрутызацыі раней, чым лаг VPN. Лаг скажа, што тунэль падняўся, і будзе мець рацыю. Пытанне ў тым, якому інтэрфейсу перадаецца кожны адказ, а гэта пашукавы запыт для кожнага пакета па табліцы, якую тунэль толькі што перапісаў.
Чаму адказ выходзіць не праз тыя дзверы
Уваходныя пакеты па-ранейшаму прыходзяць на фізічны інтэрфейс, бо кліент VPN не можа змяніць тое, як інтэрнэт дасягае публічнага адрасу вашага сервера. Адказы — асобнае рашэнне: для кожнага пакета ядро шукае прызначэнне, і пасля --redirect-gateway запіс па змаўчанні кажа тунэль. Выхад правайдэра бачыць прызначэнне, якому ён не служыць, і скідае пакет.
Уласная абарона OpenVPN пакрывае роўна адно прызначэнне. Дапаможнік 2.6 апісвае --redirect-gateway як паслядоўнасць: спачатку дадае хост-маршрут для піра VPN праз шлюз, які выкарыстоўваўся да тунэля, каб шыфраваны трафік не мог завярнуцца ў сябе, а затым замяняе маршрут па змаўчанні. Гэты хост-маршрут прызначаны толькі піру. Ваш кліент SSH — проста яшчэ адзін інтэрнэт-адрас і не атрымлівае выключэння.
Адзін памылковы прэфікс варта выключыць адразу. Каманда ip route add -net 0.0.0.0 gw 10.8.0.1 dev tun0 без даўжыні супадае з адзіным адрасам 0.0.0.0, а не з інтэрнэтам; павінна быць 0.0.0.0/0. І калі ўзяцце маршруту па змаўчанні ламае ўласны транспарт тунэля, дадайце канчатковы пункт як хост-маршрут праз фізічны інтэрфейс, выкарыстоўваючы рэальны адрас правайдэра.
Закмапіце адрас свайго кліента SSH для імгненнага выпраўлення
Самае хуткае выпраўленне — хост-маршрут для адрасу вашага кліента праз шлюз, які сервер выкарыстоўваў да з’яўлення тунэля. З вашага боку знайдзіце адрас, які ўбачыць сервер, а затым прачытайце табліцу сервера, каб ведаць стары шлюз:
curl -s https://ifconfig.co
ip route
На серверы дадайце выключэнне перад запускам кліента. Адрасы тут — запоўнікі; важная форма:
sudo ip route add 80.128.240.55 via 192.168.178.1
Гэта выпраўленне выкарыстана ў паведамленым выпадку, і яно працуе адразу. Яно таксама крохкае ў два прадказальныя спосабы: маршрут знікае пры перазагрузцы, і ён робіцца няправільным у момант, калі ISP выдае вам іншы адрас. Стаўцеся да яго як да надзвычайнай меры і зрабіце яго доўгачасовым свядома, праз сеткавую адзінку або хук дыспетчара, альбо прызнайце, што ён часовы, і запішыце шлях аднаўлення.
Не дазвольце кліенту ўзяць маршрут па змаўчанні
Больш чысты варыянт — не дазваляць тунэлю замяняць маршрут па змаўчанні наогул. route-nopull у спалучэнні з --client або --pull прымае адпраўленыя опцыі, акрамя маршрутаў, block-outside-dns і опцый тыпу DHCP, такіх як DNS-серверы, таму вы дадаяце толькі патрэбныя прэфіксы. Больш вузкі інструмент — фільтр выцягвання, які адкідае адну шкодную дырэктыву і пакідае астатнія:
route-nopull
pull-filter ignore "redirect-gateway"
Выкарыстоўвайце адно або другое, не абодва, і ясна разумейце, што зменіцца. Без маршруту па змаўчанні праз тунэль сервер больш не выходзіць у інтэрнэт праз правайдэра; ён дасягае толькі таго, што вы маршрутызавалі яўна. Калі поўны тунэль быў усёй сутнасцю налады, гэта няправільная кнопка, і хост-маршрут вышэй — правільны.
Падзяліце шлях вяртання па крыніцы або па злучэнні
Калі ўваходны адрас стабільны, правіла крыніцы трымае адказы лакальна, не закранаючы ўласныя маршруты тунэля. Дайце адрасу фізічнага інтэрфейса ўласную табліцу з прэфіксам LAN і фізічным маршрутам па змаўчанні, затым выбірайце гэтую табліцу для трафіку, які паходзіць з яе:
ip rule add from 192.168.1.11 table 128
ip route add table 128 to 192.168.1.0/24 dev eth0
ip route add table 128 default via 192.168.1.1
Гэта працуе, бо адказы на ўваходнае злучэнне SSH паходзяць з адрасу, да якога падключыўся кліент. У паведамленым выпадку, дзе кожная ўваходная паслуга мусіла працягваць працаваць, выкарыстоўвалася менавіта такая форма. Калі ўваходны адрас плавае або шлях дынамічны, пазначце злучэнне: пастаўце адзнаку conntrack на першым пакеце з фізічнага інтэрфейсу, скапіруйце яе на пакеты адказу ў OUTPUT і маршрутызуйце пазначаныя пакеты праз табліцу, якая паказвае на фізічны шлюз.
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.1.1 dev eth0 table 3412
ip rule add fwmark 4321 table 3412
Трымайце адзнаку злучэння, адзнаку міжсеткавага экрана і нумар табліцы рознымі падчас тэставання. Паўторнае выкарыстанне аднаго нумара для дзвюх роляў дае правіла, якое выглядае правільна і супадае з няправільнымі пакетамі. Запіс табліцы па змаўчанні таксама патрабуе via з шлюзам LAN на звычайным злучэнні Ethernet; голы dev eth0 працуе толькі калі інтэрфейс пункт-пункт або наступны хоп вырашаецца інакш. Паведамлены хост Jessie выпадкова апынуўся на злучэнні, дзе голая форма працавала, і гэта не правіла дыстрыбутыва, якое трэба капіраваць.
Праверце, не адрэзаўшы сабе доступ
Не тэстуйце праз адключэнне. Трымайце першы сеанс адкрытым, падніміце тунэль і спытайце ядро, які шлях выбера ваш уласны адрас:
ip route get 80.128.240.55
Адказ павінен назваць фізічны інтэрфейс і стары шлюз, а не тунэль. Затым адкрыйце другое злучэнне SSH; гэта сапраўдны тэст, бо стары сеанс можа выжыць на стане, якое новае злучэнне не можа ўзнавіць. Калі другое завісае, пакуль першае яшчэ адказвае, правіла так і не супала з важным трафікам, і шукаць трэба ў адзнаках або адрасе крыніцы.
Трымайце пазапалосную кансоль даступнай на ўвесь час. Сервер, адзіны шлях доступу да якога — тунэль, які вы толькі што зламалі, немагчыма адрамантаваць праз гэты тунэль, і адкат прасцей, калі вы запісалі нумары табліц і прэфіксы, якія дадалі.