Thay đổi tuyến mặc định mà không ảnh hưởng đến các kết nối TCP hiện có


3

Giả sử tôi có hai địa chỉ mạng công cộng trên máy chủ của mình: một NAT thông qua ISP (192.168.99.0/24) và VPN thông qua một ISP khác (192.168.1.0/24), đã được định cấu hình với tuyến đường theo máy chủ đến Máy chủ VPN thông qua ISP của tôi.

Đây là bảng định tuyến ban đầu của tôi. Tôi hiện đang định tuyến qua ISP của mình trên mạng con 192.168.99.0/24.

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.99.1    0.0.0.0         UG    0      0        0 eth1
55.66.77.88     192.168.99.1    255.255.255.255 UGH   0      0        0 eth1
192.168.99.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 tap0

Bây giờ, tôi muốn các kết nối TCP mới chuyển sang 192.168.1.0/24 của mình vì vậy tôi gõ như sau:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Khi tôi làm điều này, nó khiến một số kết nối TCP lâu đời bị treo. Có cách nào để tôi thay đổi giao diện mặc định một cách an toàn cho các kết nối mới, đồng thời cho phép các kết nối TCP hiện tại sử dụng tuyến cũ (nghĩa là tôi cần kích hoạt một số loại bảng định tuyến trạng thái)?

Tôi ổn với một giải pháp chỉ hoạt động với các kết nối TCP đã được thiết lập và tôi không quan tâm đến việc hack nó như thế nào. Ví dụ: nếu có một cách để thêm các quy tắc iptables tạm thời cho các kết nối hiện có để buộc chúng trên tuyến đường cũ. Nhưng phải có một số cách để làm điều này.

EDIT: Chỉ là một lưu ý về một "lộ trình thêm -host ..." đơn giản cho các kết nối hiện có: giải pháp này sẽ hoạt động nếu tôi ổn với việc để lại một tập hợp IP trên giao diện cũ. Tuy nhiên, trong ứng dụng của tôi, điều này thực sự không giải quyết được vấn đề của tôi vì tôi muốn cho phép các kết nối mới xuất hiện trên giao diện mới ngay cả khi chúng có cùng IP nguồn. Bây giờ tôi đang xem xét sử dụng lệnh "ip route" để đặt quy tắc định tuyến dựa trên nguồn.


Bạn thực sự nên sửa nó một cách chính xác mãi mãi và sử dụng định tuyến (chính sách) dựa trên nguồn.
David Schwartz

@DavidSchwartz Thật tuyệt! Đây chính xác là loại câu trả lời tôi đang tìm kiếm. Tôi thực sự thậm chí không biết rằng có một khái niệm như vậy tồn tại: Quả thực tôi nên nhìn vào "tuyến đường ip" chứ không phải là "tuyến đường" cũ đơn giản - tôi hoàn toàn quên mất điều này. Nếu bạn trả lời chính thức cho câu hỏi bằng cách kích hoạt định tuyến dựa trên nguồn hoặc cụ thể hơn về các loại lệnh ip có thể tạo các bảng định tuyến dựa trên nguồn đơn giản, tôi rất vui lòng chấp nhận câu trả lời.
Patrick Horn

Câu trả lời:


1

Lệnh sau sẽ kiểm tra các kết nối tcp mở và liệt kê các đích bên ngoài mạng cục bộ:

$ netstat -4ntu | tail -n +3 | cut -c45-65 | cut -d: -f1 | grep -v '192.168.99' | grep -v '192.168.1'
214.236.220.101
63.171.235.16
174.63.61.132
159.47.216.178
62.59.197.29
139.47.218.150
56.4.17.22
204.63.49.5
155.9.79.196
144.31.207.66

Vì vậy, chúng ta chỉ cần lặp qua danh sách này và đặt các tuyến cụ thể về bộ định tuyến chính trước khi thay đổi tuyến mặc định:

for i in $(netstat -4nt | tail -n +3 | cut -c45-65 | cut -d: -f1 |grep -v '192\.168\.99' | grep -v '192\.168\.1') ; do echo route add -host $i gw 192.168.1.99; done

(Tôi đã để lại lệnh "echo" trong đó để bạn có thể thấy những gì nó làm, bạn có thể loại bỏ điều này khi bạn thực sự muốn làm điều đó.

Sau đó thay đổi tuyến đường mặc định của bạn:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Bởi vì các tuyến đường được thêm vào cụ thể hơn, chúng sẽ được ưu tiên cho tuyến đường mặc định. Rõ ràng bạn có thể đặt điều này trong một kịch bản để làm cho nó dễ dàng hơn.


Giải pháp bảng định tuyến sẽ hoạt động nếu tôi ổn với việc để lại một tập hợp con IP trên giao diện cũ. Tuy nhiên, trong ứng dụng của tôi, điều này thực sự không giải quyết được vấn đề của tôi vì tôi muốn cho phép các kết nối mới xuất hiện trên giao diện mới ngay cả khi chúng có cùng nguồn IP. Ngoài ra, tôi đã hỏi câu hỏi này một phần vì tôi hy vọng khả năng này của một cách tiếp cận ít thô thiển hơn.
Patrick Horn

@PatrickHorn Rất đáng để chỉnh sửa câu hỏi của bạn để làm rõ điều này, vì những người khác đang tìm kiếm sự giúp đỡ có thể không tìm thấy bình luận này
Paul
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.