[Linux] 如何關閉 ping response

前言

有的時候你得知某個網域(以 uivacation.com 為例),然後你想使用 ping 的方式,然看看該網域所對應的 IP 是否有回應,這時你會想執行以下指令:

$ ping uivacation.com

// 會取得以下結果,表示該主機(139.59.241.74)有回應 ping 的訊息,並可得知 IP 以及封包來回傳送的時間:
PING uivacation.com (139.59.241.74): 56 data bytes
64 bytes from 139.59.241.74: icmp_seq=0 ttl=51 time=85.679 ms
64 bytes from 139.59.241.74: icmp_seq=1 ttl=51 time=104.005 ms
…

但身為系統管理者,有的時候其實我們並不想讓別人太輕易得知以上的結果,所以會想要將 ping 的 response 給關閉,那該如何做呢?

什麼是 ping?

ping 是一個指令,用來傳送一個 ICMP 封包至某主機,然後確認該主機的運作在網路上是否有正常啟動。

以 CentOS 7 為例,關閉 ping response

執行以下指令,即可完成:

// 將 icmp_echo_ignore_all 檔案,僅輸入 1 這個值。
$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

若要回復讓 server 可以對 ping 有所回應的話,就執行以下指令即可:

// 將 icmp_echo_ignore_all 檔案,僅輸入 0 這個值。
$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

若想讓以上的設定永久生效的話,開啟 /etc/sysctl.conf 檔案,並於檔案的最下方,新增以下這行並重新開機即可:

net.ipv4.conf.icmp_echo_ignore_all = 1

這時我再執行以下的 ping 指令,server 就不會再對 ping 指令有 response 了:

$ ping uivacation.com

// server 就不會對 ping 指令有 response 了。
PING uivacation.com (139.59.241.74): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
…

其它參考資料:

Disable ping response

UNIX ping Command Examples

[Linux] grep 指令使用方法

一、搜尋某檔案,找出”要搜尋的字串”的那行顯示出來:

$ grep "要搜尋的字串" 檔名

例如:

$ grep "name" composer.json composer.lock

或也可以使用萬用字元*,來搜尋多個檔案:

$ grep "name" *.md

 

二、使用 -r 來遞迴搜尋某資料夾裡的所有檔案,包含子資料夾,例如以下是搜尋當前目錄及其底下子資料夾裡的所有檔案:

$ grep -r "要搜尋的字串" .

 

三、find 指令找到當前目錄底下(包含子資料夾),檔名以 jsx 結尾的檔案,列出來:

$ find . -name "*jsx"

 

四、找出所有 .jsx 結尾的檔名,再 pipe 給後面的指令,透過 xargs 指令(eXtended ARGuments)搭配 grep 指令,找出那些檔名中,有出現 carlos 的各行:

$ find . -name "*.jsx" | xargs grep "carlos"
// 下方這行,與上方這行的結果會是一樣的,只是方式不同:
$ grep -r --include="*.jsx" "carlos" .

 

五、將所搜尋的字串,標出顏色:

$ grep -r --color uivacation .
// 如果是使用 git grep,可以排除被git忽略的檔案,如下:
$ git grep uivacation

 

六、也將搜尋到該行的行號( -n )給顯示出來:

$ grep -n -r --color uivacation resources/

 

七、將所搜尋到的那行,連同下一行也顯示出來(-A 1),如果要下兩行(-A 2),A代表的是 After;相反的,B是Before;C代表的是 Context,表示前後都會顯示:

$ grep -A 1 -n -r --color uivacation resources/
// -B 表示 Before,連同前一行也顯示出來
$ grep -B 1 -n -r --color uivacation resources/
// -C 表示 Context,連同前一行、後一行也顯示出來
$ grep -C 1 -n -r --color uivacation resources/

 

八、使用正規式,來找出某檔案的某字串:

// 下方的 "h." 是表示搜尋出 h 開頭,以及下一個字元是任意字元的字串:
$ grep --color -n "h." composer.json
// 使用 \ 來跳脫字元,以下例來說,就是一定要搜尋到 h. 才算符合:
$ grep --color -n "h\." composer.json
// 以下代表要搜尋到至少一個 # 字號,才算符合,因為後面的 #* 表示該 # 至少出現零次以上:
$ grep --color "##*" readme.md
// 以下代表在括號之間,可出現任意字元零次以上:
$ grep --color "(.*)" readme.md

 

九、使用進階的正規式:

// 在 readme.md 檔案中,搜尋出有 https 的所有行,並標示出顏色:
$ grep --color "https" readme.md
// 在 readme.md 檔案中,搜尋出有 http 開頭,後面搭配一個任意字元的所有行,並標示出顏色:
$ grep --color "http." readme.md
// 在 readme.md 檔案中,搜尋出有 http 開頭,後面的 s 可出現零次或一次,並標示出顏色:
$ grep --color "https\?" readme.md
// 在 readme.md 檔案中,搜尋出有 http 開頭,後面的 s 至少要出現一次以上,並標示出顏色:
$ grep --color "https\+" readme.md
// 如果不想加 \ 的話,那麼可改用 -E,例如上面這行,可改成以下這行,會是一樣的結果:
$ grep --color -E "https+" readme.md
// 下面這行,表示要搜尋的真的是 https+ 這樣的字串(也就是將 -E 移除):
$ grep --color "https+" readme.md

 

十、使用 | 這個代表或的運算

// 下面這個例子,會將 grey 及 gray 都標示出顏色:
$ echo "is it grey or gray?" | grep --color "grey\|gray"
// 或用以下語法也是可以的:
$ echo "is it grey or gray?" | grep --color -E "grey|gray"
// 以下例子為在 examples 資料夾底下(含子資料夾),搜尋出有 grey 或 gray 的所有行:
$ grep --color -rE "grey|gray" examples/

 

十一、使用 ^ 及 $ ,來表示那行的開頭跟結尾

// 表示在 app-spec.md 檔案中,要搜尋出以 # 字號開頭的行:
$ grep --color "^#" app-spec.md
// 表示在 app-spec.md 檔案中,要搜尋出以 , 字元結尾的行:
$ grep --color ",$" app-spec.md
// 表示在 examples 資料夾中(含子資料夾)的所有檔案,要搜尋出以 import 開頭,中間含有 from 的所有行:
$ grep --color -r "^import .* from" examples/

 

十二、使用 bracket 的表達式:[a-zA-Z]、[0-9]

// 以下是表示 a 和 b 會被搜尋出來並標示出顏色:
$ echo abc123 | grep --color "[ab]"
// 以下是表示 a 到 z 會被搜尋出來並標示出顏色:
$ echo abc123 | grep --color "[a-z]"
// 以下是表示 1 到 9 會被搜尋出來並標示出顏色:
$ echo abc123 | grep --color "[1-9]"
// 以下是表示 「de開頭,然後中間 a 到 z 的字元可任意出現多次,然後以 er 結尾」 會被搜尋出來並標示出顏色:
$ grep --color "de[a-z]*er" readme.md
// 以上的 [a-z] 可用以下方式來替代:
$ grep --color "de[[:alpha:]]*er" readme.md

$ find . -name "*.js" | grep --color "[sS]pec"

 

十三、group 例子:

// 找出 grey' 和 gray' 的所有行:
$ grep -rE --color "(grey|gray)\'" .
// 找出 grey' 和 gray'、grey"、gray" 的所有行:
$ grep -rE --color "(grey|gray)(\'|\")" .

 

十四、使用 find 找出所有的檔案列表,再透過 grep 將 node_modules 資料夾裡的排除

$ find examples/angularjs -name "*js" | grep -v "node_modules"

 

[Linux] vagrant 執行 vagrant box update 失敗

執行以下指令若失敗:

$ vagrant box update
==> default: Checking for updates to ‘laravel/homestead’
    default: Latest installed version: 0.5.0
    default: Version constraints:
    default: Provider: virtualbox
There was an error while downloading the metadata for this box.
The error message is shown below:

The requested URL returned error: 429 Too Many Requests

 

執行以下指令,就可以再重新執行 vagrant box update

$ rm -rf ~/.vagrant.d/tmp/

[Linux] 列出網卡

在 CentOS 7 中,使用以下指令,快速地列出網卡:

$ nmcli d
DEVICE  TYPE      STATE      CONNECTION  
eth0    ethernet  connected  System eth0 
lo      loopback  unmanaged  —

 

 

[Linux] 系統校時

CentOS 7 中的校時方式:

安裝 ntp 套件:

$ sudo yum -y install ntp

與某個時間伺服器作校正:

$ ntpdate pool.ntp.org

剛才做的 ntpdate 只是一次性的對時,要開啟 ntpd 這個 daemon 才能持續的對時,執行以下:

$ systemctl start ntpd

執行以下指令,看 ntpd 這個 daemon 的狀態是否有在執行:

$ systemctl status ntpd

設定讓系統在開機時自動啟用 ntpd daemon

$ systemctl enable ntpd
$ systemctl is-enabled ntpd

 

[Linux] 安裝 Let’s Encrypt 所發行的 SSL 憑證,將網址加密變成 https

Let’s Encrypt 官網的兩個較重要連結:

Getting Started

How Let’s Encrypt Works

 

一、進入到 Certbot 網站 按照指引安裝憑證並設定(以選擇 Apache、CentOS/RHEL 7 為例):

 

一、安裝 epel-release、python-certbot-apache:

$ sudo yum install epel-release
$ sudo yum install python-certbot-apache

 

二、作業系統還要安裝mod_ssl (若是安裝 Apache 的話),因為 Apache 若要支援 https ,就要需 mod_ssl 模組,同時也安裝openssl

$ yum install mod_ssl openssl

然後可再自己的本機端輸入以下指令,看 443 port 是否有通:(出現以下表示有通)

$ telnet 111.111.111.111(server的ip) 443

Trying 128.199.216.14...
Connected to 128.199.216.14.
Escape character is '^]'.

 

三、建立 virtualhost-443.conf

$ touch /etc/httpd/conf.d/virtualhost-443.conf

該檔的內容為(假設網址為 xxx.com):

<VirtualHost *:443>
  ServerName xxx.com
  DocumentRoot /var/www/html/xxx
  SSLEngine on
  SSLCertificateFile    /etc/letsencrypt/live/xxx.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/xxx.com/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/xxx.com/fullchain.pem
  <Directory "/var/www/html/xxx">
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

其中 SSLCertificateFile、SSLCertificateKeyFile、SSLCertificateChainFile 這三個所指定的檔案會在 以下指令之後產生:

$ certbot –apache

 

四、將原來的 80 port 轉到 443 port

產生好憑證之後,因為目前一般會設定 80 和 443 兩個 port ,所以要將80轉到443,
也就是若一般使用者輸入 http://xxx.com 會轉址到 https://xxx.com

$ vi /etc/httpd/conf.d/virtualhost.conf

<VirtualHost *:80>
  ServerName xxx.carlos-studio.com
  DocumentRoot /var/www/html/xxx
  Redirect permanent / https://xxx.com/
  <Directory "/var/www/html/xxx">
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

以上重啟 apache 後即完成。

 

五、憑證的 Automating renewal

因為 Let’s Encrypt 憑證預設只有 3 個月,所以需要設定自動 renew,輸入以下指令測試是否可以正確執行(此指令並不會真的renew,只是測試):

$ certbot renew –dry-run     (註記:dry 前面是兩個橫線)

以下這個指令才會真的renew,若確定執行成功,就可以設定在 cronjob 裡了,每天跑以下指令(官方建議每天跑兩次):

$ certbot renew –quiet         (註記:quiet 前面是兩個橫線,若有問題,可以 –quiet 改成用 –force-renew,force 前面是兩個橫線 )

 

六、如果要刪除某個憑證,不需要再用 https 了

先找到某個domain的相關設定檔及資料夾,例如 “sabinahuang.carlos-studio.com”

$ find /etc/letsencrypt/ -name “*sabinahuang.carlos-studio*”

就會找出以下:

/etc/letsencrypt/renewal/sabinahuang.carlos-studio.com.conf
/etc/letsencrypt/live/sabinahuang.carlos-studio.com
/etc/letsencrypt/archive/sabinahuang.carlos-studio.com

全數刪除即可。

二、進入到 Certbot 網站 按照指引安裝憑證並設定(以選擇 Nginx、CentOS/RHEL 7 為例):

$ sudo yum install epel-release
$ sudo yum install certbot

再執行以下指令,用來取得憑證:會詢問要使用哪一種方式安裝,請選擇第一種使用 webroot 來自動安裝並取得憑證。

$ certbot certonly

安裝好後,就會在網站根目錄中,看到 .well-known 資料夾了,相關憑證就會存於此處。
另外若是example.com和www.example.com都要有https時,在要求輸入domain時,兩個都要輸入,以逗號做分隔。

再建立以下檔案(若不存在該檔,則會直接建立):

$ sudo vi /etc/nginx/default.d/le-well-known.conf

// 內容是以下:
location ~ /.well-known {
  allow all;
}

可再執行以下語法,來檢查 nginx 的相關語法是否有錯誤:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

 

[Linux] 建立 swap 檔案空間的方法

Step1:決定好要增加的 swap 檔案的檔名、位置與大小。例如:位於根目錄下的 /swapfile1 ,大小為 2GB。

Step2:建立一個未來可做為 swap 之用的檔案形式的儲存空間,輸入以下指令:

// if 參數代表的是輸入的檔名,/dev/zero代表的是空的檔案。
// of 參數代表的是輸出的檔名,此處的參數值 /swapfile1 就是想要建立的swap檔名且是建立於根目錄之下,使用者可自行命名。
// bs 參數的意思是 block size 的意思,也就是單位儲存區塊大小的意思,預設為1024 byte,就是 1MB 的大小。
// count 參數就是在設定 swap 檔案要佔用的大小, 2048000 即表示 2G。

$ dd if=/dev/zero of=/swapfile1 bs=1024 count=2048000

Step3:將已建好的檔案形式的儲存空間設定為swap的檔案形態,輸入以下指令:

// 將已建立好的檔案形式儲存空間/swapfile1設定為swap 的檔案系統形態。
$ mkswap /swapfile1

Step4:接著立即啟動檔案形式的swap檔案空間。

// 其中 /swapfile1就是swap檔案空間。
$ swapon /swapfile1

Step5:修改 /etc/fstab 的檔案內容,以便於每次啟動Linux系統時,皆自動啟動所建立的檔案形式的swap檔案空間。

$ vi /etc/fstab

// 並在該檔案中的最後一行,新增如下的一行資料
/swapfile1 swap swap defaults 0 0

Step6:接著下達指令:free -m,就可查看是否已啟動檔案形式的swap空間了。

若想要移除所建立的檔案形式的swap空間,則分別執行下列的指令:

sudo swapoff /swapfile1
sudo rm /swapfile1
sudo vi /etc/fstab 並將/swapfile1 swap swap defaults 0 0 那一行資料料刪除