ฉันมีเซิร์ฟเวอร์ LEMP ที่บ้านที่ใช้ Ubuntu 22.02 และอินสแตนซ์คลาวด์ Oracle ที่ใช้ Ubuntu 20.04 อินสแตนซ์ระบบคลาวด์ของ Oracle ทำหน้าที่เป็นเซิร์ฟเวอร์ Wireguard เซิร์ฟเวอร์ LEMP ที่บ้านทำหน้าที่เป็นไคลเอนต์ Wireguard และกำลังถูกเจาะผ่านเซิร์ฟเวอร์ Oracle เพื่อรับที่อยู่ IP ที่แตกต่างจากที่อยู่ IP ที่บ้านของฉัน ฉันได้ตั้งค่าคอนฟิกไคลเอนต์/เซิร์ฟเวอร์ Wireguard ตามนี้ บทช่วยสอน Linuxbabe.com นี้. ไคลเอ็นต์ wireguard เปิดใช้งานแล้วและสามารถ ping เซิร์ฟเวอร์ Oracle ได้สำเร็จ เซิร์ฟเวอร์ LEMP (ไคลเอนต์ Wireguard) ยังแก้ไขที่อยู่ IP สาธารณะของ Oracle Servers ได้สำเร็จ ฉันได้ติดตั้ง openresolv บนไคลเอนต์ VPN และ bind9 บนเซิร์ฟเวอร์ VPN เพื่อใช้ DNS ของ Oracle Instance จากเซิร์ฟเวอร์ LEMP (ไคลเอนต์ Wireguard) ผู้รับจดทะเบียนโดเมนของฉันกำลังชี้ DNS ไปยัง IP เดียวกันกับเซิร์ฟเวอร์ Oracle ของฉันตอนนี้ ฉันกำลังพยายามติดตั้งฉันทลักษณ์บนเซิร์ฟเวอร์ LEMP และไม่สามารถรับใบรับรองผ่านปลั๊กอิน certbot nginx ได้ ดูเหมือนว่ามีบางอย่างปิดกั้นพอร์ต 80/443 และพอร์ต 80/443 นั้นไม่ได้เปิดอยู่ เมื่อฉันรัน (บนเซิร์ฟเวอร์ LEMP) คำสั่ง:
sudo certbot -v --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d chat.example.com
ฉันได้รับผลลัพธ์ข้อผิดพลาดต่อไปนี้:
บันทึกบันทึกการดีบักไปที่ /var/log/letsencrypt/letsencrypt.log
ปลั๊กอินที่เลือก: Authenticator nginx, Installer nginx
ขอใบรับรองสำหรับ chat.example.com
ดำเนินการตามความท้าทายต่อไปนี้:
http-01 ท้าทายสำหรับ chat.example.com
กำลังรอการตรวจสอบ...
ความท้าทายสำหรับโดเมน chat.example.com ล้มเหลว
http-01 ท้าทายสำหรับ chat.example.com
Certbot ล้มเหลวในการตรวจสอบสิทธิ์บางโดเมน (authenticator: nginx) ผู้ออกใบรับรองรายงานปัญหาเหล่านี้:
โดเมน: chat.example.com
ประเภท: การเชื่อมต่อ
รายละเอียด: 150.136.56.232: กำลังเรียก http://chat.example.com/.well-known/acme-challenge/GlzBhvxB_hDYefMW48qaHq3I-qc_NArj7VWml54bofM: การเชื่อมต่อถูกปฏิเสธ
คำแนะนำ: ผู้ออกใบรับรองล้มเหลวในการตรวจสอบการเปลี่ยนแปลงการกำหนดค่า nginx ชั่วคราวที่ทำโดย Certbot ตรวจสอบให้แน่ใจว่าโดเมนที่ระบุไว้ชี้ไปที่เซิร์ฟเวอร์ nginx นี้และสามารถเข้าถึงได้จากอินเทอร์เน็ต
ทำความสะอาดความท้าทาย
ความท้าทายบางอย่างล้มเหลว
ขอความช่วยเหลือหรือค้นหาวิธีแก้ปัญหาได้ที่ https://community.letsencrypt.org ดูไฟล์บันทึก /var/log/letsencrypt/letsencrypt.log หรือรัน Certbot ใหม่ด้วย -v สำหรับรายละเอียดเพิ่มเติม
ฉันใช้ UFW เป็นไฟร์วอลล์ และสถานะ UFW ของฉันบนเซิร์ฟเวอร์ LEMP (ไคลเอนต์ VPN) คือ:
สถานะ: ใช้งานอยู่
ถึงการดำเนินการจาก
-- ------ ----
[ 1] 22/tcp อนุญาตใน my.local.lan.ip/24
[ 2] 43211/tcp อนุญาตใน my.local.lan.ip/24
[ 3] 5222,5269/tcp อนุญาตในทุกที่
[ 4] 80,443/tcp อนุญาตในทุกที่
[ 5] 5222,5269/tcp (v6) อนุญาตในทุกที่ (v6)
[ 6] 80,443/tcp (v6) อนุญาตในทุกที่ (v6)
สถานะ UFW ของฉันบน Oracle Cloud Instance คือ:
สถานะ: ใช้งานอยู่
ถึงการดำเนินการจาก
-- ------ ----
[ 1] ทุกที่ที่อนุญาตใน 10.10.10.0/24
[ 2] 22/tcp อนุญาตใน my.home.public.ip
[ 3] 22/tcp อนุญาตใน my.work.public.ip
[ 4] 5222,5269/tcp อนุญาตในทุกที่
[ 5] 51820/udp อนุญาตใน my.home.public.ip
[ 6] 80,443/tcp อนุญาตในทุกที่
[ 7] 5222,5269/tcp (v6) อนุญาตในทุกที่ (v6)
[ 8] 80,443/tcp (v6) อนุญาตในทุกที่ (v6)
พอร์ต 51820/udp เป็นพอร์ต wireguard ของฉันสำหรับทั้ง Oracle Instance และ Lemp Server ฉันได้ส่งต่อที่อยู่ IP สาธารณะของฉันบน Oracle Instance ไปยังไคลเอนต์ VPN เพื่อให้ไคลเอนต์สามารถส่งและรับบนพอร์ตสาธารณะเดียวกันกับที่ Oracle Instance ใช้ ด้านล่างนี้คือไฟล์ /etc/ufw/before.rules ของฉัน การแก้ไขการส่งต่อพอร์ตที่ฉันทำอยู่ภายใต้ความคิดเห็นเรื่อง "Linuxbabe..."
#
#กฎ.ก่อน
#
# กฎที่ควรรันก่อนบรรทัดคำสั่ง ufw เพิ่มกฎ กำหนดเอง
ควรเพิ่ม # กฎ ให้กับหนึ่งในห่วงโซ่เหล่านี้:
# ufw-ก่อนป้อนข้อมูล
# ufw ก่อนส่งออก
# ufw-ก่อนส่งต่อ
#
# อย่าลบบรรทัดที่จำเป็นเหล่านี้ มิฉะนั้นจะมีข้อผิดพลาด
*กรอง
:ufw-ก่อนป้อนข้อมูล - [0:0]
:ufw-ก่อนเอาท์พุท - [0:0]
:ufw-ก่อนส่งต่อ - [0:0]
:ufw-ไม่ใช่ท้องถิ่น - [0:0]
# จบบรรทัดที่ต้องการ
# อนุญาตทั้งหมดในการย้อนกลับ
-A ufw-before-input -i lo -j ยอมรับ
-A ufw-before-output -o lo -j ยอมรับ
# ประมวลผลแพ็กเก็ตที่เราเชื่อมต่ออยู่แล้วอย่างรวดเร็ว
-A ufw-before-input -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้ง -j ยอมรับ
-A ufw-before-output -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้ง -j ยอมรับ
-A ufw-before-forward -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้ง -j ยอมรับ
# วางแพ็กเก็ตที่ไม่ถูกต้อง (บันทึกสิ่งเหล่านี้ในสื่อระดับบันทึกและสูงกว่า)
-A ufw-before-input -m conntrack --ctstate ไม่ถูกต้อง -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate ไม่ถูกต้อง -j DROP
# ตกลงรหัส icmp สำหรับ INPUT
-A ufw-before-input -p icmp --icmp-type ปลายทางไม่สามารถเข้าถึงได้ -j ACCEPT
-A ufw-before-input -p icmp --icmp-type เกินเวลา -j ยอมรับ
-A ufw-before-input -p icmp --icmp-type พารามิเตอร์-ปัญหา -j ยอมรับ
-A ufw-before-input -p icmp --icmp-type echo-request -j ยอมรับ
# ตกลงรหัส icmp สำหรับ FORWARD
-A ufw-before-forward -p icmp --icmp-type ปลายทางไม่สามารถเข้าถึงได้ -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type เกินเวลา -j ยอมรับ
-A ufw-before-forward -p icmp --icmp-type พารามิเตอร์-ปัญหา -j ยอมรับ
-A ufw-before-forward -p icmp --icmp-type echo-request -j ยอมรับ
## บทช่วยสอน Linuxbabe
# อนุญาตการส่งต่อสำหรับเครือข่ายที่เชื่อถือได้
-A ufw-before-forward -s 10.10.10.0/24 -j ยอมรับ
-A ufw-before-forward -d 10.10.10.0/24 -j ยอมรับ
# อนุญาตให้ไคลเอนต์ dhcp ทำงานได้
-A ufw-before-input -p udp --sport 67 --dport 68 -j ยอมรับ
#
# ufw-ไม่ใช่ของท้องถิ่น
#
-A ufw-before-input -j ufw-not-local
# ถ้าในพื้นที่ส่งคืน
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
# ถ้ามัลติคาสต์ ส่งคืน
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
#หากออกอากาศให้ส่งคืน
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
# แพ็คเก็ตที่ไม่ใช่ในเครื่องอื่น ๆ ทั้งหมดจะถูกทิ้ง
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
# อนุญาต MULTICAST mDNS สำหรับการค้นหาบริการ (ต้องแน่ใจว่าบรรทัด MULTICAST ด้านบน
#ไม่มีความคิดเห็น)
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ยอมรับ
# อนุญาต MULTICAST UPnP สำหรับการค้นหาบริการ (ต้องแน่ใจว่าบรรทัด MULTICAST ด้านบน
#ไม่มีความคิดเห็น)
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ยอมรับ
# อย่าลบบรรทัด 'COMMIT' มิฉะนั้นกฎเหล่านี้จะไม่ได้รับการประมวลผล
ให้สัญญา
### Linuxbabe - บทช่วยสอน UFW
## กฎตาราง NAT
*แนท
#แนทพรีรูทติ้ง
: ยอมรับ [0:0]
# !http! ส่งต่อ oracle.server.public.ip (Server Public IP) พอร์ต TCP 80 ไปยัง 10.10.10.2:80 (VPN Client IP)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 80 -j DNAT --to-destination 10.10.10.2:80
# !HTTPS! ส่งต่อ oracle.server.public.ip (Server Public IP) พอร์ต TCP 443 ไปยัง 10.10.10.2:443 (VPN Client IP)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 443 -j DNAT --to-destination 10.10.10.2:443
# !PROSODY-5222! ส่งต่อ oracle.server.public.ip (Server Public IP) พอร์ต TCP 5222 ไปยัง 10.10.10.2:5222 (VPN Client IP)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 5222 -j DNAT --to-destination 10.10.10.2:5222
# !PROSODY-5269! ส่งต่อ oracle.server.public.ip (Server Public IP) พอร์ต TCP 5269 ไปยัง 10.10.10.2:5269 (VPN Client IP)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 5269 -j DNAT --to-destination 10.10.10.2:5269
# !PROSODY-BOSH-5280! ส่งต่อ oracle.server.public.ip (Server Public IP) พอร์ต TCP 5280 ไปยัง 10.10.10.2:5280 (VPN Client IP)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 5280 -j DNAT --to-destination 10.10.10.2:5280
# !PROSODY-BOSH-5281! ส่งต่อ oracle.server.public.ip (Server Public IP) พอร์ต TCP 5281 ไปยัง 10.10.10.2:5281 (VPN Client IP)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 5281 -j DNAT --to-destination 10.10.10.2:5281
ให้สัญญา
### Linuxbabe - บทช่วยสอน Wireguard
#แนทโพสต์รัวๆ
*แนท
:หลังยอมรับ [0:0]
-A โพสต์ -s 10.10.10.0/24 -o ens3 -j MASQUERADE
# สิ้นสุดแต่ละตารางด้วยบรรทัด 'COMMIT' มิฉะนั้นกฎเหล่านี้จะไม่ได้รับการประมวลผล
ให้สัญญา
ของฉัน /etc/nginx/nginx.conf
ไฟล์บนเซิร์ฟเวอร์ LEMP (ไคลเอนต์ wireguard) มีลักษณะดังนี้:
#ผู้ใช้ nginx;
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
error_log /var/log/nginx/error.log ประกาศ;
pid /var/run/nginx.pid;
เหตุการณ์ {
worker_connections 1024;
}
http {
รวม /etc/nginx/mime.types;
แอปพลิเคชัน default_type/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$สถานะ $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log หลัก;
ส่งไฟล์บน;
#tcp_nopush บน;
keepalive_timeout 65;
#gzip บน;
รวม /etc/nginx/conf.d/*.conf;
}
ของฉัน /etc/nginx/conf.d/prosody.conf
ไฟล์บนเซิร์ฟเวอร์ LEMP (ไคลเอนต์ VPN) มีลักษณะดังนี้:
เซิร์ฟเวอร์ {
ฟัง 80;
ฟัง [::]:80;
server_name chat.example.com;
ราก /var/www/ฉันทลักษณ์/;
ตำแหน่ง ~ /.well-known/acme-challenge {
อนุญาตทั้งหมด
}
}
สุดท้ายนี้ ฉันได้เปิดใช้งานการส่งต่อ IP บน Oracle Server โดยยกเลิกการแสดงความคิดเห็นในบรรทัด net.ipv4.ip_forward = 1
ใน /etc/sysctl.conf
.
หลังจากทั้งหมดนี้ ดูเหมือนว่าเซิร์ฟเวอร์ LEMP ของฉันจะใช้ VPN Server Tunnel ของ Oracle Instance ได้สำเร็จ แต่ก็ยังไม่สามารถรับใบรับรองจาก cerbot โดยใช้ไฟล์กำหนดค่า prosody.conf nginx เท่าที่ฉันสามารถบอกได้ จากการค้นคว้าทั้งหมดที่ฉันได้ทำไป การตั้งค่านี้ (ที่สำคัญที่สุดคือกฎการส่งต่อ VPN ใน before.rules) ควรอนุญาตให้เซิร์ฟเวอร์ LEMP ของฉันได้รับใบรับรองโดยใช้ที่อยู่ IP ของ Oracle Instance แต่มันไม่ได้ทำเช่นนั้น!
ดังนั้นคำถามของฉันคือ ฉันต้องทำอย่างไรเพื่อดีบักสิ่งนี้ อะไรบล็อกเซิร์ฟเวอร์ LEMP พอร์ต 80/443 ของฉัน และฉันต้องทำอย่างไรจึงจะได้ใบรับรอง certbot สำหรับฉันทลักษณ์โดยใช้ที่อยู่ IP สาธารณะของ Oracle Instance ได้สำเร็จ