Score:0

การส่งต่อพอร์ต WireGuard จากลูกค้าในโฮสต์

ธง us

ฉันกำลังพยายามเชื่อมต่อพอร์ตจากไคลเอ็นต์ wireguard กับเครือข่ายโฮสต์ของเซิร์ฟเวอร์

ฉันพยายามทำด้วย IPtables แต่ฉันได้รับคำตอบว่า "ไม่สามารถเข้าถึงได้" เสมอ

ดูเหมือนว่าการกำหนดค่าของฉันอาจเป็นปัญหา?

ขอบคุณ!


ทดสอบการเชื่อมต่อ

root@wiretest3:~# curl -I 10.7.0.2:6060
HTTP/1.1 200 ตกลง
เซิร์ฟเวอร์: nginx/1.20.1
วันที่: อาทิตย์ 18 กรกฎาคม 2564 10:37:38 GMT
ประเภทเนื้อหา: text/html
ความยาวเนื้อหา: 988
Last-Modified: วันเสาร์ที่ 17 กรกฎาคม 2021 10:07:05 GMT
การเชื่อมต่อ: มีชีวิตอยู่
ETag: "60f2abc9-3dc"
ยอมรับช่วง: ไบต์

root@wiretest3:~# ขด -I 192.168.1.180:6060
curl: (28) ไม่สามารถเชื่อมต่อกับพอร์ต 192.168.1.180 6060: การเชื่อมต่อหมดเวลา
root@wiretest3:~# curl -I 127.0.0.1:6060
curl: (7) ไม่สามารถเชื่อมต่อกับพอร์ต 127.0.0.1 6060: การเชื่อมต่อถูกปฏิเสธ

การกำหนดค่าเซิร์ฟเวอร์:

โฮสต์: 192.168.1.183 เครือข่ายไวร์การ์ด: 10.7.0.1

root@wiretest3:~# cat /etc/wireguard/wg0.conf
#ห้ามแก้ไขข้อความในคอมเม้น
# ใช้โดย wireguard-install
# จุดสิ้นสุด wireguard.demo.net

[อินเตอร์เฟซ]
ที่อยู่ = 10.7.0.1/24
คีย์ส่วนตัว = QAOETAJYMK3PcDhN/y+xFJKcJetm4...........
ListenPort = 51823

# ลูกค้า BEGIN_PEER
[เพียร์]
PublicKey = YxM7cwbmBm7VIyNcRdDBhtiEwFWL........
PresharedKey = W9Y0qCku0Fv1uFiMpy5ImStbs+.........
IP ที่อนุญาต = 10.7.0.2/32, 192.168.1.183/32
# ลูกค้า END_PEER

ไอพี

root@wiretest3:~# ip
1: จริง: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN กลุ่มเริ่มต้น qlen 1,000
    ลิงค์ / ย้อนกลับ 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 ขอบเขตโฮสต์เลย
       valid_lft ตลอดไป reserved_lft ตลอดไป
    inet6 ::1/128 ขอบเขตโฮสต์ 
       valid_lft ตลอดไป reserved_lft ตลอดไป
2: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP กลุ่มเริ่มต้น qlen 1000
    ลิงค์/อีเธอร์ 2e:f5:1e:38:32:06 brd ff:ff:ff:ff:ff:ff ลิงค์-netnsid 0
    inet 192.168.1.183/24 brd 192.168.1.255 ขอบเขต global eth0
       valid_lft ตลอดไป reserved_lft ตลอดไป
    inet6 fe80::2cf5:1eff:fe38:3206/64 ลิงค์ขอบเขต 
       valid_lft ตลอดไป reserved_lft ตลอดไป
3: wg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc mq state UNKNOWN กลุ่มเริ่มต้น qlen 500
    ลิงค์/ไม่มี 
    inet 10.7.0.1/24 ขอบเขต global wg0
       valid_lft ตลอดไป reserved_lft ตลอดไป
    inet6 fe80::6613:2cc4:bb7d:6bd4/64 ลิงค์ขอบเขตความเสถียร - ความเป็นส่วนตัว 
       valid_lft ตลอดไป reserved_lft ตลอดไป

กฎ IPtables:

    iptables -P ส่งต่อ DROP;
    iptables -A ไปข้างหน้า -i eth0 -j ยอมรับ;
    iptables -t nat -A PREROUTING -p tcp --dport 6060:6060 -j DNAT --to-destination 10.7.0.2;
    iptables -w -t nat -A POSTROUTING -o eth0 -j MASQUERADE;

IPtables: (บันทึก iptables)

root@wiretest3:~# iptables-save
# สร้างโดย iptables-save v1.8.7 เมื่ออา. 18 ก.ค. 13:17:28 น. 2564
*กรอง
: ยอมรับอินพุต [0:0]
:ทิ้งไปข้างหน้า [0:0]
:เอาต์พุตยอมรับ [0:0]
-อินพุต -p udp -m udp --dport 51823 -j ยอมรับ
-A FORWARD -m state --สถานะที่เกี่ยวข้อง,ESTABLISHED -j ยอมรับ
-A FORWARD -s 10.7.0.0/24 -j ยอมรับ
-A ส่งต่อ -i eth0 -j ยอมรับ
ให้สัญญา
# เสร็จสิ้นเมื่อ อา. 18 ก.ค. 13:17:28 น. 2564
# สร้างโดย iptables-save v1.8.7 เมื่ออา. 18 ก.ค. 13:17:28 น. 2564
*แนท
: ยอมรับ [0:0]
: ยอมรับอินพุต [0:0]
:เอาต์พุตยอมรับ [0:0]
:หลังยอมรับ [0:0]
-A PREROUTING -p tcp -m tcp --dport 6060 -j DNAT --to-ปลายทาง 10.7.0.2
-A Postrouting -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to-แหล่งที่มา 192.168.1.183
-A โพสต์ -o eth0 -j MASQUERADE
ให้สัญญา
# เสร็จสิ้นเมื่อ อา. 18 ก.ค. 13:17:28 น. 2564
รูท@wiretest3:~# 

IPtables: iptables -L -n -t แนท (ตอนนี้)

root@wiretest3:~# sudo iptables -L -n -t แนท
ห่วงโซ่ PREROUTING (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง         
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6060 ถึง:10.7.0.2

เชนอินพุท (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง         

Chain OUTPUT (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง         

ห่วงโซ่โพสต์ (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง         
SNAT ทั้งหมด -- 10.7.0.0/24 !10.7.0.0/24 ถึง:192.168.1.183
สวมหน้ากากทั้งหมด -- 0.0.0.0/0 0.0.0.0/0 

การกำหนดค่าไคลเอนต์:

root@wiredocker:/etc/wireguard# cat /etc/wireguard/wg0.conf
[อินเตอร์เฟซ]
ที่อยู่ = 10.7.0.2/24
DNS = 8.8.8.8, 8.8.4.4
คีย์ส่วนตัว = GAF31cqwu2YSWQPdiSvlWie2Pma.........

[เพียร์]
PublicKey = 3VMnaI8JvoXZ6DthLcDy5MnVmNq..............
PresharedKey = W9Y0qCku0Fv1uFiMpy5ImStbs+...............
AllowedIPs = 0.0.0.0/0, ::/0, 192.168.1.0/24
ปลายทาง = wireguard.demo.net:51823
PersistentKeepalive = 25

ไอพี

root@wiredocker:/etc/wireguard# ip
1: จริง: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN กลุ่มเริ่มต้น qlen 1,000
    ลิงค์ / ย้อนกลับ 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 ขอบเขตโฮสต์เลย
       valid_lft ตลอดไป reserved_lft ตลอดไป
    inet6 ::1/128 ขอบเขตโฮสต์ 
       valid_lft ตลอดไป reserved_lft ตลอดไป
2: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP กลุ่มเริ่มต้น qlen 1000
    ลิงค์/อีเธอร์ 76:d3:5b:64:b4:f0 brd ff:ff:ff:ff:ff:ff ลิงค์-netnsid 0
    inet 192.168.178.178/24 brd 192.168.178.255 ขอบเขต global eth0
       valid_lft ตลอดไป reserved_lft ตลอดไป
    ลิงค์ขอบเขต inet6 fe80::74d3:5bff:fe64:b4f0/64 
       valid_lft ตลอดไป reserved_lft ตลอดไป
4: นักเทียบท่า 0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue สถานะเริ่มต้นของกลุ่ม UP 
    ลิงค์/อีเธอร์ 02:42:bb:9b:28:90 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 ขอบเขต global docker0
       valid_lft ตลอดไป reserved_lft ตลอดไป
    inet6 fe80::42:bbff:fe9b:2890/64 ลิงค์ขอบเขต 
       valid_lft ตลอดไป reserved_lft ตลอดไป
10: veth508c767@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 สถานะกลุ่ม UP เริ่มต้น 
    ลิงค์/อีเธอร์ ea:cd:96:6e:33:0b brd ff:ff:ff:ff:ff:ff link-netnsid 1
    ลิงค์ขอบเขต inet6 fe80::e8cd:96ff:fe6e:330b/64 
       valid_lft ตลอดไป reserved_lft ตลอดไป
15: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN กลุ่มเริ่มต้น qlen 1000
    ลิงค์/ไม่มี 
    inet 10.7.0.2/24 ขอบเขต global wg0
       valid_lft ตลอดไป reserved_lft ตลอดไป
us flag
@MichaelHampton เพิ่มขออภัย
Tom Yan avatar
in flag
ใช้ `iptables-save` เพื่อแบ่งปันกฎของคุณเสมอ
Tom Yan avatar
in flag
ฉันขอแนะนำให้คุณออกจากตาราง 'ตัวกรอง' ในตอนนี้ ให้ `nat` ทำงานตามที่คุณต้องการก่อนดีกว่า
us flag
@TomYan ตอนนี้เพิ่ม iptables-save ตัวกรองตาราง ?
Score:0
ธง in

กลายเป็นว่าทำ ดีเอ็นเอท แบบนั้นสำหรับ 127.0.0.1 ดูเหมือนจะเป็นไปไม่ได้ (อย่างน้อยก็สำหรับกรณีของ เอาต์พุต) อาจเป็นเพราะข้อเท็จจริงที่ว่า 127.0.0.0/8 เป็นของ โฮสต์ขอบเขต หรือเหตุผลที่คล้ายกัน

อย่างไรก็ตามต่อไปนี้ nftable ชุดกฎจะช่วยให้คุณบรรลุสิ่งที่คุณต้องการ:

เขียนตาราง ip ใหม่ {
        ปลดโซ่ {
                พิมพ์ตัวกรองลำดับความสำคัญของเอาต์พุตฮุคเส้นทาง; นโยบายยอมรับ;
                ip daddr 127.0.0.1 tcp dport 80 ip daddr ตั้งค่า 10.7.0.2 ip saddr ตั้งค่า 10.7.0.1
        }

        รีลูปโซ่ {
                ประเภทตัวกรอง hook อินพุตลำดับความสำคัญ 101; นโยบายยอมรับ;
                ip saddr 10.7.0.2 tcp sport 80 ip saddr ตั้งค่า 127.0.0.1 ip daddr ตั้งค่า 127.0.0.1
        }
}
ตาราง ip realnat {
        ปลายทางของห่วงโซ่ {
                พิมพ์ตัวกรองลำดับความสำคัญของเอาต์พุต nat hook; นโยบายยอมรับ;
                ip daddr 192.168.1.183 tcp dport 80 dnat เป็น 10.7.0.2
        }

        แหล่งที่มาของห่วงโซ่ {
                พิมพ์ nat hook ลำดับความสำคัญหลังการกำหนดเส้นทาง srcnat; นโยบายยอมรับ;
                ip daddr 10.7.0.2 tcp dport 80 snat เป็น 10.7.0.1
        }
}

แทนที่จะทำ NAT ปลายทางที่ "เหมาะสม" คุณต้องทำการเรียงลำดับของที่อยู่ปลายทาง (และต้นทาง) ที่ "ไม่ได้ติดตาม" แทน ด้วยความช่วยเหลือของก เส้นทางประเภท chain การค้นหาเส้นทางใหม่จะดำเนินการ นอกจากนี้ คุณจะต้องทำให้การเข้าชมตอบกลับมีแหล่งที่มา และ ที่อยู่ปลายทางเปลี่ยนกลับเป็น 127.0.0.1 ดังนั้น ขด สามารถรับรู้การจราจร

กับ อินพุตเบ็ด, มัน ควร (เช่น ไม่ได้ทดสอบ) หลีกเลี่ยงการเขียนซ้ำที่ไม่ต้องการสำหรับทราฟฟิกที่ไม่ใช่สำหรับโฮสต์เอง (เช่น การตอบกลับทราฟฟิกสำหรับทราฟฟิกที่ส่งต่อ) ในทางกลับกัน, ลำดับความสำคัญ 101 (เช่น. 1 ใหญ่กว่า srcnat / ลำดับความสำคัญมาตรฐานทั้งหมด) จะหลีกเลี่ยงการเขียนซ้ำที่ไม่ต้องการในการตอบกลับที่ตอบสนองต่อคำขอที่ได้รับ NAT อย่างถูกต้อง

อย่างที่คุณเห็นสำหรับ 192.168.1.183 กรณี ตารางอื่นที่ทำ NAT ปกติตามหลังตารางสำหรับ 127.0.0.1 กรณีพิเศษ.

โปรดทราบว่าชุดกฎนี้มีไว้สำหรับ ขดจากภายในคอนเทนเนอร์ (หรืออย่างมากที่สุดคือโฮสต์ ฉันไม่คุ้นเคยกับคอนเทนเนอร์ และเท่าที่ฉันรู้ อาจมีแนวทางเครือข่ายที่แตกต่างกันสำหรับคอนเทนเนอร์เหล่านี้) หากคุณต้องการให้คอนเทนเนอร์ส่งต่อไปยังโฮสต์อื่น 192.168.1.0/24คุณจะต้องเพิ่มเติมเช่นเดียวกัน แนท ปกครองเป็นลูกโซ่ พิมพ์ nat hook กำหนดลำดับความสำคัญก่อนกำหนด dstnat. การส่งต่อ IP จะต้องเปิดใช้งานและอนุญาตเช่นกัน และอย่างที่ฉันพูด ฉันไม่แน่ใจว่าเทคนิคการเขียนซ้ำข้างต้นสำหรับ 127.0.0.1 จะขัดแย้งกับสิ่งนั้น

us flag
iptables-restore-translate -f rule.txt ให้ฉัน "iptables-translate-restore: บรรทัดที่ 1 ล้มเหลว"
Tom Yan avatar
in flag
`nft -f กฎ.txt`
us flag
ทำงานได้ดี !! ฉันจะใช้สิ่งนี้กับพอร์ตเพิ่มเติมได้อย่างไร ตัวอย่าง 80,6060,6061,6062 ฉันต้องทำกฎนี้ต่อพอร์ตหรือฉันสามารถทำหลายพอร์ตได้หรือไม่
us flag
เมื่อฉันพยายามโทร 192.168.1.183:6060 จากพีซีเครื่องอื่นในเครือข่ายเดียวกันที่ไม่สามารถเข้าถึงได้อีกครั้ง :/
Tom Yan avatar
in flag
โปรดอ่านคำตอบอย่างละเอียด ฉันได้กล่าวถึงสิ่งที่ต้องทำเพิ่มเติมสำหรับกรณีนั้นแล้ว ปรับ/ขยายชุดกฎสำหรับความต้องการเพิ่มเติม โปรดทราบว่าเชนไม่สามารถมีชื่อเดียวกันในตารางเดียวกันได้ นอกจากนี้ ก่อนที่คุณจะอ่านไฟล์ชุดกฎใหม่ที่มี "nft -f" ให้เรียกใช้ "ชุดกฎ nft flush" เพื่อล้างชุดกฎเก่า คุณสามารถสร้างกฎเพื่อใช้กับพอร์ตเพิ่มเติมได้เช่นกัน IIRC คุณสามารถใช้บางอย่างเช่น `{80, 6060-6062}` ลองหา/อ่านเอกสารประกอบของ nftables อ่านผ่าน `man nft` น่าจะช่วยได้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา