SELinux आणि firewalld सह SSH पोर्ट कसा बदलावा
Rocky Linux किंवा AlmaLinux वर SSH पोर्ट बदलताना firewalld, SELinux port label आणि sshd_config योग्य क्रमाने बदला. सध्याचे session सुरू ठेवण्याची पद्धत जाणून घ्या.
SSH पोर्ट बदलण्यासाठी येथे तीन पायऱ्या का आवश्यक आहेत
Rocky Linux, AlmaLinux, CentOS Stream किंवा Fedora वर SSH पोर्ट बदलण्यासाठी एक संपादन पुरेसे नसते. नवीन पोर्टवरील कनेक्शन कार्य करते की नाही हे ठरवण्यात तीन स्वतंत्र प्रणालींची भूमिका असते. firewalld हे पॅकेट मशीनपर्यंत पोहोचू द्यायचे की नाही ते ठरवते. SELinux हे sshd ला त्या पोर्ट क्रमांकाशी bind करण्याची परवानगी आहे की नाही ते ठरवते. sshd_config कोणता पोर्ट वापरायचा अशी विनंती daemon कडे करते. SELinux ची पायरी चुकल्यास daemon सुरू होण्यास नकार देतो. firewalld ची पायरी चुकल्यास daemon सुरू होतो, listen करतो; परंतु त्याच्यापर्यंत कोणी पोहोचू शकत नाही.
Ubuntu वर हेच काम एक संपादन आणि restart ने होते, कारण Ubuntu मध्ये SELinux ऐवजी AppArmor वापरले जाते आणि sshd कोणत्या पोर्टवर bind करू शकतो यावर मर्यादा घालणारे profile समाविष्ट नसते. तेथे ufw चालू असल्यास, एक rule जोडा. एवढाच मुख्य फरक आहे. RHEL family च्या नव्या installation मध्ये firewalld चालू आणि SELinux enforcing स्थितीत असते. दोन्ही प्रणाली पोर्ट क्रमांकांचा विचार करतात.
हे काम पुढील क्रमाने करा. त्यामुळे प्रत्येक पायरीदरम्यान तुमचे सध्याचे session सुरू राहील:
- नवीन पोर्ट firewalld मध्ये उघडा आणि सध्या port 22 उघडा ठेवा.
semanageवापरून नवीन पोर्टसाठी SELinux label जोडा.- sshd configuration मध्ये पोर्ट सेट करा.
sshdrestart करा. त्यानंतर पहिला terminal बंद करण्यापूर्वी दुसऱ्या terminal मधून नवीन पोर्टवर login करा.
सुरुवात करण्यापूर्वी तुमच्या provider चे web console (VNC किंवा serial) शोधा आणि त्याद्वारे login करता येतो याची खात्री करा. बदलात काही चूक झाल्यास ते console पुन्हा प्रवेश करण्याचा तुमचा मार्ग असेल. नुकत्याच पैसे देऊन घेतलेल्या server मधून tenant स्वतःला बाहेर लॉक करून घेण्याचे सर्वात सामान्य कारणांपैकी port बदल हे एक आहे.
पहिल्यांदा semanage स्थापित करा
semanage हे SELinux धोरण सेटिंग्ज संपादित करणारे साधन आहे. Rocky Linux किंवा AlmaLinux ची किमान स्थापना केली असल्यास ते समाविष्ट नसते. ते policycoreutils-python-utils मध्ये उपलब्ध असते.
sudo dnf install -y policycoreutils-python-utilsहे पॅकेज स्थापित करण्यापूर्वी ही कमांड चालवल्यास sudo: semanage: command not found दिसते. याच टप्प्यावर अनेक वाचक SELinux स्थापित नाही असे मानून हा चरण वगळतात. SELinux स्थापित असते. फक्त व्यवस्थापन साधन उपलब्ध नसते. dnf ची syntax तुमच्यासाठी नवीन असल्यास, dnf आणि apt कमांडची समतुल्य रूपे तुम्हाला परिचित असलेल्या पद्धतीशी तिचा संबंध स्पष्ट करतात.
पोर्ट निवडा आणि तो कोणत्याही प्रक्रियेकडे नियुक्त नाही याची तपासणी करा
1024 ते 65535 मधील कोणताही मोकळा TCP पोर्ट वापरता येतो. एखादा पोर्ट निश्चित करण्यापूर्वी या दोन तपासण्या करा:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222पहिल्या तपासणीत त्या क्रमांकावर एखादी प्रक्रिया आधीपासून listening आहे का ते दिसते. दुसऱ्या तपासणीत SELinux policy ने तो पोर्ट इतर कोणत्यातरी service type ला आधीच नियुक्त केला आहे का ते दिसते. मोकळ्या पोर्टसाठी दोन्ही आदेश कोणतेही output देत नाहीत. policy ने तो पोर्ट आधीच दावा केलेला असल्यास, step 2 मधील semanage port -a हे ValueError: Port tcp/2222 already defined सह अपयशी ठरते. अशा वेळी दुसरा क्रमांक निवडा.
या मार्गदर्शिकेत सर्वत्र 2222 हे उदाहरण म्हणून वापरले आहे. 22 नंतर scanner सर्वप्रथम 2222 तपासतो. त्यामुळे प्रत्यक्ष सर्व्हरवर कमी स्पष्ट असा पोर्ट निवडा.
पायरी 1: firewalld मध्ये पोर्ट उघडा
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent डिस्कवरील zone file मध्ये नियम लिहिते आणि सुरू असलेल्या firewall मध्ये कोणताही बदल करत नाही. --reload डिस्कवरील configuration सुरू असलेल्या firewall मध्ये लोड करते. Reload वगळल्यास नियम अस्तित्वात राहतो, परंतु firewalld पुढच्या वेळी restart होईपर्यंत तो कोणतेही कार्य करत नाही. कोणतेही स्पष्ट कारण नसताना ही संपूर्ण प्रक्रिया अयशस्वी झाल्यासारखी दिसण्याचे हे सर्वात सामान्य कारणांपैकी एक आहे.
आत्तासाठी ssh service entry तशीच ठेवा. ही entry port 22 उघडा ठेवते आणि चाचणी करताना तुमचा fallback म्हणून काम करते.
तुमच्या provider चे control panel देखील तपासा. अनेक hosts VPS च्या पुढे, operating system च्या बाहेर, network firewall चालवतात. त्यामुळे firewalld मध्ये उघडलेला पोर्ट upstream स्तरावर अद्याप drop केला जाऊ शकतो. हे मॉडेल तुमच्यासाठी नवीन असल्यास, VPS साठी firewalld मूलभूत मार्गदर्शक मध्ये zones आणि runtime व permanent configuration मधील फरक स्पष्ट केला आहे.
पायरी 2: SELinux साठी पोर्टला label द्या
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a नवीन port assignment जोडते. -t ssh_port_t हा SSH ports साठी वापरला जाणारा type आहे. दुसरी command आता ssh_port_t मध्ये समाविष्ट असलेल्या सर्व गोष्टी दाखवते. त्यामुळे daemon मध्ये बदल करण्यापूर्वी तुमचा port number नोंदवला गेला आहे की नाही हे पडताळता येते.
SELinux कोणत्याही परिस्थितीत पोर्ट का अवरोधित करते
SELinux (security-enhanced Linux) प्रणालीवरील प्रत्येक object ला label देते. TCP port numbers देखील इतर objects प्रमाणेच objects असतात. SSH daemon sshd_t नावाच्या domain मध्ये confined असतो. Policy sshd_t ला ssh_port_t label असलेल्या TCP ports वर bind करण्याची परवानगी देते. सुरुवातीच्या configuration मध्ये हे label असलेला एकमेव port 22 असतो. Daemon ला 2222 वर bind करण्यास सांगितल्यावर kernel त्या port चे label तपासतो. त्या क्रमांकाला policy ने दिलेला generic type सापडल्यानंतर socket वर name_bind permission नाकारली जाते.
म्हणूनच हा failure firewall problem सारखा दिसत नाही. Listening socket तयार होण्यापूर्वीच kernel विनंती नाकारतो. त्यामुळे sshd error नोंदवतो आणि बंद होतो. Firewall problem याच्या उलट असतो. Daemon चालू आणि निरोगी असतो, पण येणारे packets मार्गातच discard केले जातात.
getenforce system कोणत्या mode मध्ये आहे ते दाखवते. Permissive मध्ये denial नोंदवला जातो, पण तो लागू केला जात नाही. त्यामुळे port change कार्यरत असल्याचे दिसते. मात्र कोणी setenforce 1 चालवल्यावर किंवा system enforcing mode मध्ये reboot झाल्यावर ते काम करणे थांबते. कोणताही mode असला तरी port ला योग्य label द्या. सर्व्हरसाठी SELinux basics मार्गदर्शक modes, contexts आणि booleans यांचे सविस्तर स्पष्टीकरण देते. SELinux मुळे प्रभावित होणारे हे एकमेव objects नाहीत. Path ला relabel करेपर्यंत हीच policy container ला mounted host directory वाचण्यापासून रोखते. म्हणूनच Rocky Linux किंवा AlmaLinux वर Docker install करणे या प्रक्रियेत SELinux साठी एक पायरी असते, जी Ubuntu guides मध्ये कधीही नमूद केलेली नसते.
पायरी 3: sshd configuration मध्ये पोर्ट सेट करा
Rocky Linux 9 आणि 10, AlmaLinux 9 आणि 10 तसेच सध्याच्या Fedora मध्ये /etc/ssh/sshd_config ची सुरुवात include line ने होते. त्यामुळे तुमचा बदल drop-in file मध्ये करणे योग्य ठरते. त्यानंतर package updates तुमच्या बदलाशी संघर्ष करणार नाहीत.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tgrep ला Include line सापडली नाही, तर Rocky Linux 8 आणि इतर जुन्या images मध्ये असे होऊ शकते. अशा वेळी Port 2222 थेट /etc/ssh/sshd_config मध्ये लिहा. sshd -t संपूर्ण configuration चे parsing करते आणि drop-ins चाही समावेश करते. ती syntax errors दाखवते. restart करण्यापूर्वी दाखवलेल्या सर्व त्रुटी दुरुस्त करा, कारण configuration parse न झाल्यास daemon पुन्हा सुरू होत नाही.
Port एकापेक्षा जास्त वेळा दिसू शकते आणि sshd सूचीतील प्रत्येक पोर्टवर listen करते. पहिल्या दिवशी Port 22 सोबत Port 2222 ठेवणे ही स्वस्त safety net आहे; मात्र ते काढून टाकण्याचे लक्षात ठेवा.
sshd socket unit द्वारे सुरू केले आहे का?
काही images दीर्घकाळ चालणारी service म्हणून सुरू करण्याऐवजी systemd socket activation द्वारे SSH सुरू करतात. अशी रचना असल्यास listening socket systemd च्या नियंत्रणाखाली असतो आणि connections sshd कडे पाठवतो. त्यामुळे sshd_config मधील Port ओळ पूर्णपणे दुर्लक्षित केली जाते. कोणतीही सेवा restart करण्यापूर्वी तपासा:
systemctl is-enabled sshd.socketenabled उत्तराचा अर्थ असा की port sshd_config मध्ये नव्हे, तर socket unit मध्ये सेट केला आहे:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222स्वतंत्र ListenStream= आवश्यक आहे. Drop-ins मधील values एकत्र साठवल्या जातात. त्यामुळे list प्रथम रिकामी करण्यासाठी empty assignment न दिल्यास socket 2222 सोबत 22 वरही listening ठेवतो. हे sudo systemctl daemon-reload ने लागू करा आणि त्यानंतर sudo systemctl restart sshd.socket चालवा. तुमच्या server वर unit disabled असेल किंवा उपलब्ध नसेल, तर हा विभाग तुमच्यासाठी लागू होत नाही.
चरण 4: रीस्टार्ट करा, त्यानंतर दुसऱ्या टर्मिनलमधून चाचणी घ्या
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdहे टर्मिनल उघडे ठेवा. त्यातून logout करू नका. आपल्या मशीनवर दुसरे टर्मिनल उघडा आणि नवीन port वर connect करा:
ssh -p 2222 youruser@203.0.113.10दुसऱ्या login ने यशस्वीरीत्या काम केल्यानंतरच पहिले session बंद करा. ते काम न झाल्यास, सर्व बदल पूर्ववत करण्यासाठी आवश्यक shell अजूनही तुमच्याकडे असेल. ही एक सवय पाच मिनिटांच्या बदलामध्ये आणि provider console वर घालवाव्या लागणाऱ्या संपूर्ण दुपारमध्ये फरक करते.
Firewall drop किंवा SELinux denial? दोन्ही वेगळे कसे ओळखावे
तुमच्या laptop वरून हे दोन्ही अपयश जवळजवळ सारखे दिसतात. Server वर त्यांची लक्षणे पूर्णपणे वेगळी दिसतात.
systemctl status sshdमध्ये unit failed दिसत असेल, तर daemon ला त्याचा socket मिळालाच नाही. ही configuration error किंवा SELinux denial आहे.- Unit active असेल आणि
ss -tlnpमध्ये sshd नवीन port वर bound असल्याचे दिसत असेल, तर daemon व्यवस्थित आहे. समस्या network path मध्ये आहे: firewalld, provider चा स्वतंत्र firewall किंवा तुम्ही वापरलेला address आणि port.
SELinux च्या प्रकरणात अंदाज न लावता audit record वाचा:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagername_bind denial मधील class tcp_socket, comm="sshd" मधील process, src= मधील port number आणि tcontext= मधील त्या port वर प्रत्यक्ष लागू असलेला label दाखवते. शेवटचे field हे उत्तर देते. ssh_port_t व्यतिरिक्त काहीही दिसत असल्यास, तुम्ही वापरत असलेल्या port वर step 2 लागू झालेले नाही. याचे सामान्य कारण म्हणजे port number मधील typo किंवा चुकीचा protocol. Record चे वाक्यात रूपांतर करण्यासाठी sealert वापरायचे असल्यास setroubleshoot-server install करा.
Kernel ने bind नाकारल्यावर sshd स्वतः लिहिते तो message असा दिसतो:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.1024 पेक्षा मोठ्या port वर Permission denied दिसत असल्यास, bind करण्यासाठी root privilege आवश्यक नसल्यामुळे, हे SELinux चे स्पष्ट लक्षण आहे. त्याच line मधील Address already in use हा वेगळा fault दर्शवतो: दुसरी process तो port वापरत आहे. Client कडून connection refused आणि connection timed out यांमधील फरक हे दोन्ही network cases वेगळे करतो. Refusal म्हणजे तुमचे packet host पर्यंत पोहोचले आणि कोणतीही process listening नव्हती. Timeout म्हणजे कोणत्याही प्रक्रियेने उत्तर दिले नाही.
पोर्ट 22 बंद करा आणि clients अद्ययावत करा
नवीन पोर्टवरून अनेक login यशस्वी झाल्यानंतर 22 वरील प्रवेश बंद करा:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allपोर्ट 22 वरील SELinux label बदलू नका. तो base policy मधून येतो. Firewall ने packets स्वीकारणे बंद केल्यानंतर तो कोणताही प्रवेश देत नाही.
त्यानंतर clients मध्ये बदल करा. Default port गृहीत धरणाऱ्या प्रत्येक tool ला आता नवीन port सांगावा लागेल. प्रत्येक वेळी -p टाइप करण्याऐवजी तो तुमच्या स्वतःच्या machine वरील ~/.ssh/config मध्ये एकदाच नोंदवा:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync आणि Ansible हे सर्व त्या file मधून configuration वाचतात. मात्र port 22 hardcode केलेली backup jobs, monitoring checks आणि cron scripts हे करत नाहीत. त्यामुळे हा बदल नुकताच केलेला असताना ती ठिकाणे शोधून अद्ययावत करा.
पोर्ट बदलल्याने काय साध्य होते आणि काय होत नाही
यामुळे log मधील अनावश्यक नोंदी कमी होतात. Automated scanners सतत port 22 वर मोठ्या प्रमाणात विनंत्या पाठवतात. हा port बदलल्यावर journal मधील अशा नोंदींपैकी बहुतेक नोंदी दिसत नाहीत. त्यामुळे वास्तविक घटना ओळखणे सोपे होते. हा security control नाही. संपूर्ण port range तपासणारा कोणताही scanner तुमचा daemon शोधू शकतो आणि त्याचा version banner वाचू शकतो. पोर्ट बदलण्याला housekeeping म्हणून घ्या. प्रत्यक्ष संरक्षणासाठी key-only authentication वापरा आणि password logins बंद करा. याची प्रक्रिया VPS साठीच्या SSH hardening मार्गदर्शकात टप्प्याटप्प्याने दिली आहे.
वरील सर्व प्रक्रिया दोन्ही प्रमुख RHEL rebuilds वर अगदी त्याच प्रकारे कार्य करते, कारण ते समान source पासून तयार केलेले आहेत. तुम्ही अजूनही त्यापैकी एक निवडत असाल, तर Rocky Linux आणि AlmaLinux ची तुलना पहा. CentOS ने 2020 मध्ये rebuild असणे थांबवले. त्यामुळे आता जवळपास समान दोन rebuilds मधून निवड करावी लागते. ही संपूर्ण पार्श्वभूमी Red Hat पासून CentOS, Rocky आणि AlmaLinux पर्यंतचा इतिहास यात दिली आहे. जुना guide अनुसरण्यापूर्वी तुम्हाला प्रत्यक्षात कोणता release देण्यात आला आहे ते cat /etc/os-release वापरून तपासा. Rocky Linux 8 साठी लिहिलेले guides अजूनही search results मध्ये वर दिसतात. त्यांमधील semanage आणि firewall-cmd पायऱ्या अजूनही योग्य आहेत. मात्र Rocky 8 मध्ये sshd_config.d include line नाही आणि विचारात घेण्यासाठी socket unit देखील नाही. त्यामुळे त्या guides मधील sshd संबंधी भाग सध्याच्या box शी जुळत नाही.
fail2ban ला नवीन पोर्टबद्दल सांगणे आवश्यक आहे
fail2ban base repositories मध्ये उपलब्ध नाही. ते EPEL (enterprise Linux साठी अतिरिक्त packages) मधून मिळते:
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldfail2ban-firewalld subpackage fail2ban कडून firewalld मार्फत bans लागू करून घेतो. firewalld ruleset नियंत्रित करत असलेल्या सर्व्हरवर हीच पद्धत वापरणे योग्य आहे.
मूळ sshd jail मध्ये port = ssh सेट केलेले असते. हे नाव /etc/services मार्फत 22 वर resolve होते. बदल केल्यानंतर jail अशा पोर्टवर लक्ष ठेवते ज्यावर कोणीही हल्ला करत नाही. त्यामुळे 2222 वर failed logins वाढत असतानाही कोणालाही ban केले जात नाही. /etc/fail2ban/jail.local मध्ये पोर्ट क्रमांकाने सेट करा:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd failures /var/log/secure ऐवजी journal मधून वाचते. Minimal install मध्ये rsyslog उपलब्ध नसेल, तेव्हा हा अधिक सुरक्षित पर्याय आहे. ते sudo systemctl enable --now fail2ban ने सुरू करा आणि jail ची स्थिती sudo fail2ban-client status sshd ने तपासा. Jail syntax Ubuntu 24.04 वरील fail2ban SSH setup मध्ये वापरलेल्या syntax सारखाच आहे. फक्त package source आणि ban action वेगळे आहेत.
पोर्ट बदलण्यापेक्षा पॅचिंग अधिक महत्त्वाचे आहे
SSH पोर्ट बदललेला असला, तरी चार महिन्यांपासून सुरक्षा अद्यतने लागू केलेली नसतील, तर अशी सर्व्हर व्यवस्था दररोज स्वतः पॅच होणाऱ्या port 22 वरील सर्व्हरपेक्षा अधिक असुरक्षित असते. तुम्ही आधीच root म्हणून लॉग इन केलेले असताना, त्याच सत्रात unattended updates सुरू करा: Rocky Linux आणि AlmaLinux वर स्वयंचलित dnf अद्यतने या लेखात timer आणि अद्यतने डाउनलोड करण्याची किंवा ती लागू करण्याची निवड स्पष्ट केली आहे. स्थापित केलेले update आधीच्या कोडवर चालू असलेल्या daemon ना पुन्हा सुरू करत नाही. त्यामुळे openssh-server किंवा त्याच्याशी link होणारी library या batch मध्ये अद्ययावत झाली असल्यास, आणखी कोणत्या सेवा पुन्हा सुरू करायच्या आहेत किंवा reboot आवश्यक आहे हे तपासणे यासाठी लागणारा एक मिनिट देणे योग्य ठरते.
FAQ
Rocky Linux वर port बदलल्यानंतर sshd सुरू होण्यात अपयशी का ठरतो?
बहुतेक वेळा कारण SELinux port label नसणे हे असते. sshd हे sshd_t domain मध्ये confined पद्धतीने चालते. Policy त्याला फक्त ssh_port_t label असलेल्या port वर bind होऊ देते. Default configuration मध्ये हा फक्त port 22 असतो. Kernel bind नाकारतो. त्यामुळे daemon listening सुरू करण्याऐवजी बंद होते. journalctl -u sshd मध्ये error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. या स्वरूपाची ओळ असते. स्वतःचा port number देऊन sudo semanage port -a -t ssh_port_t -p tcp 2222 चालवा. त्यानंतर service restart करा. semanage सापडत नसेल, तर आधी policycoreutils-python-utils install करा.
SELinux permissive mode मध्ये असले तरी semanage आवश्यक आहे का?
होय. Permissive mode मध्ये denial log केली जाते आणि bind ला परवानगी मिळते. त्यामुळे बदल यशस्वी झाल्यासारखा दिसतो. मात्र label अजूनही नसतो. कोणी setenforce 1 चालवले किंवा box /etc/selinux/config मध्ये SELINUX=enforcing सह boot झाले, तर त्या port वर sshd सुरू होणे थांबते. Label जोडण्यासाठी एक command पुरेसा आहे. त्यामुळे अन्यथा काही आठवड्यांनंतर स्पष्ट कारण नसताना दिसणारे failure टाळता येते.
Port labelled आहे आणि sshd चालू आहे, तरी माझे connection timeout का होते?
Daemon चालू असल्याने SELinux कडून अडथळा नाही. त्यामुळे येणारे packet मार्गात drop होत आहे. तुमच्या port साठी sudo firewall-cmd --list-ports तपासा. तसेच --permanent rule नंतर firewall-cmd --reload चालवले आहे याची खात्री करा. Permanent rule स्वतःहून running firewall पर्यंत लागू होत नाही. त्यानंतर VPS च्या पुढे असलेल्या स्वतंत्र network firewall साठी host चे control panel तपासा. अनेकदा अडथळा याच दुसऱ्या ठिकाणी असतो. Operating system मधील कोणतीही तपासणी तो दाखवणार नाही.
22 ऐवजी कोणता port वापरावा?
1024 ते 65535 मधील कोणताही उपलब्ध TCP port वापरू शकता. प्रत्यक्ष server वर 2222 आणि 22222 टाळा. कारण scanners 22 नंतर लगेच हे ports तपासतात. sudo ss -tlnp वापरून number उपलब्ध आहे याची खात्री करा. sudo semanage port -l वापरून SELinux policy ने तो आधीच वापरासाठी घेतलेला नाही याची खात्री करा. तसेच पुढे install करू शकणाऱ्या service साठी नियुक्त केलेला port वापरू नका. लक्षात ठेवण्यास कठीण असलेला मोठा number चालेल. तो ~/.ssh/config मध्ये एकदाच लिहावा लागेल आणि पुन्हा type करावा लागणार नाही.