พร็อกซี SOCKS แบบโปร่งใสรู้ได้อย่างไรว่า IP ปลายทางใดที่จะใช้


18

มีสองผู้รับมอบฉันทะจากถุงเท้าที่ฉันรู้เกี่ยวกับว่าการสนับสนุนพร็อกซีโปร่งใสสำหรับการเชื่อมต่อใด ๆ TCP ขาออก: Torและredsocks ซึ่งแตกต่างจากพร็อกซี HTTP พร็อกซี SOCKS เหล่านี้สามารถพร็อกซีการเชื่อมต่อ TCP ขาออกใด ๆโปร่งใสรวมถึงโปรโตคอลและโปรโตคอลที่เข้ารหัสโดยไม่มีข้อมูลเมตาหรือส่วนหัว

พร็อกซีทั้งสองนี้ต้องการการใช้ NAT เพื่อเปลี่ยนเส้นทางการรับส่งข้อมูล TCP ใด ๆ ไปยังพอร์ตโลคัลของพร็อกซี ตัวอย่างเช่นถ้าฉันใช้ Tor ด้วยTransPort 9040บนเครื่องของฉันฉันจะต้องเพิ่มกฎ iptables ดังนี้:

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040

ตามความรู้ของฉันสิ่งนี้จะแทนที่ IP ปลายทางเดิมและพอร์ตด้วย127.0.0.1และ9040ดังนั้นเนื่องจากนี่เป็นสตรีมที่เข้ารหัส (เช่น SSH) หรือหนึ่งโดยไม่มีส่วนหัว (เช่นwhois ) พร็อกซีรู้จัก IP ปลายทางและพอร์ตดั้งเดิมอย่างไร

คำตอบ:


28

นี่คือวิธี:

static int getdestaddr_iptables(int fd, const struct sockaddr_in *client, const struct sockaddr_in *bindaddr, struct sockaddr_in *destaddr)
{
        socklen_t socklen = sizeof(*destaddr);
        int error;

        error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
        if (error) {
                log_errno(LOG_WARNING, "getsockopt");
                return -1;
        }
        return 0;
}

iptables เขียนทับที่อยู่ปลายทางเดิม แต่จะจดจำที่อยู่เดิม รหัสแอปพลิเคชันสามารถดึงข้อมูลได้โดยขอตัวเลือกซ็อกเก็ตพิเศษ, SO_ORIGINAL_DST.


1
คำตอบที่ยอดเยี่ยม! ดังนั้นนี่หมายความว่าคุณต้องใช้งานซอฟต์แวร์พร็อกซีในคอมพิวเตอร์เครื่องเดียวกับที่จัดการ NAT อยู่ใช่ไหม
hololeap

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