สัปดาห์นี้ฉันได้ตั้งค่าเซิร์ฟเวอร์ AWS EC2 และเกือบจะบรรลุเป้าหมายในสิ่งที่ฉันต้องการแล้ว แต่การเปิดเป็นเว็บเซิร์ฟเวอร์กำลังพิสูจน์ให้เห็นว่าเป็นอุปสรรค
การตั้งค่าของฉัน
ฉันมีอินสแตนซ์ AWS EC2 ที่ใช้งาน Red Hat EL7
ฉันมีเซิร์ฟเวอร์ Apache ทำงานบนอินสแตนซ์ของฉัน:
[ec2-user@ip-172-xx-xx-xx ~]$ ps -ef | grep -i httpd
root 18162 1 0 18:02 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 18163 18162 0 18:02 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 18164 18162 0 18:02 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 18165 18162 0 18:02 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 18166 18162 0 18:02 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 18167 18162 0 18:02 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
ec2-user 21345 20507 0 19:03 pts/1 00:00:00 grep --color=auto -i httpd
ดูเหมือนว่าจะฟังบนพอร์ต 80:
[root@ip-172-xx-xx-xx ~]# netstat -lntp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 18162/httpd
ฉันเพิ่มกฎขาเข้าให้กับกลุ่มความปลอดภัย "launch-wizard-1" (ซึ่งแสดงเป็นกลุ่มความปลอดภัยสำหรับอินสแตนซ์) สำหรับพอร์ต 80 (HTTP) และ 443 (HTTPS) พร้อมแหล่งที่มาของ "0.0.0.0/0" และ " ::/0"
และสุดท้าย สำหรับการทดสอบการตั้งค่าของฉัน ฉันได้สร้างไฟล์ index.html ในรูทเอกสารของฉัน (/var/www/html):
<html>
<h1>TEST!</h1>
</html>
ปัญหา
จากเบราว์เซอร์ Chrome บนคอมพิวเตอร์ของฉัน เมื่อฉันพยายามกด:
http://ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com/index.html
ฉันเพิ่งได้รับ:
This page isn’t working
ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com didn’t send any data.
ERR_EMPTY_RESPONSE
(ฉันจะเป็นเหมือนเดิมเมื่อฉันพบชื่อโดเมนที่ฉันตั้งค่าไว้ ซึ่งเป็นสิ่งที่ฉันจริงๆพยายามทำแน่นอน!)
ฉันได้ลองเชื่อมต่อจาก Chrome บนคอมพิวเตอร์ 2 เครื่องที่แตกต่างกัน และจาก Safari บนโทรศัพท์ของฉัน ("Safari ไม่สามารถเปิดหน้านี้ได้เนื่องจากไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้")
การตรวจสอบที่ฉันได้ดำเนินการ
ฉันไม่เชื่อว่าฉันมีไฟร์วอลล์เซิร์ฟเวอร์ใด ๆ ที่ป้องกันสิ่งนี้:
[root@ip-xx-xx-xx-xx conf]# /sbin/iptables -L -v -n
Chain INPUT (policy ACCEPT 3575 packets, 275K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2215 packets, 350K bytes)
pkts bytes target prot opt in out source destination
การทดสอบด้วย telnet จากเซสชันเทอร์มินัลบน mac ของฉัน ดูเหมือนว่าพอร์ต 80 จะเปิดอยู่ ขั้นแรกใช้ IPv2 Public IP:
telnet 18.xxx.xxx.xx 80
Trying 18.xxx.xxx.xx...
Connected to ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.
และใช้ Public DNS (IPv4):
telnet ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com 80
Trying 18.xxx.xxx.xx...
Connected to ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.
และอีกครั้ง เช่นเดียวกับชื่อโดเมนของฉัน - telnet ไปยังพอร์ต 80 แสดงว่า "เชื่อมต่อแล้ว"
- ความจริงที่ว่า "โฮสต์ต่างประเทศ" ปิดการเชื่อมต่อมีความสำคัญในทันทีหรือไม่? มันควรจะเปิดอยู่หรือไม่หากทุกอย่างทำงานได้ตามปกติ
การรัน curl บนโฮสต์อย่างถูกต้องจะส่งคืนไฟล์ index.html แบบง่ายของฉัน:
[ec2-user@ip-172-xx-xx-xx ~]$ curl localhost
<html>
<h1>TEST!</h1>
</html>
อย่างไรก็ตาม การเรียกใช้ขดบนเครื่องคอมพิวเตอร์ของฉัน - ไปยังเซิร์ฟเวอร์ - ส่งคืน:
curl -v http://ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com:80
* Rebuilt URL to: http://ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com:80/
* Trying 18.xxx.xxx.xx...
* Connected to ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com (18.xxx.xxx.xx) port 80 (#0)
> GET / HTTP/1.1
> Host: ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com
> User-Agent: curl/7.43.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host ec2-18-xxx-xxx-xx.us-east-2.compute.amazonaws.com left intact
curl: (52) Empty reply from server
ฉันยังทดสอบเว็บเซิร์ฟเวอร์ "ภายใน" ด้วยการเรียกใช้ Google Chrome (ไม่มีหัว) บนเซิร์ฟเวอร์เพื่อสร้างภาพหน้าจอ ดาวน์โหลดลงในเครื่องคอมพิวเตอร์ของฉัน และมันแสดง TEST! (เช่นมันใช้งานได้):
google-chrome-stable --headless --disable-gpu --screenshot http://localhost
อีกสิ่งหนึ่งที่ต้องเพิ่ม - เมื่อฉันพยายามโจมตีเว็บเซิร์ฟเวอร์จากเครื่องของฉัน ไม่มีสิ่งใดแสดงในบันทึกของเว็บเซิร์ฟเวอร์ (error_log หรือ access_log) บนเซิร์ฟเวอร์
ดังนั้น ความเห็นของฉันคือเว็บเซิร์ฟเวอร์เปิดใช้งานแล้ว ทำงานได้ในพื้นที่ แต่ทำงานไม่ถูกต้องสำหรับสิ่งที่มาจาก "ภายนอก" ตอนนี้ฉันยังงงอยู่เลย
curl localhost
จากเซิร์ฟเวอร์เอง ด้วยวิธีนี้ จะเป็นการทดสอบเว็บเซิร์ฟเวอร์โดยไม่ได้รับผลกระทบจากการกำหนดค่าเครือข่ายใดๆ - person John Rotenstein   schedule 21.12.2018