Hướng dẫn chuyển hướng gói tin Socket
Thực tế, trong nhiều trường hợp bạn cần chuyển tiếp gói tin nhận được từ kết nối này sang kết nối khác, sau đó gói tin phản hồi sẽ được gửi trả lại cho kết nối ban đầu.
Bạn có thể sử dụng tiện ích ConnectionRelay mà tôi đã giới thiệu trong bài: ConnectionRelay: Công cụ hữu ích giúp chuyển tiếp gói tin qua Socket
Ở đây tôi giới thiệu với các bạn cách đơn giản và tiện lợi hơn là sử dụng các tiện ích sẵn có của Hệ điều hành. Trong trường hợp này bạn cần phải có quyền Admin hay quyền Root thì mới thực hiện được, trong khi với ConnectionRelay bạn chỉ cần quyền User cũng thực hiện được.
Contents
Trên Windows
Bạn sử dụng lệnh netsh để forward kết nối theo cú pháp
netsh interface portproxy add v4tov4 listenport=<local_port> connectport=<remote_port> connectaddress=<remote_address>
Ví dụ sau sẽ nhận gói tin ở port 8888 và forward tới server 210.245.13.222 ở port 465:
netsh interface portproxy add v4tov4 listenport=8888 connectport=465 connectaddress=210.245.13.222
Trên Ubuntu
Theo thứ tự bạn thực hiện lệnh sau:
- B1: Bật chế độ forward
sudo sysctl net.ipv4.ip_forward=1 - B2: Cấu hình forward
sudo iptables -t nat -A PREROUTING -p tcp --dport <local_port> -j DNAT --to-destination <remote_address>:<remote_port>
Ví dụ sau sẽ nhận gói tin ở port 8888 và forward tới server 210.245.13.222 ở port 465:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 210.245.13.222:465
Ngoài ra bạn dùng tham số -s để xác định chỉ client nào được kết nối đến. Ví dụ:
sudo iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp --dport 8888 -j DNAT --to-destination 210.245.13.222:465
sudo iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 8888 -j DNAT --to-destination 210.245.13.222:465 - B3: Yêu cầu iptables thực hiện rule forward trên:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
Ghi chú: Lệnh này trên Ubuntu chỉ có tác dụng forward kết nối từ client khác tới chứ không forward kết nối chính từ máy này. Giả sử máy 192.168.1.8 nhận kết nối tới port 8888 và forward tới server khác, nếu trên chính máy 192.168.1.8 bạn kiểm tra bằng lệnh sau sẽ lỗi:
telnet localhost 8888
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Hoặc
telnet 192.168.1.8 8888
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Nhưng trên máy khác bạn thực hiện lệnh sau thì okie:
telnet 192.168.1.8 8888
220 ITHN-EXCH-05.test.com Microsoft ESMTP MAIL Service ready at Fri, 25 Aug 2017 00:56:41 +0700
Ghi chú: Một số trường hợp không thành công có thể do máy bị chặn port tương ứng. Trường hợp này nên check lại Firewall hoặc cấu hình các chương trình Anti-Virus.