SYN/ACKЕвгений Зобнин j1m@synack.ruСквозь защитныепорядкиПРОБРАСЫВАЕМ ПОРТЫ В ОКНАХ, НИКСАХ И КИСКАХУ этой технологии есть множество названий — это и трансляция портадреса,и проброс портов, и перенаправление, и буржуйские порт-форвардинг/порт-маппинг,и сокращенные DNAT/PAT. Но как бы она ниназывалась, о ее полезности спорить не приходится. Проброс портов —просто спасательный круг для тех, кто хочет показать свой сервер из-завысокой и крепкой стены под названием NAT.Íåäîñòàòîê ñåòåâûõ àäðåñîâ ñòàíäàðòà IPv4 îñòàâèë ñâîé îòïå÷àòîê íàòîïîëîãèè ñîâðåìåííûõ ñåòåé. Áåëûå àäðåñà ñëèøêîì äîðîãè, ÷òîáûíàäåëÿòü èìè âñåõ, êîãî ïîïàëî, ïîýòîìó ïðîñòûì ñìåðòíûì ïðèõîäèòñÿþòèòüñÿ â íåáîëüøèõ ÷àñòíûõ ïîäñåòÿõ, à â èíòåðíåò âûõîäèòü÷åðåç îäèí îáùèé ñåðâåð, íà êîòîðîì íàñòðîåí NAT. Áëàãîäàðÿ òàêîéñõåìå ïîëüçîâàòåëè öåëîé ïîäñåòè ìîãóò èñïîëüçîâàòü îäèí âíåøíèéIP-àäðåñ, à îáùàÿ èíôðàñòðóêòóðà èíòåðíåòà ïðîäîëæàåò æèòü, äàæåíåñìîòðÿ íà î÷åâèäíóþ íåõâàòêó IP-àäðåñîâ. Íî ÷òî åñëè ðå÷ü èäåò íå îêëèåíòàõ ïðîâàéäåðà, ñèäÿùèõ çà NAT'îì, à î ëîêàëüíîé ñåòè íåáîëüøîéêîìïàíèè, ìíîãèå ìàøèíû êîòîðîé äîëæíû èãðàòü ðîëü íå òîëüêîêëèåíòîâ, íî è ñåðâåðîâ. Íàïðèìåð, íà îäíîé èç ìàøèí ìîæåò íàõîäèòüñÿâåá-ñåðâåð, à äðóãàÿ äîëæíà îáñëóæèâàòü SMTP- è FTP-êëèåíòîâ, íîâûäåëÿòü êàæäîé èç íèõ áåëûé IP-àäðåñ — êàê-òî óæ ñëèøêîì ðàñòî÷èòåëüíî.Âîò çäåñü íàì íà ïîìîùü è ïðèõîäèò DNAT èëè, ïî-ïðîñòîìó —ïðîáðîñ ïîðòîâ. Ñ ïîìîùüþ ýòîé òåõíîëîãèè ìîæíî ñäåëàòü òàê, ÷òîáûâõîäÿùèé íà øëþç òðàôèê ïåðåíàïðàâëÿëñÿ ê îäíîé èç âíóòðåííèõìàøèí ñåòè íà îñíîâå ïîðòà íàçíà÷åíèÿ. Äðóãèìè ñëîâàìè, ïðîáðîñïîðòîâ ïîçâîëÿåò âûñòàâèòü âî âíåøíèé ìèð ñåðâèñû ëîêàëüíûõ ðåñóðñîâè ñîçäàòü èëëþçèþ òîãî, ÷òî îíè íàõîäÿòñÿ íà øëþçå.ПЕРЕД ТЕМ, КАК НАЧАТЬÝòà ñòàòüÿ ðàññêàçûâàåò î íàñòðîéêå ïðîáðîñà ïîðòîâ â ñàìûõ ðàçíûõîïåðàöèîííûõ ñèñòåìàõ, íà÷èíàÿ ñ Windows è çàêàí÷èâàÿ ÎÑ,óñòàíîâëåííûìè íà ñåòåâîì îáîðóäîâàíèè.  áîëüøèíñòâå ñëó÷àåâäëÿ ðåàëèçàöèè ïðîáðîñà ïîðòîâ èñïîëüçóþòñÿ ñïåöèàëüíûå ïðàâèëàáðàíäìàóýðà, è çäåñü ÿ äîëæåí ñäåëàòü ïåðâîå ïðåäîñòåðåæåíèå.Äåëî â òîì, ÷òî ëþáîé áðàíäìàóýð âûïîëíÿåò òðàíñëÿöèþ ñåòåâûõàäðåñîâ äî èõ ôèëüòðàöèè, ïîýòîìó îïèñàííûå â ñòàòüå ïðàâèëàäîëæíû íàõîäèòüñÿ â íà÷àëå. Âòîðîå: äëÿ óñïåøíîãî ïðîõîæäåíèÿîòòðàíñëèðîâàííûõ ïàêåòîâ äîëæíû áûòü äîáàâëåíû ïðàâèëà, ðàçðåøàþùèåâõîäÿùèå ïîäêëþ÷åíèÿ íà öåëåâîé ïîðò øëþçà, à òàêæåïðàâèëà, ðàçðåøàþùèå îáìåí äàííûìè ìåæäó âíóòðåííåé öåëåâîéìàøèíîé è øëþçîì.WINDOWSÍà÷íåì, êàê ãîâîðèòñÿ, ñ àçîâ. Ïðîùå âñåãî ïðîáðîñ ïîðòîâ íàñòðîèòüâ îïåðàöèîííûõ ñèñòåìàõ ñåìåéñòâà Windows. Çäåñü âñå ýòî äåëàåòñÿ â«Ñâîéñòâàõ NAT»:1221. Çàõîäèì â «Àäìèíèñòðèðîâàíèå -> Ìàðøðóòèçàöèÿ», âûáèðàåìëîêàëüíóþ ìàøèíó, äàëåå «IP-ìàðøðóòèçàöèÿ -> NAT».2. Âêëþ÷àåì NAT äëÿ ëîêàëüíîãî èíòåðôåéñà.3. Ïåðåõîäèì ê âêëàäêå «Ñëóæáû è ïîðòû», âûáèðàåì èíòåðåñóþùóþíàñ ñëóæáó èëè äîáàâëÿåì ñâîþ.4.  îòêðûâøåìñÿ îêíå âûáèðàåì ïðîòîêîë, âõîäÿùèé ïîðò (òîò, êîòîðûéáóäåò âèäåí èçâíå), àäðåñ ìàøèíû âíóòðåííåé ñåòè è åå ïîðò.LINUX Linux âñå íàìíîãî ñëîæíåå, çäåñü íåîáõîäèìî îïåðèðîâàòü ïðàâèëàìèiptables/netfilter, áåç çíàíèÿ îñíîâ êîòîðîãî ïðîñòî íå îáîéòèñü. Äëÿîñóùåñòâëåíèÿ ïðîáðîñà ïîðòîâ ïðåäóñìîòðåíà öåëü DNAT, êîòîðóþíåîáõîäèìî èñïîëüçîâàòü â ïðàâèëàõ öåïî÷êè PREROUTING.  ñàìîìïðîñòåéøåì ñëó÷àå ïðàâèëî áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:iptables -t nat -A PREROUTING -p tcp --dst $GATE \--dport $PORT -j DNAT --to-destination $SERVER:$PORTÃäå $GATE — ýòî àäðåñ øëþçà, $PORT — ïðîáðàñûâàåìûé ïîðò, à ñâÿçêà$SERVER:$PORT — ýòî àäðåñ è ïîðò âíóòðåííåãî ñåðâåðà. Åñòåñòâåííî,÷òîáû ïðàâèëî ñðàáîòàëî, äîëæåí áûòü âêëþ÷åí ôîðâàðäèíã (õîòÿ íàøëþçå îí â ëþáîì ñëó÷àå âêëþ÷åí):# echo 1 > /proc/sys/net/ipv4/ip_forwardÏðîáðîñ ïîðòîâ âîçìîæåí è ñ äðóãîé ìàøèíû:$IPTABLES -t nat -A PREROUTING -p tcp --dst $IP \--dport $PORT -j DNAT --to-destination $SERVER:$PORT$IPTABLES -t nat -I POSTROUTING -p tcp --dst $SERVER \--dport $PORT -j SNAT --to $IPÝòî âïîëíå ëåãàëüíî, à èíîãäà è ïðîñòî íåîáõîäèìî.Ðàçëè÷íûå ïðåêîíôèãóðèðîâàííûå iptables-ñêðèïòû, òàêèå êàê,íàïðèìåð, çíàêîìûé ïîëüçîâàòåëÿì Debian, arno-iptables-firewall,òàêæå ìîæíî èñïîëüçîâàòü äëÿ áîëåå ïðîñòîé íàñòðîéêè ïðîáðîñàïîðòîâ. Íàïðèìåð, åñëè òû õî÷åøü ïðîáðîñèòü ïîðò 80 íà ìàøèíó192.168.0.100, äëÿ ýòîãî äîñòàòî÷íî äîáàâèòü ñòðîêó NAT_TCP_XÀÊÅÐ 08 /139/ 10
FORWARD="80>192.168.0.100" â ôàéë /etc/arno-iptables-firewall/firewall.conf è ïåðåçàãðóçèòü áðàíäìàóýð:$ sudo /etc/init.d/arno-iptables-firewall restartuse_sockets yes# Ïðîáðîñ ïîðòîâ:# ïðîòîêîë àäðåñ-ñåðâåðà-âíóòðè-ñåòè:ïîðò ïîðò-íà-øëþçåredirect_port tcp 192.168.0.100:80 80FREEBSDFreeBSD îòëè÷àåòñÿ òåì, ÷òî èìååò äâå íåçàâèñèìûå ðåàëèçàöèè ìåõàíèçìàNAT (à çíà÷èò, è òåõíîëîãèè ïðîáðîñà ïîðòîâ). Ïåðâàÿ íîñèò èìÿnatd è, êàê ìîæíî äîãàäàòüñÿ èç íàçâàíèÿ, ïðåäñòàâëÿåò ñîáîé äåìîíóðîâíÿ ïîëüçîâàòåëÿ, êîòîðûé ïðèíèìàåò «ñûðûå» ïàêåòû, âûïîëíÿåòíåîáõîäèìûå ïðåîáðàçîâàíèÿ àäðåñîâ è îòäàåò èõ îáðàòíî ÿäðó. Âòîðóþïðèíÿòî íàçûâàòü kernel nat, òî åñòü ìåõàíèçì NAT, ðåàëèçîâàííûé âÿäðå FreeBSD. Îí ïîçâîëÿåò âûïîëíÿòü ïðåîáðàçîâàíèå àäðåñîâ è ïðîáðîñïîðòîâ, èñïîëüçóÿ ïðàâèëà áðàíäìàóýðà ipfw.ßñíî, ÷òî âòîðàÿ ðåàëèçàöèÿ ïðîèçâîäèòåëüíåå è óäîáíåå â èñïîëüçîâàíèè,è ïîýòîìó ïðåäïî÷òèòåëüíåå. Îäíàêî kernel nat ïîÿâèëñÿâî FreeBSD íå òàê äàâíî, ïîýòîìó ìû ðàññìîòðèì îáà ïîäõîäà íà òîòñëó÷àé, åñëè â òâîåì ðàñï îðÿæåíèè îêàçàëàñü ìàøèíà, èñïîëüçóþùàÿóñòàðåâøóþ âåðñèþ ýòîé îïåðàöèîííîé ñèñòåìû. Èòàê, ìåòîä íîìåðîäèí: natd, divert è âñå-âñå-âñå. Äëÿ àêòèâàöèè NAT è ïðîáðîñà ïîðòîâ ñïîìîùüþ äåìîíà natd íåîáõîäèìî ïðîäåëàòü ñëåäóþùèå øàãè:1. Âêëþ÷èòü natd è ipfw â /etc/rc.conf:# vi /etc/rc.conf# Âêëþ÷àåì natdnatd_enable="YES"# rl0 — âíóòðåííèé èíòåðôåéñ øëþçànatd_interface="rl0"natd_flags="-f /etc/natd.conf"# Âêëþ÷àåì ipfwfirewall_enable="YES"firewall_type="/etc/ipfw.conf"2. Íàñòðîèòü NAT è ïðîáðîñ ïîðòîâ â /etc/natd.conf:# vi /etc/natd.confsame_ports yes3. ×òîáû âñå ïàêåòû, ïðîõîäÿùèå ÷åðåç âíåøíèé èíòåðôåéñ (rl1) øëþçà,ïåðåíàïðàâëÿëèñü â natd è îáðàáàòûâàëèñü èì, äîáàâèì ïðàâèëî divertâ /etc/ipfw.conf:ipfw add divert natd ip from any to any in via rl1Òàêæå ðàçðåøèì îáùåíèå âñåõ ñ âíóòðåííèì ñåðâåðîì:ipfw allow tcp from any to 192.168.0.100 \dst-port 80 in via rl0 setupÄàëåå ìîæíî äîáàâèòü ïðàâèëà ôèëüòðàöèè.Ìåòîä íîìåð äâà: ÿäåðíûé NAT. Àêòèâàöèÿ NAT ñ ïîìîùüþ ðåàëèçàöèèâíóòðè ÿäðà íå òðåáóåò íè÷åãî, êðîìå ïðàâèëüíîé íàñòðîéêèáðàíäìàóýðà ñ ïîìîùüþ äâóõ-òðåõ ïðàâèë. Íå áóäó ðàñïèñûâàòü âñåâ äåòàëÿõ, à ïðîñòî ïðèâåäó ïðîñòîé ïðèìåð, äåìîíñòðèðóþùèé óæåîáñóæäàâøèéñÿ âûøå ïðîáðîñ 80-ãî ïîðòà ñî øëþçà íà âíóòðåííèéñåðâåð:# vi /etc/ipfw.conf# Íàñòðàèâàåì NATnat 1 config log if rl1 reset same_ports \redirect_port tcp 192.168.0.100:80 80# Çàâîðà÷èâàåì âåñü òðàôèê ÷åðåç âíåøíèé èíòåðôåéñ â NATadd nat 1 ip from any to any via rl1Ïðàâèëà 'nat' èìåþò íåñêîëüêî îïöèé, áîëüøèíñòâî èç êîòîðûõ ñîâïàäàåòñ îïöèÿìè, èñïîëüçóåìûìè äåìîíîì natd. Íàïðèìåð, îïöèÿsame_ports ïðåäïèñûâàåò ìåõàíèçìó NAT ñîõðàíÿòü îðèãèíàëüíûåíîìåðà èñõîäÿùèõ ïîðòîâ äëÿ èñõîäÿùèõ ïàêåòîâ (íóæíî äëÿ ïðàâèëüíîéðàáîòû íåêîòîðûõ RPC-ïðîòîêîëîâ). Îïöèÿ rdirect_port èìååò òîòæå ñèíòàêñèñ, ÷òî è â ôàéëå /etc/natd.conf.XÀÊÅÐ 08 /139/ 10 123