Trả lời trên cùng một giao diện như đến?


51

Tôi có một hệ thống với hai giao diện. Cả hai giao diện được kết nối với internet. Một trong số chúng được đặt làm tuyến đường mặc định; Một tác dụng phụ của việc này là nếu một gói tin xuất hiện trên giao diện tuyến không mặc định, phản hồi sẽ được gửi lại qua giao diện tuyến mặc định. Có cách nào để sử dụng iptables (hoặc một cái gì đó khác) để theo dõi kết nối và gửi trả lời qua giao diện mà nó xuất phát không?

Câu trả lời:


61
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

Ở trên không yêu cầu bất kỳ gói đánh dấu với ipfilter. Nó hoạt động vì các gói đi (trả lời) sẽ có địa chỉ IP ban đầu được sử dụng để kết nối với giao diện thứ 2 dưới dạng địa chỉ nguồn (từ) trên gói gửi đi.


7
Wow, đây chính xác là những gì tôi đang tìm kiếm. Trong trường hợp bất cứ ai đang tìm kiếm, đối với các bản phân phối dựa trên RH, bạn có thể đặt các quy tắc và lệnh tuyến có liên quan trong các tệp có tên 'rule-eth0' hoặc 'route-eth0' (ví dụ) sẽ được thêm hoặc xóa trên ifup / ifdown. Đặt các tệp này cùng với tệp ifcfg-eth0. Đối với IPv6, có chức năng 'route6-eth0' được tích hợp, nhưng không có 'rule6-eth0' được tích hợp (chưa).
Kyle Brantley

18
Đối với tôi nó chỉ hoạt động khi tôi rời khỏi devparam trong ip rulelệnh, vì vậy chạyip rule add from <interface_IP> table isp2
cdauth

2
Bạn có thể làm cho chúng được tạo khi giao diện tăng lên bằng cách thêm up ip rule add from <interface_IP> table isp2up ip route add default via <gateway_IP> dev ppp0 table isp2vào / etc / mạng / giao diện của bạn dưới giao diện có liên quan.
g.rocket

4
Tôi đã gỡ bỏ dev <interface>từ ip ruleđể làm cho nó làm việc trên hộp của tôi. Nếu tôi hiểu đúng, dev <interface>đã lọc ra các gói được đặt trên giao diện sai cần phải được chuyển sang giao diện chính xác theo tuyến bị ghi đè nhưng việc lọc quy tắc theo giao diện đã ngăn điều đó xảy ra.
biley

2
Giống như hầu hết những người khác, tôi đã phải loại bỏ dev <interface>khỏi ip rulelệnh để làm việc này. Hãy cập nhật câu trả lời! Ngoại trừ chi tiết đó, nó hoạt động như một lá bùa. Cảm ơn rất nhiều, @Peter!
MoonSweep

6

Các lệnh sau tạo một bảng định tuyến thay thế thông qua eth1cho các gói có dấu 1 (ngoại trừ các gói đến localhost). Các iplệnh là từ iproute2 suite (Ubuntu: iproute Install iproute http://bit.ly/software-small , iproute-doc Cài đặt iproute-doc http://bit.ly/software-small ).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

Nửa còn lại của công việc là nhận ra các gói phải lấy dấu 1; sau đó sử dụng iptables -t mangle -A OUTPUT … -j MARK --set-mark 1các gói này để chuyển chúng qua bảng định tuyến 1. Tôi nghĩ rằng những điều sau đây nên làm (thay thế 1.2.3.4 bằng địa chỉ của giao diện không định tuyến mặc định):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

Tôi không chắc là đủ chưa, có thể cần một quy tắc khác trên các gói đến để báo cho mô-đun conntrack theo dõi chúng.


Đẹp. Tôi quên tất cả về việc đánh dấu. Điều đó sẽ đưa tôi đến đó.
Shawn J. Goff

5

Tôi gặp vấn đề với các gói được tạo cục bộ với giải pháp được đề xuất bởi Peter, tôi đã thấy rằng các điều sau đây sửa:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

LƯU Ý: Bạn có thể gặp phải các vấn đề cú pháp với dòng thứ 4 ở trên. Trong các trường hợp như vậy, cú pháp cho lệnh thứ 4 có thể là ngay bây giờ:

ip rule add iif <interface> table isp2 priority 1000

Đã thử rất nhiều nhưng không có gì làm việc theo kịch bản của tôi, ngoại trừ điều này .. cảm ơn rất nhiều.
agaggi

3

Tôi giả sử bạn đang chạy Linux và hơn nữa, bạn đang sử dụng bản phân phối dựa trên RedHat / CentOS. Các bản phân phối và Unix khác sẽ yêu cầu các bước tương tự - nhưng các chi tiết sẽ khác nhau.


Bắt đầu bằng cách kiểm tra (lưu ý rằng điều này rất giống với câu trả lời của @ Peter. Tôi giả sử như sau:

  • eno0 là isp0 và có cổng mặc định tổng thể
  • eno1 là isp1 và có IP / phạm vi 192.168.1.2/24 với cổng 192.168.1.1

Các lệnh như sau:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

Tường lửa không liên quan đến bất kỳ cách nào. Trả lời các gói sẽ luôn được gửi từ IP chính xác - nhưng trước đó đã được gửi qua giao diện sai. Bây giờ các gói từ IP chính xác sẽ được gửi qua giao diện chính xác.


Giả sử các công việc trên, bây giờ bạn có thể làm cho quy tắc và lộ trình thay đổi vĩnh viễn. Điều này phụ thuộc vào phiên bản Unix bạn đang sử dụng. Như trước đây, tôi đang giả sử một bản phân phối Linux dựa trên RH / CentOS.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Kiểm tra sự thay đổi mạng là vĩnh viễn:

$ ifdown eno1 ; ifup eno1

Nếu điều đó không hiệu quả, trên các phiên bản sau của RH / CentOS, bạn cũng cần thực hiện với một trong hai tùy chọn:

  • Không sử dụng NetworkManager.service mặc định ; Sử dụng mạng.service thay thế. Tôi đã không khám phá các bước chính xác cần thiết cho việc này. Tôi sẽ tưởng tượng nó liên quan đến các lệnh chkconfig hoặc systemctl tiêu chuẩn để bật / tắt dịch vụ.
  • Cài đặt gói NetworkManager-distatcher-định tuyến-quy tắc

Cá nhân tôi thích cài đặt gói quy tắc hơn vì đây là cách tiếp cận được hỗ trợ đơn giản hơn:

$ yum install NetworkManager-dispatcher-routing-rules

Một khuyến nghị mạnh mẽ khác là cho phép lọc arp vì điều này ngăn chặn các vấn đề liên quan khác với cấu hình mạng kép. Với RH / CentOS, hãy thêm nội dung sau vào tệp /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
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.