ส่งต่อไปยังไคลเอนต์ VPN หรือไม่


21

ฉันพบกับปริศนานิดหน่อยและไม่เคยโชคดีในการหาทางออก ตอนนี้ฉัน (เศร้า) เชื่อมต่อกับเน็ตผ่าน Verizon 3G พวกเขากรองทราฟฟิกที่เข้ามาทั้งหมดดังนั้นจึงเป็นไปไม่ได้ที่ฉันจะเปิดพอร์ตเพื่อยอมรับการเชื่อมต่อ

ขณะนี้ฉันมีเครื่องเสมือนของ Linux ที่ linode.com และความคิดนั้นทำให้ฉันติดตั้งpptpdและพยายามทำการiptablesส่งต่อพอร์ต ฉันได้pptpdติดตั้งและเครื่องที่บ้านของฉันเชื่อมต่ออย่างมีความสุข ที่กล่าวว่าต่อไปนี้เป็นข้อมูลทั่วไป:

เซิร์ฟเวอร์ (Debian) WAN IP: xxxx บน eth0 - pptpd IP: yyy1 บน ppp0 - IP VPN ของไคลเอ็นต์: yyy100

ในการตรวจสอบว่าฉันไม่ได้บ้าฉันพยายามเชื่อมต่อจากเซิร์ฟเวอร์ไปยังพอร์ตที่เปิดอยู่บนไคลเอนต์และลูกค้ายอมรับการเชื่อมต่อผ่าน VPN IP

สิ่งที่ฉันต้องการทำให้สำเร็จคือ:

อินเทอร์เน็ต -> WAN IP: พอร์ต -> ส่งต่อไปยังไคลเอ็นต์ VPN IP: พอร์ต

ตัวอย่างเช่นถ้าฉันเปิดพอร์ต 6,000 บนไคลเอ็นต์ของฉันบุคคลหนึ่งสามารถโทรไปที่ xxxx: 6000 และเซิร์ฟเวอร์จะตรวจจับสิ่งนั้นและส่งต่อไปที่ 192.168.3.100:6000

ฉันได้ลอง Googled up iptablesconfigs อย่างน้อย 20 ตัวแล้วแต่ยังไม่มีใครทำงาน ไม่มีใครมีความคิดใด ๆ หรืออาจเป็นแนวทางที่แตกต่างอย่างสิ้นเชิงที่ฉันอาจไม่ทราบ เป้าหมายที่นี่คือการฟังผ่านการเชื่อมต่อไฟร์วอลล์อย่างน่ากลัวโดยเฉพาะอย่างยิ่งการรับส่งข้อมูล TCP และ UDP

คำตอบ:


25

คุณต้องทำสามสิ่งในเซิร์ฟเวอร์ VPN (Linode) ของคุณเพื่อให้งานนี้:

  1. คุณต้องเปิดใช้งานการส่งต่อ IP:

    sysctl -w net.ipv4.ip_forward=1
    
  2. ตั้งค่า NAT ปลายทาง (DNAT) เพื่อส่งต่อพอร์ต คุณอาจจะรู้เรื่องนี้อยู่แล้วเพราะมันเป็นสิ่งที่ส่งต่อพอร์ตมาตรฐาน แต่เพื่อความสมบูรณ์:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. ตั้งค่า NAT (SNAT) ต้นทางเพื่อให้จากมุมมองของไคลเอนต์ VPN การเชื่อมต่อนั้นมาจากเซิร์ฟเวอร์ VPN:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

เหตุผลที่คุณต้องการ SNAT ก็เพราะว่ามิฉะนั้นไคลเอนต์ VPN ของคุณจะส่งแพ็กเก็ตส่งคืนไปยังโฮสต์ที่เริ่มต้นการเชื่อมต่อ (zzzz) ผ่านเกตเวย์เริ่มต้น (เช่น Verizon 3G) และไม่ใช่ผ่าน VPN ดังนั้นที่อยู่ IP ต้นทางบนแพ็กเก็ตที่ส่งคืนจะเป็นที่อยู่ Verizon 3G ของคุณและไม่ใช่ xxxx ซึ่งทำให้เกิดปัญหาทุกประเภทเนื่องจาก zzzz เริ่มต้นการเชื่อมต่อกับ xxxx จริงๆ

ในการตั้งค่าการส่งต่อพอร์ตส่วนใหญ่ SNAT ไม่จำเป็นเนื่องจากโฮสต์ที่ทำการส่งต่อพอร์ตเป็นเกตเวย์เริ่มต้นสำหรับโฮสต์ปลายทาง (เช่นเราเตอร์ที่บ้าน)

นอกจากนี้โปรดทราบว่าหากคุณต้องการส่งต่อพอร์ต 6000 ไปยังพอร์ตอื่น (กล่าวคือ 7000) กฎ SNAT ควรตรงกันใน 7000 ไม่ใช่ 6000


สวัสดี AGWA ขอบคุณสำหรับการตอบกลับ ฉันมี ip_forwarding อยู่แล้วและกฎของคุณก็ทำงานได้อย่างสมบูรณ์แบบแม้ว่าจะไม่ใช่ครั้งแรก ปัญหาคือ (ใน iptables noobness ของฉัน) ที่ฉันไม่ได้ตระหนักถึง iptables - F ไม่ได้ล้างรายการ nat และ iptables - L ไม่ได้แสดงรายการพวกเขา หลังจากหาวิธีการจัดรายการอย่างถูกต้องฉันสังเกตเห็นหลายรายการที่ขัดแย้งกันจากพยายามก่อน หลังจากล้างและลองใช้กฎของคุณแล้วจะทำงานได้อย่างสมบูรณ์แบบ ในคำถามของคุณคุณระบุ tcp จะเปลี่ยนสิ่งนี้เป็น "all" สำหรับทั้งทราฟฟิก TCP / UDP หรือไม่
Vile Brigandier

ยินดีต้อนรับคุณ! (โดยวิธีการที่ฉันต้องการใช้iptables-saveเพื่อแสดงกฎ iptables ของฉัน - ในขณะที่การส่งออกไม่ได้มีไว้สำหรับการบริโภคของมนุษย์ก็ยังคงสามารถอ่านและการแสดงทั้งหมด . กฎ iptables ของคุณ) ไม่มีโชคไม่ดีที่คุณไม่สามารถใช้ "ทุกคน" ที่นั่นเพราะ--dportเพียง ทำงานร่วมกับโปรโตคอลที่มีพอร์ตจริง ๆ ("ทั้งหมด" รวมถึงเช่น ICMP ซึ่งไม่มีแนวคิดของพอร์ต) คุณจะต้องแยกกฎสำหรับ TCP และ UDP
AGWA

ขอบคุณสำหรับเคล็ดลับการบันทึก iptables ทุกอย่างทำงานตามที่คาดไว้สำหรับทั้ง TCP และ UDP ไชโย
Vile Brigandier

2
เพียงอัปเดตสำหรับคำตอบนี้ก็คือด้วย iproute2 คุณสามารถตั้งค่าไคลเอนต์ VPN ของคุณให้มี 2 เกตเวย์และกำหนดเส้นทางปริมาณการใช้งาน DNAT ย้อนกลับผ่าน VPN สิ่งนี้มีประโยชน์หากคุณไม่ต้องการใช้ SNAT และมีทราฟฟิกทั้งหมดมาจากเซิร์ฟเวอร์ vpn thomas-krenn.com/th/wiki/Two_Default_Gateways_on_One_Systemมีข้อมูลเกี่ยวกับวิธีตั้งค่านี้
PressingOnAlways

ใช้งานได้สำหรับฉันตราบใดที่ ufw ถูกปิดใช้งานแม้ว่าฉันจะอนุญาต 8080 ใน ufw แต่ทันทีที่ฉันเปิดใช้ ufw สิ่งที่ส่งต่อนี้ไม่ทำงาน .. ความคิดใด ๆ
Sudhir N

3

ฉันมีปัญหานี้และพยายามแก้ไขเป็นเวลาหลายชั่วโมง .. นี่เป็นวิธีแก้ปัญหาของฉัน:

  • ผมมีมากกว่าหนึ่งด้วยเหมือนกันVPNClient IPAddressดังนั้นฉันจึงให้พวกเขาแต่ละคงที่IPAddress

กำหนดไดเรกทอรีที่ควรเก็บสคริปต์ไคลเอนต์เช่น / etc / openvpn / staticclients และสร้างไดเรกทอรี

mkdir /etc/openvpn/staticclients

เพิ่มไดเรกทอรีนี้เป็นตัวเลือกในการกำหนดค่า openvpn ของคุณที่เซิร์ฟเวอร์:

client-config-dir /etc/openvpn/staticclients

สำหรับลูกค้าแต่ละรายคุณต้องสร้างไฟล์ ชื่อไฟล์จะต้องตรงกับcommon nameแอตทริบิวต์ที่ระบุไว้ในใบรับรองของลูกค้า คำสั่งนี้รับ CN จากใบรับรองคอมพิวเตอร์:

ตัวอย่างนี้ส่งIPAddress10.1.134.110/10.1.134.109 ไปยังไคลเอ็นต์ด้วยcommon name TESTCLIENTและยังส่งเส้นทางเพิ่มเติมสำหรับ subnet 10.1.135.0

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
  • http://www.yougetsignal.com/tools/open-ports/และhttp://canyouseeme.org/ตรวจพบพอร์ตไม่ถูกต้อง ฉันต้องเริ่มต้นแอปพลิเคชันของฉันเพิ่มเติมบนไคลเอนต์ว่าเว็บไซต์สามารถดูพอร์ตเหล่านี้ได้

  • ไม่จำเป็นต้องมีSNATกฎเพิ่มเติม จำเป็นต้องใช้กฎเหล่านี้เท่านั้น:

sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110

2

เซิร์ฟเวอร์ส่วนใหญ่ปิดใช้งานการส่งต่อ ip ในการกำหนดค่าเริ่มต้น คุณต้องเปิดใช้งานหากคุณต้องการเปลี่ยนเส้นทางการเชื่อมต่อขาเข้าผ่าน VPN ของคุณ

ลองสิ่งนี้:

sysctl -w net.ipv4.ip_forward = 1

ฉันหมายถึงนอกเหนือจากการกำหนดค่า iptables


0

สิ่งที่คุณต้องการบรรลุคืออาจเป็นไปได้อย่างมากกับpptpdหรือ OpenVPN และ iptables อย่างไรก็ตามคุณอาจพบว่าผู้สมัครที่ดีกว่าสำหรับกรณีการใช้งานนี้ ฉันเพิ่งอ่านสิ่งนี้ซึ่งอธิบายวิธีการตั้งค่า tinc สำหรับกรณีการใช้งานนี้อย่างแน่นอน มันเป็นทางเลือก (อาจง่ายกว่า) กับส่วนpptdpหรือ OpenVPN จากนั้นคุณต้องมีกฎเดียวกันกับ iptables

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.