จะสร้าง / ติดตั้ง vpn โดยใช้ SSH ได้อย่างไร


9

นี่คือปัญหาที่ฉันพยายามแก้ไข มีเซิร์ฟเวอร์ ("ระบบระยะไกล") ที่ฉันสามารถ 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
..........

คำตอบ:


4

ที่อยู่ต้นทางของแพ็กเก็ตควรถูกแทนที่ด้วยที่อยู่ของเครื่องหนึ่งเครื่องเพื่อให้สามารถรับคำตอบจากเครื่องภายในได้มิฉะนั้นไม่มีเหตุผล (ดี) สำหรับการส่งแพ็กเก็ตเหล่านี้ไปยังเราเตอร์ถัดไปไม่สามารถหาคำตอบได้ iptables MASQUERADEและSNATมีประโยชน์ในการเปลี่ยนแหล่งที่อยู่ของแพ็กเก็ตเหล่านี้:

[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0

ขอบคุณสำหรับการตอบสนอง @xin ฉันรันคำสั่งที่คุณให้ แต่ฉันก็ยังได้รับการตอบกลับเหมือนเดิม ฉันรัน tcpdump บน eth0 และ tun0 แพ็กเก็ตไม่ถูกส่งไปที่ eth0 tun0 ยังคงพยายามติดต่อกับ google ฉันจำเป็นต้องกำหนดเส้นทางแพ็กเก็ตจาก tun0 เป็น eth0 หรือไม่
อาลี

1
หากเครื่องโลคัลใช้อินเตอร์เฟส eth0 เพื่อเชื่อมต่ออินเทอร์เน็ตแพ็กเก็ตควรไปที่ eth0 แม้ไม่มีคำสั่งนี้ ดังนั้นอาจมีการตั้งค่าไฟร์วอลล์บางอย่างที่เกี่ยวข้อง คุณสามารถนำiptables-saveเอาท์พุทของเครื่องจักรท้องถิ่นได้หรือไม่?
reith

ฉันได้เพิ่มเอาท์พุทของ iptables- บันทึกลงในโพสต์ต้นฉบับ
อาลี

จำเป็นต้องปิดไฟร์วอลล์ ฉันรันคำสั่งของคุณหลังจากปิดไฟร์วอลล์และการเชื่อมต่อเริ่มทำงาน! ขอบคุณที่คุณช่วย! ชำระเงินหมายเหตุในโพสต์ต้นฉบับเพื่อดูความคืบหน้า
อาลี

1
งานที่ดี -A FORWARD -j REJECT --reject-with icmp-host-prohibitedดูเหมือนปัญหาคือกฎ iptable แพ็คเก็ตที่เข้ามาในเครื่องของคุณและมีที่อยู่ปลายทางออกจากเครื่องของคุณจะไปยังเครือข่าย FORWARD ดังนั้นให้วางกฎนี้
reith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.