Làm thế nào để một proxy SOCKS trong suốt biết sử dụng IP đích nào?


18

Có hai proxy SOCKS mà tôi biết về việc hỗ trợ ủy quyền minh bạch cho bất kỳ kết nối TCP gửi đi nào: Torredsocks . Không giống như các proxy HTTP, các proxy SOCKS này có thể ủy quyền trong suốt mọi kết nối TCP gửi đi, bao gồm các giao thức và giao thức được mã hóa mà không cần siêu dữ liệu hoặc tiêu đề.

Cả hai proxy này đều yêu cầu sử dụng NAT để chuyển hướng bất kỳ lưu lượng TCP gửi đi nào đến cổng cục bộ của proxy. Chẳng hạn, nếu tôi đang chạy Tor với TransPort 9040máy cục bộ của mình, tôi sẽ cần thêm quy tắc iptables như thế này:

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

Theo hiểu biết của tôi, điều này sẽ thay thế IP và cổng đích ban đầu bằng 127.0.0.19040, do đó đây là một luồng được mã hóa (như SSH) hoặc một luồng không có tiêu đề (như whois ), làm thế nào để proxy biết IP và cổng đích ban đầu?

Câu trả lời:


28

Đây là cách nó thực hiện:

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 ghi đè địa chỉ đích ban đầu nhưng nó nhớ địa chỉ cũ. Mã ứng dụng sau đó có thể tìm nạp nó bằng cách yêu cầu một tùy chọn ổ cắm đặc biệt , SO_ORIGINAL_DST.


1
Câu trả lời tuyệt vời! Vì vậy, điều này có nghĩa là bạn phải chạy phần mềm proxy trên cùng một máy tính đang xử lý NAT, phải không?
hololeap

4
Tuyệt đối, @hololeap. Nếu máy chủ proxy chạy trên một hệ thống khác như bộ chuyển hướng gói thì bạn cần các giao thức như WCCP của Cisco .
Celada
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.