[Linux]Xshell連接Centos7能Ping通但無法連接問題[ssh(d)+firewalld/iptables+chkconfig]


一 方案與思路

  • 0 xshell客戶端監測是否能夠ping通目標服務器。
    • 前提:知曉目標服務器IP地址
      • Linux: ifconfig -a
      • Windows: ipconfig -a
  • 1 利用firewall工具,檢查是否已開啟ssh的22端口。若無,則:開啟22端口
  • 2 利用sshd工具,檢查是否已開啟sshd服務。若無,則:開啟sshd服務
    • 開(重)啟ssh服務: system (re)start sshd
  • 3 利用systemctl工具,檢查是否已開啟sshd、firewalld的開機自啟服務。若無,則:開啟sshd、firewalld服務的開機自啟
    • systemctl enable sshd
    • systemctl list-unit-files | grep sshd
    • systemctl enable firewalld[.service]
    • systemctl list-unit-files | grep firewall

二 相關知識及操作命令

關鍵工具
ssh:客戶端,主要進行服務器端的連接
sshd:服務端,作用於服務器端(開閉ssh服務等操作)
ssh————————————>sshd
client      serve
firewalld(防火牆)
firwall-cmd(Linux提供的操作firewall的一個工具)
systemctl(服務控制命令)

1 sshd

  • 查看服務狀態

inactive(不可用),active(可用,活動狀態)

systemctl status sshd
  • 列出已開啟服務當前狀態
systemctl list-units | grep <目標服務,例如:ssh>
或
netstat -antulp | grep ssh
  • 開啟ssh服務
systemctl start sshd
  • 設定服務開機啟動
systemctl enable sshd
  • 查看sshd開機自啟服務是否已開啟
systemctl list-unit-files | grep sshd
  • 關閉ssh服務
systemctl stop sshd
  • 設定服務開機不啟動
systemctl disable sshd
  • 重啟ssh服務
systemctl restart sshd
  • 重新加載服務配置
systemctl reload sshd

2 防火牆(firewalld/firewall-cmd)

2.1 查看

  • 查看firewall服務狀態
    (centos7)
[centos 7]
systemctl status firewalld
[centos 6/7]
service firewalld status
  • 查看防火牆狀態
firewall-cmd --state 
  • 查看防火牆規則
firewall-cmd --list-all
  • 查詢端口是否開放
firewall-cmd --query-port=8080/tcp

2.2 操縱

1.2.1 firewall端口
  • 開放端口

例如,80端口
--permanent:表示設置為持久;
--add-port:標識添加的端口;

firewall-cmd --permanent --add-port=80/tcp

--permanent:表示設置為持久

--add-port:標識添加的端口

  • 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
1.2.2 firewall服務
  • 開啟
    (centos7)
service firewalld start
  • 重啟
    (centos7)
service firewalld restart
# 或者↓ 
firewall-cmd --reload 【重啟防火牆(修改配置后,要重啟防火牆)】
  • 啟用/禁用 開機自啟
systemctl enable/disable firewalld.service
  • 關閉
service firewalld stop

2.3 補充: CentOS6的防火牆iptables操作

# 安裝防火牆(iptables)
yum install iptables //CentOS
apt-get install iptables //Debian/Ubuntu

# 查看防火牆狀態
service iptables status
 
# 停止防火牆
service iptables stop
 
# 啟動防火牆
service iptables start
 
# 重啟防火牆
service iptables restart
 
# 永久關閉防火牆 (停用開機自啟)
chkconfig iptables off
 
# 永久關閉后重啟 (啟用 開機自啟)
chkconfig iptables on

2.4 防火牆進階篇

  • iptables的結構

參見
CentOS iptables防火牆的理解和使用 - 博客園
iptables工具__過濾包—命令... - CSDN

【四張表】:Raw追蹤表——mangle修改表——nat地址轉換——filter過濾表(默認表,常用)(四張表按優先級從高到低)  使用參數-t 表選擇表

【五條鏈】:prerouting、input(常用)、forward、output、postrouting

在鏈前使用參數:
-P/--policy:新建鏈。定義過濾政策。 也就是未符合過濾條件之封包,預設的處理方式。
-L/--list:列出規則 
-A/--append:追加規則 
-D/--delete:刪除規則 
-I/--insert:插入規則。插入一條規則,原本該位置(這里是位置1)上的規則將會往后移動一個順位。
-R/--replace:替換規則 (取代現行規則,規則被取代后並不會改變順序)
-N/--new-chain: 新增鏈。定義新的規則鏈

-F/--flush:刪除規則。刪除某規則鏈(這里是INPUT規則鏈)中的所有規則(Eg:  iptables -F INPUT)
-Z/--zero:清零 計數。將封包計數器歸零。封包計數器是用來計算同一封包出現次數,是過濾阻斷式攻擊不可或缺的工具。
-X/--delete-chain:刪除鏈

【過濾規則】:源IP -s、源PORT --sport / 目標IP -d、目標PORT --dport / 協議(tcp、udp、icmp)-p、狀態--state / 數據流入接口,進網卡 -i、數據流出接口,出網卡-o

【執行動作】:-j :ACCEPT接受報、DROP丟棄報、REJECT丟棄報並通知對方、REDIRECT重定向包、MASQUERADE (改寫源IP為防火牆ip)等

ACCEPT 將封包放行,進行完此處理動作后,將不再比對其它規則,直接跳往下一個規則鏈(natostrouting)。

REJECT 攔阻該封包,並傳送封包通知對方,可以傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉聯機),進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序。 例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

DROP 丟棄封包不予處理,進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序。

REDIRECT 將封包重新導向到另一個端口(PNAT),進行完此處理動作后,將會繼續比對其它規則。 這個功能可以用來實作通透式porxy 或用來保護 web 服務器。 例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

MASQUERADE 改寫封包來源 IP 為防火牆 NIC IP,可以指定 port 對應的范圍,進行完此處理動作后,直接跳往下一個規則(mangleostrouting)。這個功能與 SNAT 略有不同,當進行 IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網卡直接讀,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP 服務器指派的,這個時候 MASQUERADE 特別有用。例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

LOG 將封包相關訊息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 組態檔,進行完此處理動作后,將會繼續比對其規則。例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

SNAT 改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作后,將直接跳往下一個規則(mangleostrouting)。例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作后,將會直接跳往下一個規煉(filter:input 或 filter:forward)。例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

MIRROR 鏡射封包,也就是將來源 IP 與目的地 IP 對調后,將封包送回,進行完此處理動作后,將會中斷過濾程序。

QUEUE 中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發的處理程序,可以進行其它應用,例如:計算聯機費......等。

RETURN 結束在目前規則煉中的過濾程序,返回主規則煉繼續過濾,如果把自訂規則煉看成是一個子程序,那么這個動作,就相當提早結束子程序並返回到主程序中。

MARK 將封包標上某個代號,以便提供作為后續過濾的條件判斷依據,進行完此處理動作后,將會繼續比對其它規則。例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

【加載其他過濾模塊】 -m (state 狀態(NEW、ESTABLISHED、RELATED、INVALID)、multiport 多端口、limit 包流量、mac 網卡地址)

參數 -m multiport --source-port
    例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
    說明 用來比對不連續的多個來源埠號,一次最多可以比對 15 個埠,可以使用 ! 運算子進行反向比對。

參數 -m multiport --destination-port
    例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
    說明 用來比對不連續的多個目的地埠號,設定方式同上。

參數 -m multiport --port
    例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
    說明 這個參數比較特殊,用來比對來源埠號和目的埠號相同的封包,設定方式同上。
    注意:在本范例中,如果來源端口號為 80目的地埠號為 110,這種封包並不算符合條件。

參數 --icmp-type
    例如: iptables -A INPUT -p icmp --icmp-type 8
    說明 用來比對 ICMP 的類型編號,可以使用代碼或數字編號來進行比對。
    請打 iptables -p icmp --help 來查看有哪些代碼可用。

參數 -m limit --limit
    例如: iptables -A INPUT -m limit --limit 3/hour
    說明 用來比對某段時間內封包的平均流量,上面的例子是用來比對:每小時平均流量是否超過一次 3 個封包。 除了每小時平均次外,也可以每秒鍾、每分鍾或每天平均一次,
    默認值為每小時平均一次,參數如后: /second、 /minute、/day。 除了進行封數量的比對外,設定這個參數也會在條件達成時,暫停封包的比對動作,以避免因駭客使用洪水攻擊法,導致服務被阻斷。

參數 --limit-burst
    范例 iptables -A INPUT -m limit --limit-burst 5
    說明 用來比對瞬間大量封包的數量,上面的例子是用來比對一次同時涌入的封包是否超過 5 個(這是默認值),超過此上限的封將被直接丟棄。使用效果同上。

參數 -m mac --mac-source
    范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
    說明 用來比對封包來源網絡接口的硬件地址,這個參數不能用在 OUTPUT 和 Postrouting規則煉上,這是因為封包要送出到網后,才能由網卡驅動程序透過 ARP 通訊協議查出目的地的 MAC 地址,所以 iptables 在進行封包比對時,並不知道封包會送到個網絡接口去。

參數 --mark
    范例 iptables -t mangle -A INPUT -m mark --mark 1
    說明 用來比對封包是否被表示某個號碼,當封包被比對成功時,我們可以透過 MARK 處理動作,將該封包標示一個號碼,號碼最不可以超過 4294967296。

參數 -m owner --uid-owner
    范例 iptables -A OUTPUT -m owner --uid-owner 500
    說明 用來比對來自本機的封包,是否為某特定使用者所產生的,這樣可以避免服務器使用 root 或其它身分將敏感數據傳送出,可以降低系統被駭的損失。可惜這個功能無法比對出來自其它主機的封包。

參數 -m owner --gid-owner
    范例 iptables -A OUTPUT -m owner --gid-owner 0
    說明 用來比對來自本機的封包,是否為某特定使用者群組所產生的,使用時機同上。

參數 -m owner --pid-owner
    范例 iptables -A OUTPUT -m owner --pid-owner 78
    說明 用來比對來自本機的封包,是否為某特定行程所產生的,使用時機同上。

參數 -m owner --sid-owner
    范例 iptables -A OUTPUT -m owner --sid-owner 100
    說明 用來比對來自本機的封包,是否為某特定聯機(Session ID)的響應封包,使用時機同上。

參數 -m state --state
    范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
    說明 用來比對聯機狀態,聯機狀態共有四種:INVALID、ESTABLISHED、NEW 和 RELATED。
        INVALID 表示該封包的聯機編號(Session ID)無法辨識或編號不正確。
        ESTABLISHED 表示該封包屬於某個已經建立的聯機。
        NEW 表示該封包想要起始一個聯機(重設聯機或將聯機重導向)。
        RELATED 表示該封包是屬於某個已經建立的聯機,所建立的新聯機。例如:FTP-DATA 聯機必定是源自某個 FTP 聯機。
  • 查看 已添加的iptables規則
iptables -L -n

v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數

x:在 v 的基礎上,禁止自動單位換算(K、M)

n:只顯示IP地址和端口號,不將ip解析為域名

  • 屏蔽 MAC
    按來源MAC地址匹配,拒絕轉發來自該MAC地址的數據包.
iptables -t filter -A FORWARD -m --mac-source 00:02:b2:03:a5:f6 -j DROP
  • 屏蔽 IP(網段)
iptables -I INPUT -s 124.115.0.199 -j DROP //屏蔽124.115.0.199這個IP

iptables -I INPUT -s 124.115.0.0/16 -j DROP //屏蔽124.115.*.*這一網段段(124.115開頭)的所有IP
iptables -I INPUT -s 61.37.80.0/24 -j DROP //屏蔽61.37.80.*這一網段段(61.37.80開頭)的所有IP
iptables -I INPUT -s 124.0.0.0/8 -j DROP //屏蔽124.*.*.*這一網段段(124開頭)的所有IP
  • 將1分鍾內連續超過3次的SSH連接請求拒絕掉
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT --rcheck --seconds 60 --hitcount 3 -j DROP
  • 保存 規則
service iptables save  //也可指定存儲文件: iptables-save > /etc/sysconfig/iptables
  • 開啟/取消屏蔽 IP(網段)
    (只要把參數-I改為-D就好了)
iptables -D INPUT -s 124.0.0.0/8 -j DROP //取消屏蔽 124.*.*.*這一網段段(124開頭)的所有IP 【取消 指定對滿足條件包的執行DROP的規則】

iptables -D INPUT -s 124.0.0.0/8  -j REJECT //取消屏蔽 124.*.*.*這一網段段(124開頭)的所有IP 【取消 指定對滿足條件包的執行REJECT的規則】
  • 清除 已有iptables規則
iptables -F //全清掉了
iptables -X
iptables -Z

三 開機自啟

3.1 Linux的運行級別

Linux的運行級別有6個,而這6個運行級都有各自的功能,某個程序在一個運行級別里面運行,在另一個級別就不運行。

  • 0 - halt (Do NOT set initdefault to this) 系統停止 / 關機模式
  • 1 - Single user mode 單用戶運行模式
  • 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 無網絡多用戶模式
  • 3 - Full multiuser mode 有網絡多用戶(完整多用戶模式)
  • 4 - unused 未使用
  • 5 - X11 有網絡支持,且有X-Window支持的多用戶模式 (圖形模式)
  • 6 - reboot (Do NOT set initdefault to this) 重新引導系統 (即 重啟)

一般情況下,我們處於的運行級在3或者5。

這6種模式還有許多功能,比如說:
如果忘記了root密碼就可以進入單用戶模式,
在啟動后的提示符界面下輸入init = /bin/sh rw就進入了模式1,
把root文件掛為讀寫就可以跳過系統認證,
直接用passwd程序來更改root用戶口令了,
然后,再啟動到正常的運行級去即可。

查看6大運行級別信息 、 修改運行級別(啟動模式)

CentOS6/RHEL6 及之前的版本,查看、修改啟動模式,都是在 /etc/inittab 文件里直接修改,修改id后面的數字即可。

shell# cat /etc/inittab

# inittab is only used by upstart for the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by /etc/init/rcS.conf

#

# Individual runlevels are started by /etc/init/rc.conf

#

# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf

#

# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

# with configuration in /etc/sysconfig/init.

#

# For information on how to write upstart event handlers, or how

# upstart works, see init(5), init(8), and initctl(8).

#

# Default runlevel. The runlevels used are:

# 0 - halt (Do NOT set initdefault to this)

# 1 - Single user mode

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)

# 3 - Full multiuser mode

# 4 - unused

# 5 - X11

# 6 - reboot (Do NOT set initdefault to this)

#

id:3:initdefault:

CentOS7/RHEL7 之后版本,查看、修改啟動模式,也在 /etc/inittab 里有介紹

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses 'targets' instead of runlevels. By default, there are two main targets:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

查看當前的啟動模式/運行級別

[CentOS6/RHEL6 及之前的版本]
查看模式,在 /etc/inittab 文件里直接查看末行的id后面的數字即可。

[centos7]

  • runlevel0.target -> poweroff.target
  • runlevel1.target -> rescue.target
  • runlevel2.target -> multi-user.target
  • runlevel3.target -> multi-user.target

multi-user.target: analogous to runlevel 3

  • runlevel4.target -> multi-user.target

  • runlevel5.target -> graphical.target

graphical.target: analogous to runlevel 5

  • runlevel6.target -> reboot.targe
systemctl get-default

查看指定運行模式下可使用的功能服務

怎么查看在當前模式下可以使用什么功能呢?查看/etc/rc.d/init.d這個文件夾下

ll /etc/rc.d/init.d

怎么查看在不同運行模式下,可以使用什么功能呢?
查看/etc/rc.d/init.d這個文件夾下,就是可以運行的腳本.如下圖:

ll /etc/rc.d

或者:

ll /etc/rc[0-6].d

通過下圖,可以發現: 在/etc下也有同樣的7個文件夾即 /etc/rc[0-6].d ,通過查看發現/etc/rc[0-6].d其實就是/etc/rc.d/rc[0-6].d軟連接,只是為了保持和Unix兼容

ll /etc/rcN.d
   或者  ll /etc/rc.d/rc[0-6].d

↓↓↓
這些文件是按照如下格式命名的 [KS][1-100]servicename ,它表示當系統的運行級別為5時,它會關掉以K開頭的所有服務,並啟動所有以S開頭的服務。
其實,這些服務都是/etc/init.d/中某個服務的軟連接,所以真正啟動的服務是/etc/init.d目錄中的某一個服務,而以K/S開頭建立軟連接是為了表明在對應級別下應該采取的行為,K/S后面緊跟的數字表示開/關服務的優先級。

因此,如果我們自己寫了一個腳本代碼 如cleanupd,需要在開機級別為3的時候自啟動的話,那么我們只需要把可執行的cleanupd腳本文件放到 /etc/init.d目錄下,並在對應的運行級別目錄下 如/etc/rc.d/rc3.d/ 建立一個以S開頭后加數字的軟連接到/etc/init.d/cleanupd即可,如

ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup

設置、切換啟動模式/運行級別

那么如何切換啟動模式呢?
[通用方法]
使用"init + 運行級別"回車即可直接進入,比如:輸入init 0電腦就會關機,輸入init 6電腦就會重啟

[centos7]

systemctl set-default <TARGET.target>

修改完成,重啟服務器,即生效。

3.2 查看 開機自啟

  • 查看 開機自啟的所有服務
[centos6/7/8/...]
chkconfig --list

[centos7/8/...]
systemctl list-unit-files
  或者 systemctl list-unit-files | grep -i xxx
  • 查看是否有定時執行任務

參考文獻

[查看 定時服務是否已開啟]
systemctl status crond

[查看 定時 執行任務列表]
crontab -e 

3.3 設置 開機自啟

方式1: chkconfig 【推薦】

Linux chkconfig命令用於檢查,設置系統的各種服務。用來設置服務的運行級信息,該設置並非立即啟動,或者禁用制定服務。

這是Red Hat公司遵循GPL規則所開發的程序,它可查詢操作系統在每一個執行等級中會執行哪些系統服務,其中包括各類常駐服務。

這個命令是centos7之前版本使用的,但是目前是過渡期,在centos7上依然可以使用,這個命令只列出SysV服務機制的服務,並不包含centos7上systemd服務

注: Linux默認允許任何人按下Ctrl+Alt+Del來重啟系統。但是在生產環境中,應該停用按下Ctrl-Alt-Del 重啟系統的功能。

  • 停用/啟用 指定服務的開機自啟
chkconfig network off/on  | 關閉network
chkconfig iptables off/on | 關閉防火牆
linux有7個運行級別: 0-6
0級別表示:關機狀態
1級別表示:單用戶模式
2級別表示:沒有nfs服務
3級別表示:多用戶模式,不帶圖形界面
4級別表示:保留的級別
5級別表示:多用戶模式,帶圖形界面
6級別表示:重啟
  • 自定義設置 開機自啟服務

/etc/inittab在centos7之前版本中,可修改此配置文件來定義系統運行級別,只不過在centos7系統中,已經不使用了。

#chkconfig --level 3 network off //關閉3級別的network服務
#chkconfig --level 35 network off //關閉3級別和5級別的network服務
#chkconfig --level 345 network on //開啟3、4、5級別的network服務

在/etc/init.d/下創建一個自己的腳本,然后使用命令:

chkconfig --add +腳本名稱 //就可以把自己的腳本添加到開機服務列表中

自己添加的腳本中必須要有:chkconfig: 2345 10 90 description: Activates/Deactivates all network interfaces configured to \ start at boot time.

這兩部分才能被識別,其中必須是shell腳本,2345表示啟動級別是2、3、4、5級別,10表示啟動順序是第10位,90是第90位關閉

#chkconfig --del +腳本名稱 //刪除開機自啟動服務

方式2: 修改 /etc/rc.d/rc.local 文件

  • step1 賦予腳本可執行權限(/opt/script/autostart.sh是你的腳本路徑)
chmod +x /opt/script/autostart.sh
  • step2 打開/etc/rc.d/rc/local文件,配置、指定具體功能模塊的開機自啟的shell啟動操作
    例如: 例如將 apache、MySQL、samba、autostart.sh(自定義的用戶啟動腳本)等這些服務的開機自啟動問題一起搞定:
vi/etc/rc.d/rc.local
  /usr/sbin/apachectl start
  /etc/rc.d/init.d/mysqld start
  /etc/rc.d/init.d/smb start
  /opt/script/autostart.sh
  • 在centos7中,/etc/rc.d/rc.local的權限被降低了,所以需要執行如下命令賦予其可執行權限
chmod +x /etc/rc.d/rc.local

方式3: 修改 /etc/rc.d/init.d 文件 + chkconfig

  • step1 將腳本移動到/etc/rc.d/init.d目錄下
mv  /opt/script/autostart.sh /etc/rc.d/init.d
  • step2 增加腳本的可執行權限
chmod +x  /etc/rc.d/init.d/autostart.sh
  • step3 添加腳本到開機自動啟動項目中
cd /etc/rc.d/init.d
chkconfig --add autostart.shchkconfig autostart.sh on

方式4: ln -s 建立軟連接

如果我們自己寫了一個腳本代碼 如 cleanupd,需要在開機級別為3的時候自啟動的話.
那么,我們只需要把可執行的cleanupd腳本文件放到 /etc/init.d目錄下,並在對應的運行級別目錄下 如/etc/rc.d/rc3.d/ 建立一個以S開頭后加數字的軟連接到/etc/init.d/cleanupd即可,如:

ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup

X 參考文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM