Рэжым trap у strongSwan: чаму тунель IPsec чакае трафік
Прастойны тунель IPsec па патрабаванні не паказвае CHILD SA, пакуль пакет не супадзе з яго палітыкай trap. Чытайце стан, правярайце трыгер і ведайце, калі падыходзіць start.
У вывадзе статусу не з’яўляецца CHILD SA, тунель выглядае мёртвым, а затым ping да далёкай падсеткі падымае яго. У наладзе IPsec па патрабаванні гэтая паслядоўнасць — гэта задума, а не няспраўнасць. Палітыка trap усталёўвае селектар і чакае, і менавіта першы пакет, які ёй адпавядае, запускае IKE і перамовы CHILD SA.
Частка блытаніны — у словах: «up» ужываецца для двух розных станаў. Канфігурацыя загружана, і палітыка ядра існуе, а сувязь даных — не. Манітор, які лічыць толькі актыўныя SA, будзе паказваць здаровы сайт як непрацуючы, пакуль ніхто не адпраўляе да яго трафік.
Прастойны тунель па патрабаванні не мае CHILD SA, які можна паказаць
Запіс trap сам па сабе нікога не аўтэнтыфікуе. Ён просіць ядро трымаць палітыку для выбранага трафіку і ўздымаць acquisition, калі пакету патрэбна гэтая палітыка. Дэман атрымлівае acquisition, супастаўляе яго з вызначэннем child і вядзе перамовы адтуль. Да гэтага моманту няма і IKE SA для паказу, таму абодва спісы могуць быць пустыя адначасова.
Менавіта гэты парадак робіць журналы чытэльнымі. Спачатку прыходзіць acquisition, потым IKE_SA_INIT і IKE_AUTH, потым CHILD SA. Калі журнал сканчаецца адразу пасля acquisition, трыгер спрацаваў. Перамовы не ўдаліся, і наступнае пытанне — пра ўліковыя даныя, прапановы або дасяжнасць, а не пра trap.
З бэкендам ядра Linux вы можаце ўбачыць палітыку да таго, як з’явіцца любы SA. Запусціце ip xfrm policy і шукайце селектар з напрамкам out і шаблонам, які паказвае на злучэнне. Гэты запіс — стан па патрабаванні, і яго наяўнасць — першае, што трэба пацвердзіць.
start_action вырашае, ці будзе наогул нешта чакаць
Кожнае child у swanctl.conf нясе start_action. start запускаецца пры загрузцы канфігурацыі, trap усталёўвае палітыку і чакае, а none пакідае запуск нечаму іншаму. Толькі trap стварае паводзіны «ping і ўздымаецца», апісаныя вышэй.
children {
office-lan {
local_ts = 192.168.50.0/24
remote_ts = 192.168.70.0/24
start_action = trap
}
}
Два селектары трафіку вызначаюць, што лічыцца цікавым, і пакет з хоста па-за гэтымі прэфіксамі не запускае trap; ён маршрутызуецца як звычайна. Пашырэнне селектараў, каб зрабіць трыгер больш нецярплівым, пашырае і ахоп, які тунель заяўляе, што абараняе, таму выводзьце іх з трафіку, які вы сапраўды збіраецеся шыфраваць.
Даведнік swanctl.conf пералічвае прынятыя значэнні разам з асобнымі дзеяннямі close і DPD, якія кіруюць тым, што адбываецца пасля стварэння SA.
Высветліце, ці спрацаваў трыгер наогул
Пачніце з swanctl --list-conns і пераканайцеся, што child загружаны з патрэбным вам дзеяннем. Затым адпраўце адзін пакет з хоста ўнутры local_ts на адрас унутры remote_ts і паназірайце за swanctl --list-sas. Калі вывад не змяніўся, ніякі acquisition не дайшоў да дэмана.
Дзве звычайныя прычыны ціхага trap: пакет быў падвергнуты source-NAT, перш чым трапіць у палітыку, і больш не супадае з local_ts, або злучэнне ніколі не загружалася праз сінтаксічную памылку ці памылку ўліковых даных. Запусціце зноў swanctl --load-all і прачытайце яго вывад, перш чым чапаць селектары. Злучэнне, якое не загрузілася, не ўсталёўвае палітыку, таму трафіку няма чаго запускаць.
Напрамак таксама важны: trap, усталяваны для зыходнага трафіку, не ініцыюе пры ўваходным пакеце. Калі аддалены бок павінен падняць тунель, яму патрэбны ўласны trap, або гэтаму боку патрэбен start.
Чаканне першага пакета не заўсёды правільны абмен
Інтэрактыўныя сесіі адчуваюць цану наладкі. Першы запыт плаціць за абмен IKE і перамовы CHILD, і кліент з кароткім тэрмінам можа адмовіцца, перш чым SA існуе. Праактыўны start прыбярэ гэтую затрымку першага пакета. Але ён трымае тунель паднятым для трафіку, які можа ніколі не прыйсці.
Тры факты вырашаюць выбар: як часта выкарыстоўваецца шлях, ці мае першы запыт жорсткі тэрмін і ці дасяжны партнёр пры загрузцы. Выпадковы пакетны трафік і партнёр, які можа быць афлайн пры старце, абодва схіляюць да trap. Кліент, адчувальны да затрымак, і партнёр, які заўсёды дасяжны, схіляюць да start. Калі абодва бакі могуць ініцыяваць, дамовіцеся, хто валодае трыгерам, каб не было дубліраваных перамоў.
Усталяваная палітыка таксама не гарантыя ад уцечкі. Калі патрабуецца fail-closed, брандмаўэр павінен адкідаць трафік без SA, і гэтае правіла жыве па-за вызначэннем child.
Запішыце тры радкі, якія скончаць наступную спрэчку
Запішыце селектары, дзеянне запуску і вывад каманды, які паказвае палітыку наяўнай без SA. Гэтыя тры радкі аддзяляюць «па патрабаванні і прастойны» ад «не загружаецца» наступным разам, калі хтосьці паведаміць, што тунель не працуе. Каб іх захаваць, патрэбна хвіліна. Без іх тое ж расследаванне пачынаецца з нуля.
Тэстуйце з хоста, які сапраўды ўнутры селектара. Ping з самога роўтэра часта ідзе іншым шляхам і нічога не даказвае пра палітыку, якая абараняе падсетку за ім.