นี่คือปัญหาที่ฉันพยายามแก้ไข มีเซิร์ฟเวอร์ ("ระบบระยะไกล") ที่ฉันสามารถ ssh จากคอมพิวเตอร์ท้องถิ่นของฉัน แต่ระบบระยะไกลนี้ไม่มีการเชื่อมต่ออินเทอร์เน็ต ฉันต้องการให้ระบบระยะไกลสามารถเข้าถึงอินเทอร์เน็ตผ่านคอมพิวเตอร์ในพื้นที่ของฉันโดยใช้ VPN ที่ใช้ ssh ฉันจะทำสิ่งนี้ได้อย่างไร ฉันลองทำสิ่งต่อไปนี้ซึ่งดูเหมือนว่าจะทำงานได้บางส่วน สิ่งที่ฉันหมายถึงโดย 'ทำงานเพียงบางส่วน' คือแพ็คเก็ตการเชื่อมต่อ (แพ็คเก็ตซิงค์) ถูกส่งไปยังเครื่องคอมพิวเตอร์ของฉัน แต่ไม่สามารถสร้างการเชื่อมต่อกับอินเทอร์เน็ต ฉันใช้ tcpdump เพื่อจับแพ็คเก็ตบนเครื่องคอมพิวเตอร์ คอมพิวเตอร์โลคัลและระบบรีโมตกำลังรันทั้ง centos 7
การตั้งค่า - หมายเหตุ: คำสั่งด้านล่างจะทำงานตามลำดับ คำสั่ง user @ remote ถูกรันบนรีโมตเซิร์ฟเวอร์และคำสั่ง user @ local ถูกรันบนโลคัลคอมพิวเตอร์
[user @ remote ~] $ ip addr แสดง 1: lo: mtu 65536 qdisc noqueue state UNKNOWN ลิงค์ / ลูปแบ็ค 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00 inet 127.0.0.1/8 ขอบเขตโฮสต์แท้จริง valid_lft ตลอดกาล Preferred_lft ตลอดกาล inet6 :: โฮสต์ขอบเขต 1/128 valid_lft ตลอดกาล Preferred_lft ตลอดกาล 2: eth0: mtu 1,500 qdisc pfifo_fast สถานะขึ้น qlen 1000 ลิงก์ / อีเธอร์ AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 ขอบเขต global ไดนามิก eth0 valid_lft 1785sec Preferred_lft 1785sec inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 ขอบเขตโกลบอล noprefixroute แบบไดนามิก valid_lft 2591987sec Preferred_lft 604787sec inet6 ABCD :: IIII: JJJJ: KKKK: ลิงก์ LLLL / 64 valid_lft ตลอดกาล Preferred_lft ตลอดกาล
[user @ local ~] การแสดง $ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN ลิงค์ / ลูปแบ็ค 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00 inet 127.0.0.1/8 ขอบเขตโฮสต์แท้จริง valid_lft ตลอดกาล Preferred_lft ตลอดกาล inet6 :: โฮสต์ขอบเขต 1/128 valid_lft ตลอดกาล Preferred_lft ตลอดกาล 2: eth0: mtu 1,500 qdisc pfifo_fast สถานะขึ้น qlen 1000 ลิงก์ / อีเธอร์ AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 ขอบเขต global ไดนามิก eth0 valid_lft 1785sec Preferred_lft 1785sec inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 ขอบเขตโกลบอล noprefixroute แบบไดนามิก valid_lft 2591987sec Preferred_lft 604787sec inet6 ABCD :: IIII: JJJJ: KKKK: ลิงก์ LLLL / 64 valid_lft ตลอดกาล Preferred_lft ตลอดกาล
สร้างอินเตอร์เฟส tun0 บนระบบ รีโมต
[user @ remote ~] $ sudo ip tuntap เพิ่ม tun0 mode tun [user @ remote ~] $ ip addr แสดง 1: lo: mtu 65536 qdisc noqueue state UNKNOWN ลิงค์ / ลูปแบ็ค 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00 inet 127.0.0.1/8 ขอบเขตโฮสต์แท้จริง valid_lft ตลอดกาล Preferred_lft ตลอดกาล inet6 :: โฮสต์ขอบเขต 1/128 valid_lft ตลอดกาล Preferred_lft ตลอดกาล 2: eth0: mtu 1,500 qdisc pfifo_fast สถานะขึ้น qlen 1000 ลิงก์ / อีเธอร์ AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 ขอบเขต global ไดนามิก eth0 valid_lft 1785sec Preferred_lft 1785sec inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 ขอบเขตโกลบอล noprefixroute แบบไดนามิก valid_lft 2591987sec Preferred_lft 604787sec inet6 ABCD :: IIII: JJJJ: KKKK: ลิงก์ LLLL / 64 valid_lft ตลอดกาล Preferred_lft ตลอดกาล 3: tun0: mtu 1,500 qdisc noop สถานะลง qlen 500 การเชื่อมโยง / ไม่มี
สร้างอินเตอร์เฟส tun0 บนระบบ โลคัล
[user @ local ~] $ sudo ip tuntap เพิ่ม tun0 mode tun [user @ local ~] การแสดง $ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN ลิงค์ / ลูปแบ็ค 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00 inet 127.0.0.1/8 ขอบเขตโฮสต์แท้จริง valid_lft ตลอดกาล Preferred_lft ตลอดกาล inet6 :: โฮสต์ขอบเขต 1/128 valid_lft ตลอดกาล Preferred_lft ตลอดกาล 2: eth0: mtu 1,500 qdisc pfifo_fast สถานะขึ้น qlen 1000 ลิงก์ / อีเธอร์ AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 ขอบเขต global ไดนามิก eth0 valid_lft 1785sec Preferred_lft 1785sec inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 ขอบเขตโกลบอล noprefixroute แบบไดนามิก valid_lft 2591987sec Preferred_lft 604787sec inet6 ABCD :: IIII: JJJJ: KKKK: ลิงก์ LLLL / 64 valid_lft ตลอดกาล Preferred_lft ตลอดกาล 3: tun0: mtu 1,500 qdisc noop สถานะลง qlen 500 การเชื่อมโยง / ไม่มี
กำหนดที่อยู่ IP ให้กับ tun0 และนำขึ้นมา:
[user @ local ~] $ sudo ip addr เพิ่ม 10.0.2.1/30 dev tun0 [user @ local ~] $ sudo ip link ตั้งค่า dev tun0 ขึ้น [user @ local ~] $ ip addr แสดง tun0 3: tun0: mtu 1,500 qdisc pfifo_fast สถานะดาวน์ qlen 500 การเชื่อมโยง / ไม่มี inet 10.0.2.1/30 ขอบเขต global tun0 valid_lft ตลอดกาล Preferred_lft ตลอดกาล
[user @ remote ~] $ sudo ip addr เพิ่ม 10.0.2.2/30 dev tun0 [user @ remote ~] $ sudo ip link ตั้งค่า dev tun0 ขึ้น [user @ remote ~] $ ip addr แสดง tun0 3: tun0: mtu 1,500 qdisc pfifo_fast สถานะดาวน์ qlen 500 การเชื่อมโยง / ไม่มี inet 10.0.2.2/30 ขอบเขต global tun0 valid_lft ตลอดกาล Preferred_lft ตลอดกาล
ปรับเปลี่ยน sshd_config บนทั้งระบบรีโมตและโลคัลเพื่อเปิดใช้งานการทันเนล:
[user @ remote ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config PermitTunnel แบบจุดต่อจุด
[user @ local ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config PermitTunnel แบบจุดต่อจุด
สร้างอุโมงค์ ssh:
[user @ local ~] $ sudo ssh -f -w0: 0 root @ remote จริง รหัสผ่านของ root @ remote: [user @ local ~] $ ps aux | grep root @ remote ราก 1851 0.0 0.0 76112 1348 Ss 23:12 0:00 ssh -f -w0: 0 root @ remote จริง
ทดสอบ ping บนเซิร์ฟเวอร์ทั้งสองโดยใช้ที่อยู่ IP ใหม่:
[user @ local ~] $ ping 10.0.2.2 -c 2 PING 10.0.2.2 (10.0.2.2) 56 (84) ไบต์ของข้อมูล 64 ไบต์จาก 10.0.2.2: icmp_seq = 1 ttl = 64 เวลา = 1.68 ms 64 ไบต์จาก 10.0.2.2: icmp_seq = 2 ttl = 64 เวลา = 0.861 ms --- 10.0.2.2 สถิติ ping --- ส่ง 2 แพ็คเก็ต, 2 ได้รับ, 0% แพ็กเก็ตสูญเสีย, เวลา 1002ms rtt min / avg / max / mdev = 0.861 / 1.274 / 1.688 / 0.415 ms
[user @ remote ~] $ ping 10.0.2.1 -c 2 PING 10.0.2.1 (10.0.2.1) 56 (84) ไบต์ของข้อมูล 64 ไบต์จาก 10.0.2.1: icmp_seq = 1 ttl = 64 เวลา = 0.589 ms 64 ไบต์จาก 10.0.2.1: icmp_seq = 2 ttl = 64 เวลา = 0.889 ms --- 10.0.2.1 สถิติ ping --- 2 แพ็คเก็ตที่ส่ง, 2 ที่ได้รับ, การสูญเสียแพ็กเก็ต 0%, เวลา 1000ms rtt นาที / avg / สูงสุด / mdev = 0.589 / 0.739 / 0.889 / 0.150 ms
[user @ remote ~] $ เส้นทาง ตารางการกำหนดเส้นทาง IP เคอร์เนล เกตเวย์ปลายทาง Genmask ตัวชี้วัดการอ้างอิง Ref ใช้ Iface เกตเวย์เริ่มต้น 0.0.0.0 UG 100 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 [user @ remote ~] $ ip แสดงเส้นทาง ค่าเริ่มต้นผ่าน AAA.BBB.CCC.1 dev eth0 proto static metric 100 10.0.2.0/30 dev tun0 การเชื่อมโยงขอบเขตเคอร์เนล proto src 10.0.2.2 AAA.BBB.CCC.0 / 24 dev eth0 โปรโตเคอร์เนลเชื่อมโยงขอบเขต src AAA.BBB.CCC.31 เมตริก 100
รับที่อยู่ google ip:
[user @ local ~] $ nslookup google.com เซิร์ฟเวอร์: เซิร์ฟเวอร์ ที่อยู่: เซิร์ฟเวอร์ # 53 คำตอบที่ไม่มีสิทธิ์: ชื่อ: google.com ที่อยู่: 173.194.219.101 ชื่อ: google.com ที่อยู่: 173.194.219.100 ชื่อ: google.com ที่อยู่: 173.194.219.113 ชื่อ: google.com ที่อยู่: 173.194.219.102 ชื่อ: google.com ที่อยู่: 173.194.219.139 ชื่อ: google.com ที่อยู่: 173.194.219.138
สำคัญ: ฉันรันคำสั่งด้านบนในเวลาอื่นและได้ผลลัพธ์ที่แตกต่าง อย่าคิดว่าคำตอบของคุณจะเหมือนกับของฉันสำหรับ nslookup ด้านบน
เนื่องจากที่อยู่ IP ของ Google ทั้งหมดเริ่มต้นด้วย 173.194.219 ให้กำหนดเส้นทางที่อยู่ IP ทั้งหมดเหล่านี้ผ่านเครื่องคอมพิวเตอร์
[user @ remote ~] $ sudo ip route เพิ่ม 173.194.219.0/24 dev tun0 [user @ remote ~] $ เส้นทาง ตารางการกำหนดเส้นทาง IP เคอร์เนล เกตเวย์ปลายทาง Genmask ตัวชี้วัดการอ้างอิง Ref ใช้ Iface เกตเวย์เริ่มต้น 0.0.0.0 UG 100 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 [user @ remote ~] $ ip แสดงเส้นทาง ค่าเริ่มต้นผ่าน AAA.BBB.CCC.1 dev eth0 proto static metric 100 10.0.2.0/30 dev tun0 การเชื่อมโยงขอบเขตเคอร์เนล proto src 10.0.2.2 AAA.BBB.CCC.0 / 24 dev eth0 โปรโตเคอร์เนลเชื่อมโยงขอบเขต src AAA.BBB.CCC.31 เมตริก 100 173.194.219.0/24 การเชื่อมโยงขอบเขต dev tun0
เปิดใช้งาน ip_forwarding:
[user @ local ~] $ grep ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 [user @ local ~] $ sudo เริ่มบริการเครือข่าย กำลังรีสตาร์ทเครือข่าย (ผ่าน systemctl): [ตกลง]
ตั้งค่าการดักจับแพ็กเก็ตบนเครื่องคอมพิวเตอร์โดยใช้ tcpdump:
[user @ local ~] $ sudo tcpdump -nn -vv 'พอร์ตไม่ใช่ 22' -i any tcpdump: การฟังใด ๆ , ประเภทลิงก์ LINUX_SLL (Linux สุก), ขนาดการบันทึก 65535 ไบต์
พยายามเชื่อมต่อ google จากเซิร์ฟเวอร์ระยะไกล
[user @ remote ~] $ openssl s_client -connect google.com:443 ซ็อกเก็ต: ไม่มีเส้นทางไปยังโฮสต์ การเชื่อมต่อ: errno = 113
ทันทีที่คำสั่ง openssl ทำงานบนเซิร์ฟเวอร์ระยะไกล tcpdump จะจับแพ็คเก็ตบางส่วน:
10.0.2.2.52768> 173.194.219.102.443: ธง [S], cksum 0x8702 (ถูกต้อง), ตามลำดับ 994650730, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701438 ecr 0, nop, wscale 7], ความยาว 0 00: 49: 33.247753 IP (tos 0x0, ttl 64, id 46037, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.48774> 173.194.219.100.443: ธง [S], cksum 0x47a7 (ถูกต้อง), seq 2218733674, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], ความยาว 0 00: 49: 33.247883 IP (tos 0xc0, ttl 64, id 9538, offset 0, แฟล็ก [none], proto ICMP (1), ความยาว 88) 10.0.2.1> 10.0.2.2: โฮสต์ ICMP 173.194.219.100 ไม่สามารถเข้าถึง - ผู้ดูแลระบบต้องห้าม, ความยาว 68 IP (tos 0x0, ttl 63, id 46037, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.48774> 173.194.219.100.443: ธง [S], cksum 0x47a7 (ถูกต้อง), seq 2218733674, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], ความยาว 0 00: 49: 33.253068 IP (tos 0x0, ttl 64, id 26282, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.51312> 173.194.219.101.443: ธง [S], cksum 0x6ff8 (ถูกต้อง), seq 2634016105, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], ความยาว 0 00: 49: 33.254771 IP (tos 0xc0, ttl 64, id 9539, offset 0, แฟล็ก [none], proto ICMP (1), ความยาว 88) 10.0.2.1> 10.0.2.2: โฮสต์ ICMP 173.194.219.101 ไม่สามารถเข้าถึง - ผู้ดูแลระบบต้องห้าม, ความยาว 68 IP (tos 0x0, ttl 63, id 26282, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.51312> 173.194.219.101.443: ธง [S], cksum 0x6ff8 (ถูกต้อง), seq 2634016105, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], ความยาว 0 00: 49: 33.258805 IP (tos 0x0, ttl 64, id 9293, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.33686> 173.194.219.139.443: ธง [S], cksum 0x542b (ถูกต้อง), ตามมาตรฐาน 995927943, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], ความยาว 0 00: 49: 33.258845 IP (tos 0xc0, ttl 64, id 9540, offset 0, แฟล็ก [none], proto ICMP (1), ความยาว 88) 10.0.2.1> 10.0.2.2: โฮสต์ ICMP 173.194.219.139 ไม่สามารถเข้าถึงได้ - ผู้ดูแลระบบต้องห้าม, ความยาว 68 IP (tos 0x0, ttl 63, id 9293, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.33686> 173.194.219.139.443: ธง [S], cksum 0x542b (ถูกต้อง), ตามมาตรฐาน 995927943, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], ความยาว 0 ^ C จับแพ็คเก็ต 13 รายการ 13 แพ็กเก็ตที่ได้รับจากตัวกรอง 0 แพ็คเก็ตลดลงโดยเคอร์เนล
แพ็กเก็ตที่ดักจับโดยใช้ tcpdump แนะนำว่ามีความพยายามในการสร้างการเชื่อมต่อ (ส่งแพ็กเก็ตซิงค์) แต่ไม่มีอะไรได้รับ นอกจากนี้ยังมีข้อความ10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68
ที่ดูเหมือนว่าจะแนะนำปัญหา
มีข้อเสนอแนะเกี่ยวกับวิธีแก้ไขปัญหานี้หรือไม่? มีกฎ iptable ที่ต้องเพิ่มหรือไม่ ปัญหาไฟร์วอลล์ใด ๆ (firewall-d?)
หมายเหตุ # 1
เอาต์พุตจาก iptables-save:
[user @ local ~] $ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32! -d 10.0.2.1/30 -j MASQUERADE -o eth0 [user @ local ~] $ sudo iptables-save # สร้างโดย iptables-save v1.4.21 เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น. 2017 * NAT : การยอมรับล่วงหน้า [35: 8926] : อินพุตยอมรับ [1:84] : ยอมรับผลลัพธ์ [6: 439] : ยอมรับการโพสต์ [6: 439] : OUTPUT_direct - [0: 0] : POSTROUTING_ZONES - [0: 0] : POSTROUTING_ZONES_SOURCE - [0: 0] : POSTROUTING_direct - [0: 0] : POST_public - [0: 0] : POST_public_allow - [0: 0] : POST_public_deny - [0: 0] : POST_public_log - [0: 0] : PREROUTING_ZONES - [0: 0] : PREROUTING_ZONES_SOURCE - [0: 0] : PREROUTING_direct - [0: 0] : PRE_public - [0: 0] : PRE_public_allow - [0: 0] : PRE_public_deny - [0: 0] : PRE_public_log - [0: 0] -A PREROUTING -j PREROUTING_direct -A PREROUTING -j PREROUTING_ZONES_SOURCE -A PREROUTING -j PREROUTING_ZONES -A OUTPUT -j OUTPUT_direct -A POSTROUTING -j POSTROUTING_direct -A POSTROUTING -j POSTROUTING_ZONES_SOURCE -A POSTROUTING -j POSTROUTING_ZONES -A POSTROUTING -s 10.0.2.2/32! -d 10.0.2.0/30 -j MASQUERADE -A POSTROUTING_ZONES -o eth0 -g POST_public -A POSTROUTING_ZONES -g POST_public -A POST_public -j POST_public_log -A POST_public -j POST_public_deny -A POST_public -j POST_public_allow -A PREROUTING_ZONES -i eth0 -g PRE_public -A PREROUTING_ZONES -g PRE_public -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow COMMIT # เสร็จสมบูรณ์เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น # สร้างโดย iptables-save v1.4.21 เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น. 2017 * ฉีก : การยอมรับล่วงหน้า [169: 18687] : ยอมรับการยอมรับ [144: 11583] : ไปข้างหน้ายอมรับ [0: 0] : ยอมรับผลลัพธ์ [80: 8149] : ยอมรับการโพสต์ [80: 8149] : FORWARD_direct - [0: 0] : INPUT_direct - [0: 0] : OUTPUT_direct - [0: 0] : POSTROUTING_direct - [0: 0] : PREROUTING_ZONES - [0: 0] : PREROUTING_ZONES_SOURCE - [0: 0] : PREROUTING_direct - [0: 0] : PRE_public - [0: 0] : PRE_public_allow - [0: 0] : PRE_public_deny - [0: 0] : PRE_public_log - [0: 0] -A PREROUTING -j PREROUTING_direct -A PREROUTING -j PREROUTING_ZONES_SOURCE -A PREROUTING -j PREROUTING_ZONES -A INPUT -j INPUT_direct -A FORWARD -j FORWARD_direct -A OUTPUT -j OUTPUT_direct -A POSTROUTING -j POSTROUTING_direct -A PREROUTING_ZONES -i eth0 -g PRE_public -A PREROUTING_ZONES -g PRE_public -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow COMMIT # เสร็จสมบูรณ์เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น # สร้างโดย iptables-save v1.4.21 เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น. 2017 * การรักษาความปลอดภัย : INPUT ACCEPT [2197: 163931] : ไปข้างหน้ายอมรับ [0: 0] : เอาท์พุทยอมรับ [1229: 185742] : FORWARD_direct - [0: 0] : INPUT_direct - [0: 0] : OUTPUT_direct - [0: 0] -A INPUT -j INPUT_direct -A FORWARD -j FORWARD_direct -A OUTPUT -j OUTPUT_direct COMMIT # เสร็จสมบูรณ์เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น # สร้างโดย iptables-save v1.4.21 เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น. 2017 *ดิบ : การยอมรับล่วงหน้า [2362: 184437] : เอาท์พุทยอมรับ [1229: 185742] : OUTPUT_direct - [0: 0] : PREROUTING_direct - [0: 0] -A PREROUTING -j PREROUTING_direct -A OUTPUT -j OUTPUT_direct COMMIT # เสร็จสมบูรณ์เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น # สร้างโดย iptables-save v1.4.21 เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น. 2017 *กรอง : อินพุตยอมรับ [0: 0] : ไปข้างหน้ายอมรับ [0: 0] : ยอมรับผลลัพธ์ [80: 8149] : FORWARD_IN_ZONES - [0: 0] : FORWARD_IN_ZONES_SOURCE - [0: 0] : FORWARD_OUT_ZONES - [0: 0] : FORWARD_OUT_ZONES_SOURCE - [0: 0] : FORWARD_direct - [0: 0] : FWDI_public - [0: 0] : FWDI_public_allow - [0: 0] : FWDI_public_deny - [0: 0] : FWDI_public_log - [0: 0] : FWDO_public - [0: 0] : FWDO_public_allow - [0: 0] : FWDO_public_deny - [0: 0] : FWDO_public_log - [0: 0] : INPUT_ZONES - [0: 0] : INPUT_ZONES_SOURCE - [0: 0] : INPUT_direct - [0: 0] : IN_public - [0: 0] : IN_public_allow - [0: 0] : IN_public_deny - [0: 0] : IN_public_log - [0: 0] : OUTPUT_direct - [0: 0] -A INPUT -m conntrack - สถานะที่เกี่ยวข้องก่อตั้งขึ้น -j ยอมรับ -A INPUT -i lo -j ACCEPT -A INPUT -j INPUT_direct -A INPUT -j INPUT_ZONES_SOURCE -A INPUT -j INPUT_ZONES -A อินพุต - m conntrack - รัฐที่ไม่ถูกต้อง -j DROP -A-INPUT -j REJECT - ปฏิเสธด้วย icmp โฮสต์ที่ไม่ได้รับอนุญาต -A ไปข้างหน้า -m conntrack - สถานะที่เกี่ยวข้องก่อตั้งขึ้น -j ยอมรับ -A ไปข้างหน้า -i แท้จริง -j ยอมรับ -A FORWARD -j FORWARD_direct -A ไปข้างหน้า -j FORWARD_IN_ZONES_SOURCE -A ไปข้างหน้า -j FORWARD_IN_ZONES -A ไปข้างหน้า -j FORWARD_OUT_ZONES_SOURCE -A ไปข้างหน้า -j FORWARD_OUT_ZONES -A ไปข้างหน้า -m conntrack - รัฐที่ไม่ถูกต้อง -j DROP -A ไปข้างหน้า -j ปฏิเสธ - ปฏิเสธด้วย icmp- โฮสต์ - ห้าม -A OUTPUT -j OUTPUT_direct -A FORWARD_IN_ZONES -i eth0 -g FWDI_public -A FORWARD_IN_ZONES -g FWDI_public -A FORWARD_OUT_ZONES -o eth0 -g FWDO_public -A FORWARD_OUT_ZONES -g FWDO_public -A FWDI_public -j FWDI_public_log -A FWDI_public -j FWDI_public_deny -A FWDI_public -j FWDI_public_allow -A FWDI_public -p icmp -j ACCEPT -A FWDO_public -j FWDO_public_log -A FWDO_public -j FWDO_public_deny -A FWDO_public -j FWDO_public_allow -A INPUT_ZONES -i eth0 -g IN_public -A INPUT_ZONES -g IN_public -A IN_public -j IN_public_log -A IN_public -j IN_public_deny -A IN_public -j IN_public_allow -A IN_public -p icmp -j ACCEPT -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack - สถานะใหม่ -j ยอมรับ COMMIT # เสร็จสมบูรณ์เมื่อวันเสาร์ที่ 15 เม.ย. 01:40:57 น
หมายเหตุ # 2:
ฉันตั้งค่า apache webserver บนโฮสต์แยกต่างหากที่มีเฉพาะเซิร์ฟเวอร์ภายในเท่านั้นที่สามารถเข้าถึงได้ ฉันรัน tcpdump บนเว็บเซิร์ฟเวอร์ฟังพอร์ต 80 เมื่อฉันรัน
telnet webserver 80
ฉันจะจับแพ็คเก็ตต่อไปนี้ นี่เป็นลักษณะการทำงานที่คาดว่าจะเกิดขึ้นเนื่องจากการเชื่อมต่อ TCP ได้ถูกสร้างขึ้น
[user @ webserver ~] $ sudo tcpdump -nn -vv 'พอร์ตไม่ใช่ 22 และ 80' -i eth0 tcpdump: การฟังบน eth0, link-type EN10MB (Ethernet), ขนาดการจับ 65535 ไบต์ 07: 17: 30.411474 IP (tos 0x10, ttl 64, id 34376, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) local.server.46710> web.server.80: แฟล็ก [S], cksum 0x8412 (ไม่ถูกต้อง -> 0x6d96), 30,1858,654 คิว, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 3047398 ecr 0, nop, wscale 7] ความยาว 0 07: 17: 30.411557 IP (tos 0x0, ttl 64, id 0, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) web.server.80> local.server.46710: Flags [S. ], cksum 0x8412 (ไม่ถูกต้อง -> 0x9114), จำนวน 2651711943, รับ 3018586543, ชนะ 28960, ตัวเลือก [mss 1460, sackOK, TS val 37704524 ecr 3047398, nop , wscale 7], ความยาว 0 07: 17: 30.411725 IP (tos 0x10, ttl 64, id 34377, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 52) local.server.46710> web.server.80: Flags [.], cksum 0x840a (ไม่ถูกต้อง -> 0x301c), seq 1, se 1, ack 1, ชนะ 229, ตัวเลือก [nop, nop, TS val 3047398 ecr 37704524], ความยาว 0
เมื่อฉันพยายามเชื่อมต่อไปยังเว็บเซิร์ฟเวอร์จากเซิร์ฟเวอร์ระยะไกลผ่านเซิร์ฟเวอร์ท้องถิ่น tcpdump บนเว็บเซิร์ฟเวอร์ไม่ได้จับแพ็คเก็ตใด ๆ (ไม่ใช่แม้แต่การซิงค์เริ่มต้น) แต่เซิร์ฟเวอร์ในพื้นที่จับแพ็คเก็ตซิงค์ที่ส่งไปยังเว็บเซิร์ฟเวอร์ (ดูด้านล่าง) สิ่งนี้ทำให้ฉันเชื่อว่ามีบางสิ่งที่ขัดขวางไม่ให้แพ็คเก็ตถูกส่งไปยังเว็บเซิร์ฟเวอร์ - อาจเป็นการกำหนดค่าผิดพลาดหรือไฟร์วอลล์
[user @ local ~] $ sudo tcpdump -nn -vv 'พอร์ตไม่ใช่ 22 และ 80' -i any tcpdump: การฟังใด ๆ , ประเภทลิงก์ LINUX_SLL (Linux สุก), ขนาดการบันทึก 65535 ไบต์ 02: 24: 09.135842 IP (tos 0x10, ttl 64, id 38062, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.50558> web.server.80: แฟล็ก [S], cksum 0x668d (ถูกต้อง), 69,696,66,6,6,6,6,6,6,6,6,6,6,6,6 ชนะชนะ 29200 ตัวเลือก [mss 1460, sackOK, TS val 4780524 ecr 0, nop, wscale 7], ความยาว 0
สำคัญ:แพ็กเก็ตไม่ได้ถูกส่งผ่าน eth0 แต่พยายามส่งแพ็กเก็ตไปยังเว็บเซิร์ฟเวอร์ผ่าน tun0 แทน (ซึ่งล้มเหลว) ฉันสามารถยืนยันสิ่งนี้ได้ด้วยการรัน tcpdump บนอินเตอร์เฟส tun0:
[user @ local ~] $ sudo tcpdump -nn -vv 'พอร์ตไม่ใช่ 22 และ 80' -i tun0 tcpdump: การฟังบน tun0, RAW ชนิดลิงก์ (IP ดิบ), ขนาดการดักจับ 65535 ไบต์ 02: 28: 10.295972 IP (tos 0x10, ttl 64, id 46976, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.50560> webserver.80: Flags [S], cksum 0xd560 (ถูกต้อง), seq 605366388, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 5021684 ecr 0, nop, wscale 7], ความยาว 0
หมายเหตุ # 3:
ฉันปิดไฟร์วอลล์ในคอมพิวเตอร์ท้องถิ่นและเว็บเซิร์ฟเวอร์ได้รับแพ็กเก็ตซิงค์
[user @ local ~] $ sudo systemctl หยุดการไฟร์วอลล์
[user @ webserver ~] $ sudo tcpdump -nn -vv 'พอร์ตไม่ใช่ 22 และ 80' -i eth0 tcpdump: การฟังบน eth0, link-type EN10MB (Ethernet), ขนาดการจับ 65535 ไบต์ 08: 25: 17.390912 IP (tos 0x10, ttl 63, id 61767, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.50580> web.server.80: Flags [S], cksum 0x30dc (ถูกต้อง), seq 2601927549, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7123514 ecr 0, nop, wscale 7], ความยาว 0 08: 25: 17.391003 IP (tos 0x0, ttl 64, id 0, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) web.server.80> 10.0.2.2.50580: Flags [S. ], cksum 0x4e23 (ไม่ถูกต้อง -> 0xa316), อันดับ 959115533, รับ 2601927550, ชนะ 28960, ตัวเลือก [mss 1460, sackOK, TS val 41771503 ecr 7123514, nop , wscale 7], ความยาว 0 08: 25: 17.391192 IP (tos 0x0, ttl 128, id 60032, offset 0, แฟล็ก [none], proto TCP (6), ความยาว 40) 10.0.2.2.50580> web.server.80: Flags [R], cksum 0x7339 (ถูกต้อง), seq 2601927550, ชนะ 8192, ความยาว 0 08: 25: 18.393794 IP (tos 0x10, ttl 63, id 61768, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) 10.0.2.2.50580> web.server.80: Flags [S], cksum 0x2cf1 (ถูกต้อง), seq 2601927549, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 7124517 ecr 0, nop, wscale 7], ความยาว 0 08: 25: 18.393898 IP (tos 0x0, ttl 64, id 0, offset 0, แฟล็ก [DF], proto TCP (6), ความยาว 60) web.server.80> 10.0.2.2.50580: Flags [S. ], cksum 0x4e23 (ไม่ถูกต้อง -> 0x7e71), ต้องการ 974785773, รับ 2601927550, ชนะ 28960, ตัวเลือก [mss 1460, sackOK, TS val 41772506 ecr 7124517, nop , wscale 7], ความยาว 0 08: 25: 18.394003 IP (tos 0x0, ttl 128, id 60033, offset 0, แฟล็ก [none], proto TCP (6), ความยาว 40) 10.0.2.2.50580> web.server.80: Flags [R], cksum 0x566a (ถูกต้อง), seq 2601927550, ชนะ 8192, ความยาว 0
ตอนนี้ชัดเจนว่า IP ต้นทางต้องได้รับการอัปเดตให้ตรงกับที่อยู่ IP ของเซิร์ฟเวอร์ในระบบก่อนที่จะส่งแพ็กเก็ตไปยังเว็บเซิร์ฟเวอร์ ตามที่ @xin แนะนำไว้ NAT จำเป็นต้องตั้งค่าบนเซิร์ฟเวอร์ภายใน
หมายเหตุ # 4:
เมื่อฉันพยายามเชื่อมต่อกับเว็บเซิร์ฟเวอร์ฉันจะเห็นว่าจำนวน pkts สำหรับกฎ 9 เพิ่มขึ้น 1 (ตามที่เห็นด้านล่าง)
[user @ local ~] $ sudo iptables -nvL - line-numbers .......... Chain FORWARD (นโยบายยอมรับ 0 แพ็กเก็ต 0 ไบต์) num pkts ไบต์เป้าหมาย prot opt เลือกในปลายทางต้นทาง 1 0 0 ยอมรับทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 ctstate ที่เกี่ยวข้องก่อตั้งขึ้น 2 0 0 ยอมรับทั้งหมด - แท้จริง * 0.0.0.0/0 0.0.0.0/0 3 1 60 FORWARD_direct all - * * 0.0.0.0/0 0.0.0.0/0 4 1 60 FORWARD_IN_ZONES_SOURCE ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 5 1 60 FORWARD_IN_ZONES ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 6 1 60 FORWARD_OUT_ZONES_SOURCE ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 7 1 60 FORWARD_OUT_ZONES ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 8 0 0 DROP all - * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID 9 1 60 ปฏิเสธทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 ปฏิเสธด้วย icmp- โฮสต์ห้าม .......... [user @ local ~] $ sudo iptables -D ไปข้างหน้า 9
เมื่อกฎที่ 9 จากห่วงโซ่ FORWARD ถูกลบ (จากด้านบนตามที่แนะนำ @xin) ฉันสามารถเชื่อมต่อกับเว็บเซิร์ฟเวอร์
[user @ local ~] $ sudo iptables -nvL - line-numbers .......... Chain FORWARD (นโยบายยอมรับ 1 แพ็กเก็ต 60 ไบต์) num pkts ไบต์เป้าหมาย prot opt เลือกในปลายทางต้นทาง 1 12 5857 ยอมรับทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 ctstate ที่เกี่ยวข้องก่อตั้งขึ้น 2 0 0 ยอมรับทั้งหมด - แท้จริง * 0.0.0.0/0 0.0.0.0/0 3 2 120 FORWARD_direct all - * * 0.0.0.0/0 0.0.0.0/0 4 2 120 FORWARD_IN_ZONES_SOURCE ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 5 2 120 FORWARD_IN_ZONES ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 6 2 120 FORWARD_OUT_ZONES_SOURCE ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 7 2 120 FORWARD_OUT_ZONES ทั้งหมด - * * 0.0.0.0/0 0.0.0.0/0 8 0 0 DROP all - * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID ..........