SSH是
Secure Shell Protocol
的簡寫,由IETF網絡工做小組(Network working Group
)指定;在進行數據傳輸以前,SSH先對聯機數據包經過加密技術進行加密處理,加密後在進行數據傳輸。確保了傳遞的數據安全.nodeSSH是專爲
遠程登陸會話
和其餘網絡服務提供的安全性協議
。利用SSH協議能夠有效的放置遠程管理過程當中的信息泄露問題,在當前的生產環境運維工做中,絕大多數企業廣泛採用SSH協議服務來代替傳統的不安全的遠程聯機服務軟件,如telnet
(23端口,非加密)linux在默認狀態下,SSH服務主要提供了兩個服務功能,一個是提供相似Telnet遠程聯機服務器的服務,即上面提到的SSH服務;另外一個是相似FTP服務的
sftp-server
,藉助SSH協議來傳輸數據的,提供更安全的SFTP服務(vsftp,proftp
)nginxssh 客戶端(ssh命令)還包含一個遠程安全拷貝命令scp,也是經過ssh協議工做.git
小結
算法
# 一、SSH是安全的加密協議,用於遠程鏈接linux服務器 # 二、SSH默認端口是22,安全協議版本SSH2,除了2以外還有SSH1(漏洞) # 三、SSH服務端主要包含兩個服務協議SSH遠程鏈接,SFTP服務 # 四、Linux SSH客戶端包含ssh遠程鏈接命令,以及遠程拷貝scp命令
# SSH服務由服務端軟件OpenSSH (openssl) # 客戶端(常見的有SSH(linux),SecureCRT,Putty,Xshell)組成 # SSH服務默認使用22端口提供服務,它有兩個不兼容的SSH協議版本分別是1.x和2.x rpm -qa openssh openssh-6.6.1p1-31.el7.x86_64 # 遠程鏈接安裝包 rpm -qa openssl openssl-1.0.2k-19.el7.x86_64 # 加密安裝包
OpenSSH同時支持SSH
1.x
和2.x
用SSH 2.x的客戶端程序不能連接到SSH1.x的服務程序上shellSSH服務是一個
守護進程
(daemon),他在後臺運行並響應來自客戶端的鏈接請求,SSH服務端的進程名爲sshd
,負責實時監聽遠程
SSH客戶端的鏈接請求,並進行處理,通常包括公共密鑰認證、密鑰交換、對稱密鑰加密和非安全鏈接等。vimSSH客戶端包含
ssh
以及像scp
(遠程拷貝)slogin
(遠程登陸)sftp
(安全FTP文件傳輸)等應用程序
centos
SSH
的工做機制大體是本地的ssh客戶端發送一個鏈接請求到遠程的ssh服務器,服務器檢查鏈接的客戶端發送的數據包和ip地址,若是確認合法
,就會發送密鑰給SSH的客戶端,此時,客戶端本地再將密鑰發回給服務端,本身創建鏈接。SSH1.x和SSH2.x在鏈接協議上有一些安全方面
的差別安全
SSH加密技術是將人類能夠看得懂的數據,經過必定的特殊的程序算法,把這些數據變成雜亂的無心義的信息,而後,經過網絡進行傳輸,二擋到了目的地後,在經過對應的解密算法,把傳過來的加密的數據信息解密成加密前的可讀取的正常數據。所以,當數據在互聯網上傳輸時即便被有心的黑客監聽竊取了,也很難獲取到真正須要的數據服務器
網絡上的數據包加密技術通常是經過所謂的一對
公鑰
和私鑰
(Public key and Pivate key)組合撐的密鑰對進行加密
與解密
操做。
每一臺SSH服務器主機均可以使用RSA加密方式來產生一個
1024-bit
的RSA Key 這個RSA的加密方式就是用來產生公鑰和私鑰的算法之一。當服務
啓
動時,就會產生一個768 bit的臨時公鑰存放在Server
中
grep ServerKey /etc/ssh/sshd_config #ServerKeyBits 1024
在
SSH 1.x
的聯機過程當中,當Server接收Clinet端
的Private Key
後,就再也不針對該次聯機的Key pair進行檢驗。若此時有而已黑客對該聯機key pair
插入而已的程序代碼時,因爲服務端你不會在檢驗聯機的正確性,所以可能會接收該程序代碼,從而致使系統被黑.爲了改正這個缺點,SSH version2多加了一個確認聯機
正確
性的Diffie-Hellman機制
在每次數據傳輸中,Server都會以該機制檢查數據的來源是否正確,這樣,能夠避免聯機過程當中被插入而已程序代碼的問題
另外,SSH2同時支持
RSA
和DSA
密鑰,可是SSH1僅支持RSA密鑰因爲SSH1協議自己存在較大問題,建議使用SSH2的
聯機模式
當Client端SSH聯機請求傳送過來時,Server就會將這個768-bit的公鑰傳給Client端
此時Client會將此公鑰與先前存儲的公鑰進行對比,看是否一致,判斷標準是Client端聯機用戶目錄下
~/.ssh/known_hosts
文件的內容(linux-客戶端
)
不加用戶默認是
root 不加
-p 指定端口 默認是
22`
ssh -p22222 root@39.108.140.0 The authenticity of host '39.108.140.0 (39.108.140.0)' can't be established. ECDSA key fingerprint is 17:33:ef:9b:05:b3:69:d3:20:48:49:e1:28:9b:7c:c8. Are you sure you want to continue connecting (yes/no)? # 鏈接密碼文件存放路徑 cat /root/.ssh/known_hosts 121.36.43.223 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDgQ7H6KDIPTzOklwMSOxgFI0Xc3rgvwPnCLIuXIuzaCfYQBouM6owCArpj2CXEyk40lSn96ktW1vETbP1JmjEY= # 第一次SH鏈接的時候,本地會產生一個密鑰文件~/.ssh/known_hosts
# 一、用密鑰登陸,不用密碼登陸 # 二、牤牛陣法:解決SSH安全問題 # 三、防火牆封閉SSH,指定源限制(局域網,信任公網) # 四、開啓SSH只監聽本地內網IP(ListenAddress 10.0.0.8) # 五、儘可能不給服務器外網IP
scp的基本語法使用:
scp -sercure copy
(remote file copy program
)
推push
scp -P22 -rp /root/test.txt root@39.108.140.0:/root/
拉pull
scp -p22 -rp root@39.108.140.0:/root/test.txt ./ # -P 指定端口,默認22,可忽略 # -p 表示拷貝先後保持文件或目錄屬性 # -r 遞歸,表示拷貝目錄 # -l 限制速度 # 小結 # 一、scp是加密的遠程拷貝,而cp僅爲本地拷貝 # 二、能夠把數據從一臺機器推送到另外一臺機器,也能夠從其餘服務器把數據拉回到本地執行命令的服務器 # 三、每次都是全量完成拷貝,所以效率不高,適合第一次拷貝用,若是須要增量拷貝,用rsync
# 1. rz,sz(lrzsz) # 2. winscp WinSCP-v4.0.5 基於SSH,sftp # 3. SFX(xshell) 4) SFTP 基於SSH加密傳輸 # 4. samba,http,ftp,nfs # FTP工具:vsftp、proftpd、SFTP # linux sftp客戶端登陸sftp服務方法 # 登陸FTP的方法就是 sftp -oPort=22 root@39.108.140.0: sftp> put test.txt Uploading test.txt to /root/test.txt test.txt 100% 0 0.0KB/s 00:00 sftp> ls test.txt test.txt
基於口令的安全驗證的方式就是你們如今一直在用的,只要知道服務器的SSH
端口號
和口令
,應服務器的IP
及開放的端口
,默認都爲22
,就能夠經過ssh客戶端登陸到主機,此時聯機過程當中全部傳輸都是加密
的
基於密鑰的安全驗證方式是指,須要依靠
密鑰
,也就是必須事先創建一對密鑰
,而後把公用密鑰(Publickey
)放在須要訪問的目標服務器上,另外,個還須要把私有密鑰
(Private key)放到SSH客戶端或對應的客戶端服務器上此時,若是要想鏈接到這個帶有
公用密鑰
的SSH服務器,客戶端SSH軟件或者客戶端端服務就會想SSH服務端發出請求,請求用聯機用戶密鑰進行安全鏈接。SSH服務會在收到請求以後,會如今改SSH服務器上鍊接的用戶的加密路下 放上去的對應用戶密鑰,而後把它和鏈接的SSH客戶端發來進行密鑰,若是兩個密鑰一直SSH服務就會用公用密鑰加密「質詢
」(challenge)並把它發送給SSH客戶端
修改SSH服務的運行參數,是經過修改配置文件
/etc/ssh/sshd_config
實現的通常來講SSH服務使用默認的配置已經夠很好的工做,若是對安全要求不高,僅僅提供SSH服務的狀況不須要修改任何配置
sshd_config配置文件說明:
cp /etc/ssh/sshd_config{,.bak} vim /etc/ssh/sshd_config Port 52113 # ssh鏈接端口默認爲22,修改端口號能夠提升級別 PermitRootLogin no # 禁止root遠程登陸 PermitEmptyPasswords no # 禁止空密碼的用戶登陸 UseDNS no # 不使用DNS進行解析 GSSAPIAuthentication no # 會致使SSH鏈接慢 # ssh遠程鏈接服務滿解決方法 sed -ri '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
sed -i '13 iPort 52113\nPermitRootLogin no \n 禁止root登陸 PermitEmptyPasswords no \n # 禁止使用密碼 UseDNS no\n # 禁用DNS GSSAPIAuthentication no' # 禁用GSSAPI sshd_config
cat >>/etc/hosts <<EOF 39.108.140.0 blog 149.129.38.117 blog2 121.36.43.223 huawei 49.233.69.195 tenxun 116.196.83.113 jd EOF useradd oldboy echo "123456"|passwd --stdin youmen su – youmen ssh-keygen -t dsa //非交互式建立密鑰 #ssh-keygen是生產密鑰的工具 -t參數是指定密鑰的類型,這裏是創建dsa類型密鑰 #也可使用ssh-keygen -t rsa來創建rsa類型密鑰 #RSA與DSA加密算法的區別 #RSA:是一種加密算法(PS:RSA也能夠進行數字簽名的)它的簡寫的來由是RonRivest、Adi Shamir和LeonAdleman 這三個姓氏加在一塊兒就是RSA #DSA就是數字簽名算法的英文全稱的簡寫,即Digital Sigenature Algorithm=DSA # RSA既能夠進行加密,也能夠進行數字簽名實現認證,而DSA只能用於數字簽名
yum -y install sshpass ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa &>/dev/null sshpass -p youmen ssh -o StrictHostKeyChecking=no root@192.168.43.159 # 一鍵生成密鑰對 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.43.159 # -i 表明要發送的文件 # ssh-copy-id 只能發公鑰,不能發私鑰 # 1 免密碼登陸是單向的,方向從私鑰(鑰匙)==》公鑰(鎖) # 2 SSH免密碼登陸基於用戶的,最好不要跨不一樣的用戶 # 3 ssh鏈接慢的問題解決
# 一、ssh優化和hosts解析 # 二、建立用戶 # 三、生成密鑰對 # 四、分發公鑰到全部服務器 ssh-copy-id # 五、測試 遠程鏈接ssh 遠程執行命令ssh ifconfig # 遠程拷貝文件scp rsync-e隧道模式
1. sudo提權實現沒有權限用戶拷貝
echo「youmenALL= NOPASSWD:/usr/bin/rsync 」>>/etc/sudoers visudo -c scp -P52113 hosts oldboy@192.168.43.159:~ # 最好發送到家目錄下,直接發送到/下是沒有權限 ssh -p22 -t youmen@192.168.43.159 sudo rsync ~/hosts /etc/hosts # 須要受權sudo權限
2. 使用suid實現沒有權限用戶拷貝
chmod u+s `which rsync` scp -P22 hosts oldboy@192.168.43.159:~ ssh -p22 youmen@192.168.43.159 rsync ~/hosts /etc/hosts
3. 使用root進行操做
# rsync使用 rsync -avz hosts -e ‘ssh -p 22’youmen@192.168.43.159:~ # 能夠增量備份
cat view.sh #!/bin/sh for n in blog2 tenxun jd huawei do echo -n "====$n====" ssh -p 22 $n $1 done [root@nginx_test ~]# sh view.sh "cat /etc/redhat-release" ====blog2====CentOS Linux release 7.3.1611 (Core) ====tenxun====CentOS Linux release 7.6.1810 (Core) ====jd====CentOS Linux release 7.6.1810 (Core) ====huawei====CentOS Linux release 7.4.1708 (Core)
cat file.sh #!/bin/sh . /etc/init.d/functions if [ $# -ne 1 ];then echo "USAGE:/bin/sh $0 FILENAME" $ exit 1 fi for n in blog2 tenxun jd huawei do echo -n "====$n====" scp -P22 $1 $n: &>/dev/null if [ $? -eq 0 ];then action "dis $1 to $n" /bin/true else action "$n" /bin/false fi done sh file.sh /etc/hosts ====blog2====dis /etc/hosts to blog2 [ OK ] ====tenxun====dis /etc/hosts to tenxun [ OK ] ====jd====dis /etc/hosts to jd [ OK ] ====huawei====dis /etc/hosts to huawei [ OK ]
SSH會自動加密和解密全部SSH客戶端與服務端之間的網絡數據。可是,SSH還可以將其餘TCP端口的網絡數據通SSH連接來轉發,而且自動提供了相應的加密及解密服務。這一過程也被叫作"隧道"(tunneling),這是由於SSH爲其餘TCP連接提供了一個安全的通道來進行傳輸而得名。例如,Telnet ,SMTP ,LDAP這些TCP應用均可以從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,若是工做環境許中的防火牆限制了一些網絡端口的使用,可是容許SSH的鏈接,也可以將經過將TCP用端口轉發來使用SSH進行通信。
# 1. 加密SSH Client端至SSH Server端之間的通信數據。 # 2. 突破防火牆的簡直完成一些以前沒法創建的TCP鏈接。
命令 -L localport:remotehost:remotehostport sshserver
說明
localport # 本機開啓的端口號 remotehost # 最終鏈接機器的IP地址 remotehostport # 轉發機器的端口號 sshserver # 轉發機器的IP地址 # -L 本機端口 # -f 後臺啓用,能夠在本機直接執行命令,無需另開新終端 # -N 不打開遠程shell,處於等待狀態,不跳到遠程主機,還在主機上,只是搭好了隧道,橋搭好,不ssh上去 # -g 啓用網關功能 # -R 服務端口 # 舉例: ssh –L 9527:telnetsrv:23 -N sshsrv telnet 127.0.0.1 9527 # 當訪問本機的9527的端口時,被加密後轉發到sshsrv的ssh服務,再解密被轉發到telnetsrv:23 data < >localhost:9527 < > localhost:XXXXX < > sshsrv:22 < > sshrv:yyyyy < > telnetsrv:23
背景:企業內部C服務器只容許telnet鏈接(23端口)訪問,不容許外部直接訪問,B服務器是一個ssh服務器;有一個用戶須要從外部鏈接到企業內部的C服務器。
前提:防火牆容許22端口進來(或者企業內部有一個堡壘機,ssh -t經過堡壘機進去)。
原理: 數據一旦telnet之後,數據會發送到本機9527端口,再在本機開一個隨機端口,充當ssh客戶端,再把數據流量發送到22端口的ssh服務端,收到數據之後,解密數據,臨時開一個隨機端口充當客戶端,再把流量發送到23端口telnet服務端
機器: blogA用戶,huawei模擬B機器,tenxun模擬C機器
節點名 | IP | 軟件版本 | 硬件 | 網絡 | 說明 |
---|---|---|---|---|---|
CentOS7-A | 39.108.140.0 | 1C2G | 公有云 | 阿里雲 | |
CentOS6-B | 121.36.43.223 | 1C2G | 公有云 | 華爲雲 | |
CentOS6-C | 49.233.69.195 | 1C2G | 公有云 | 騰訊雲 |
# ssh協議裏面封裝了telnet,一旦A鏈接了B主機,當即使用telnet鏈接C主機,此過程能夠突破防火牆的限制 # 實驗 # A->C 訪問被限制 # A-B->C 使用B主機做爲跳板突破訪問限制
C機器經過iptables拒絕A機器登陸
[root@C ~]# iptables -A INPUT -s 39.108.140.0 -j REJECT [root@C ~]# yum -y install telnet-server xinetd [root@C ~]# systemctl start telnet.socket [root@C ~]# systemctl start xinetd [root@C ~]# ss -tnl |grep 23 LISTEN 0 128 [::]:23 [::]:* # 此時咱們A機器是直接鏈接不上C機器的 [root@A ~]# ssh 49.233.69.195 ssh: connect to host 49.233.69.195 port 22: Connection refused # 開啓端口轉發(telnet隧道) [root@A ~]# ssh -L 10000:49.233.69.195:23 -Nf 121.36.43.223 # 經過本地9527端口訪問centos6-1服務器IP地址使用telnet協議23端口,跳板機ip地址 # 隧道已經搭建好了,此時A主機能夠經過telnet訪問C主機 telnet 127.0.0.1 10000 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Kernel 3.10.0-1062.9.1.el7.x86_64 on an x86_64 c login: youmen Password: Last login: Fri Jun 12 22:32:04 from centos-b [root@C ~]$ # 如何須要刪除這個鏈接使用killall ssh便可 killall ssh # 刪除搭建的橋 telnet 127.0.0.1 10000 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused
遠程轉發機制
# -R sshserverport:remotehost:remotehostportsshserver # 舉例 ssh–R 9527:telnetsrv:23 –N sshsrv # 讓sshsrv偵聽9527端口的訪問,若有訪問,就加密後經過ssh服務轉發請求到本機ssh客戶端,再由本機解密後轉發到telnetsrv:23 Data < > sshsrv:9527 < > sshsrv:22 < > localhost:XXXXX < > localhost:YYYYY< >telnetsrv:23 # 需求: # 在A(Centos7)上開啓smtp服務(postfix),B(Centos6)作跳板,C(Centos6-1)客戶端給Centos7發送郵件 # 流程解釋 C-x->A (拒絕訪問) C-B->A (經過遠程代理,接受訪問)
環境依然是上面三臺機器,只是C服務器換成116.196.83.113 (JD)這臺服務器
[root@A ~]# vim /etc/postfix/main.cf # inet_interfaces = localhost # 註釋此行,不讓接口直接綁定在127.0.0.1上 [root@A ~]# systemctl restart postfix [root@A ~]# ss -tnl |grep 25 LISTEN 0 100 *:25 *:* LISTEN 0 100 :::25 :::* [root@A ~]# yum -y install telnet-server [root@A ~]# systemctl start telnet.socket # 若是B上面有一些影響的防火牆規則就將它刪掉 [root@B ~]# iptables -nL --line-number [root@B ~]# iptables -D INPUT 1 # 測試下C能不能telnet 25端口鏈接A [root@C ~]# 39.108.140.0 25 Trying 39.108.140.0... Connected to 39.108.140.0. Escape character is '^]'. 220 nginx_test.localdomain ESMTP Postfix # 設置防火牆策略,使A不接受C的一切請求 [root@A ~]# iptables -A INPUT -s 39.108.140.0 -j REJECT [root@C ~]# telnet 39.108.140.0 25 Trying 39.108.140.0... telnet: connect to address 39.108.140.0: Connection refused # 使用B遠程轉發,發送郵件到 [root@B ~]# ssh-copy-id root@116.196.83.113: # 使用B遠程轉發,發送郵件到A,最好免密,不然須要手動口令驗證 [root@B ~]# ssh -R 50000:39.108.140.0:25 -fN 121.36.43.223 # 此時能夠到C跳板機看到已經有端口在監聽了 [root@C ~]# ss -tnl |grep 50000 LISTEN 0 128 127.0.0.1:50000 *:* [root@C ~]# telnet 127.0.0.1 5000 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused [root@zabbix ~]# telnet 127.0.0.1 50000 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 nginx_test.localdomain ESMTP Postfix mail from:youmen@163.com 250 2.1.0 Ok
下載地址
http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
# 記錄sshd.pid路徑 find / -name sshd.pid # 查看openssh現有版本 ssh -V # 使用rpm刪除現有的openssh rpm -e --nodeps $(rpm -qa | grep openssh) # 刪除舊的配置文件 rm -rf /etc/ssh/* # 安裝openssl-devel yum -y install openssl-devel # 下載tar.gz包,配置編譯,安裝 wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz # 編譯並安裝 tar xvf openssh-8.0p1.tar.gz cd openssh-8.0p1 ./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-ssl-dir=/etc/ssl --with-md5-passwords --mandir=/usr/share/man/ make && make install # 設置ssh服務開機自啓動 # 複製啓動文件至/etc/init.d/ cp -a contrib/redhat/sshd.init /etc/init.d/sshd # 編輯/etc/init.d/sshd文件, 將PID_FILE改成以前記下的sshd.pid路徑 sed -i "s/PID_FILE=\/var\/run\/sshd.pid/PID_FILE=\/run\/sshd.pid/" /etc/init.d/sshd # 設置開機啓動sshd chkconfig sshd on chkconfig --list sshd # 編輯/etc/ssh/sshd_config, 設置一些經常使用參數 sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config sed -i "s/#PubkeyAuthentication yes/PubkeyAuthentication yes/" /etc/ssh/sshd_config sed -i "s/#PasswordAuthentication yes/PasswordAuthentication yes/" /etc/ssh/sshd_config sed -i "s/#AllowTcpForwarding yes/AllowTcpForwarding yes/" /etc/ssh/sshd_config sed -i "s/#X11Forwarding no/X11Forwarding yes/" /etc/ssh/sshd_config sed -i "s/#PidFile \/var\/run\/sshd.pid/PidFile \/run\/sshd.pid/" /etc/ssh/sshd_config # 加入系統服務 cat > /usr/lib/systemd/system/sshd.service << EOF [Unit] Description=OpenSSH server daemon Documentation=man:sshd(8) man:sshd_config(5) #After=network.target sshd-keygen.service #Wants=sshd-keygen.service After=network.target [Service] ExecStart=/usr/sbin/sshd [Install] WantedBy=multi-user.target EOF # 啓用sshd服務 systemctl enable sshd # 重啓服務 systemctl restart sshd # 查看服務狀態 systemctl status sshd # 驗證 ssh -V OpenSSH_8.0p1, OpenSSL 1.0.2k-fips 26 Jan 2017
到/etc/motd裏面編寫內容,看我的愛好
[root@nginx_test ~]# cat /etc/motd /\/\ (_人|人_) /‥\ ミ(_Y_)ミ > < (/ \) _( )_ (_>―<_) # 關閉當前會話再登陸 /\/\ (_人|人_) /‥\ ミ(_Y_)ミ > < (/ \) _( )_ (_>―<_) [root@nginx_test ~]#
┴┬┴┬/ ̄\_/ ̄\ ┬┴┬┴▏ ▏▔▔▔▔\ ┴┬┴/\ / ﹨ ┬┴∕ / ) ┴┬▏ ● ▏ ┬┴▏ ▔█ ┴◢██◣ \___/ ┬█████◣ / ┴█████████████◣ ◢██████████████▆▄ █◤◢██◣◥█████████◤\ ◥◢████ ████████◤ \ ┴█████ ██████◤ ﹨ ┬│ │█████◤ ▏ ┴│ │ ▏ ┬ ∕ ∕ /▔▔▔\ ∕ ┴/___/﹨ ∕ ﹨ /\ ┬┴┬┴┬┴\ \ ﹨/ ﹨ ┴┬┴┬┴┬┴ \___\ ﹨/▔\﹨ ▔\ ▲△▲▲╓╥╥╥╥╥╥╥╥\ ∕ /▔﹨/▔﹨ **╠╬╬╬╬╬╬╬╬*﹨ / //