Chỉ cho phép lưu lượng truy cập đi nhất định trên các giao diện nhất định


15

Tôi có một vấn đề khá kỳ lạ. Tôi có một máy chủ với hai giao diện mạng eth0eth1. Mỗi cái được kết nối với một mạng khác nhau. Mỗi mạng có một cổng internet. Máy chủ có các kết nối ngoài khác nhau : http (một số tập lệnh trên các trang web cạo máy chủ), máy khách nfs, máy khách samba, máy khách dns và trình tải email để đặt tên nhưng một số ít.

Vì lý do tôi sẽ không tham gia, tôi cần phải phân chia các khách hàng bên ngoài này để lưu lượng truy cập http, nfs, samba và dns bên ngoài chỉ được yêu cầu trong eth0khi mọi thứ khác đi qua eth1.

Tôi đã đọc xung quanh một vài tìm kiếm của Google và có vẻ như đó iptableslà những gì tôi cần nhưng tôi thực sự không có manh mối. Tôi chỉ được sử dụng để quản lý các quy tắc tường lửa gửi đến ufw.

Ai đó có thể giúp tôi bắt đầu với một vài quy tắc ví dụ và cho tôi biết làm thế nào để hệ thống chấp nhận các quy tắc này khi khởi động không? Lý tưởng nhất là không khóa tôi khỏi kết nối SSH của tôi (tôi có thể có quyền truy cập vật lý, nhưng tôi không muốn).

Chỉnh sửa Tôi có thể chia khách hàng thành hai người dùng nếu có thể giới hạn tất cả lưu lượng truy cập đi từ một tài khoản sang một giao diện. trên giấy có vẻ như nó có thể dễ dàng hơn

Câu trả lời:


12

Tôi sẽ thiết lập một bảng định tuyến riêng và chính sách định tuyến các gói được đánh dấu bằng bảng đó và có iptables / netfilter đánh dấu các gói nhất định.

Tạo một bảng: echo 1 known >> /etc/iproute2/rt_tables

Tạo quy tắc định tuyến ( iplệnh là từ iproute2 ): ip rule add from all fwmark 1 table known

Chúng tôi đã tạo một bảng có tên là "đã biết" và tạo một quy tắc định tuyến cho biết bất kỳ gói nào có dấu bằng 1 được định tuyến theo bảng "đã biết". Tôi chỉ gọi nó được biết đến vì nó cho danh sách các giao thức đã biết - bạn có thể đặt tên cho nó bất cứ điều gì bạn muốn. Bây giờ chúng ta thiết lập bảng đã biết để định tuyến đúng cách.

ip route add default dev eth0 table known

Tạo quy tắc iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

Ví dụ đánh dấu các gói trên các cổng NFS (111, 2049) bằng 1. Chúng tôi đang thêm quy tắc này vào 'mangle' iptable. Điều này khác với các bảng định tuyến và không thể thay đổi; bảng mangle đặc biệt để thay đổi các gói theo bất kỳ cách nào khác ngoài NAT.

Bây giờ, để định tuyến mọi thứ khác thông qua giao diện khác, chúng tôi thêm một tuyến vào bảng định tuyến tiêu chuẩn.

ip route add default dev eth1

Để thực sự hiểu điều này, hãy đọc phần 4 và 11 của LARTC .


Chà điều đó thực sự đơn giản hơn nhiều so với tôi đã sợ. Ngăn xếp mạng Linux thực sự là một con thú đẹp, phải không?! Tôi đã cho thử nghiệm nhanh này và tất cả dường như hoạt động như mong đợi. Tôi đang theo dõi từng giao diện thông qua iftopvà chúng đều hiển thị loại lưu lượng truy cập phù hợp. Cảm ơn bạn rất nhiều.
Oli

Tôi không biết làm thế nào iptables hoặc iproute2 lưu cấu hình của họ. Tôi có phải loại bỏ các quy tắc này mỗi lần khởi động không?
Oli

@Oli Họ sẽ bị xóa khi bạn khởi động lại. Bạn có thể lưu và khôi phục các quy tắc với iptables-saveiptables-restore. Nếu bạn đang sử dụng NetworkManager, bạn có thể thiết lập các tập lệnh bộ điều phối để tự động hóa quy trình. Thật không may, trang NM chính thức không có tài liệu về tính năng này, nhưng cả tài liệu UbuntuArch Linux đều đề cập đến nó.
Shawn J. Goff

5

Chà, cách " dễ nhất " nên là hướng dẫn các chương trình đơn sử dụng một giao diện cụ thể (hoặc ip của giao diện. Ví dụ:

ping -I eth1 8.8.8.8

hướng dẫn ping sử dụng eth1 làm giao diện nguồn, trong khi

wget --bind-address 10.0.0.1 http://www.google.it/

hướng dẫn wget đi qua giao diện có10.0.0.1 địa chỉ IP.

Thành thật tôi không biết nếu có thể với tất cả các chương trình bạn cần, nhưng đó là khởi đầu để cắt giảm các quy tắc bạn cần viết iptablesvà các iproutechương trình.

Khi bắt đầu, bạn nên đọc hướng dẫn này trên nhiều kết nối internet . Một đọc tốt cũng là một trong những hàng ngàn của iptables hướng dẫn, expecially trên outbound filtering, process/ pid filteringport filtering.


4

Cách thích hợp để làm điều này là liên kết () với giao diện bạn muốn sử dụng cho các gói gửi đi. Vì sau đó, bạn có thể thiết lập các tuyến đường với các lệnh ip routeip ruleđể kiểm soát cách các gói được định tuyến dựa trên giao diện gửi đi của chúng. Ví dụ của tôi, tôi sẽ giả sử mạng sau:

  • eth0:
    • Địa chỉ: 192.168.0.2/24
    • Cổng mặc định: 192.168.0.1
  • eth1:
    • Địa chỉ: 192.168.1.2/24
    • Cổng mặc định: 192.168.1.1

Tôi sẽ tạo hai bảng định tuyến, một bảng cho lưu lượng đi cho eth0 được gọi là thay thế và một bảng cho eth1 được gọi là chính. Bảng định tuyến chính luôn tồn tại và là bảng bình thường được sử dụng bởi các lệnh routeip route. Hầu hết mọi người không bao giờ giao dịch với bất kỳ bảng khác. Để tạo bảng được gọi là thay thế, chúng tôi sẽ thêm dòng sau vào /etc/iproute2/rt_tables:

10    alternate

Bảng chính có mức ưu tiên mặc định là 254. Các quy tắc mà bảng định tuyến có hiệu lực được điều khiển bởi ip rulelệnh. Theo mặc định, lệnh đó sẽ in ra một danh sách các quy tắc hiện có trông giống như thế này:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Điều này về cơ bản nói rằng nó sẽ tìm một tuyến đường trong bảng locallà một bảng đặc biệt được duy trì bởi kernel cho các tuyến địa phương như địa chỉ IP của riêng tôi. Sau đó nó sẽ thử bảng chính và bảng mặc định. Bảng mặc định thường trống, vì vậy nếu không có kết quả chính, thì không có tuyến nào để lưu trữ. Đầu tiên, cho phép điền vào bảng xen kẽ với các quy tắc cho eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Bạn thường sẽ muốn alternatebảng trông tương tự như mainbảng. Sự khác biệt duy nhất là khi định tuyến nên khác nhau. Bạn có thể không muốn bao gồm dòng thứ hai ở trên nếu bạn thực sự muốn tất cả lưu lượng truy cập NFS, HTTP, v.v. đi qua cổng mặc định trên eth0 ngay cả khi nó được dành cho mạng trên eth1. Bước tiếp theo là thêm quy tắc khi nào nên sử dụng bảng định tuyến thay thế này:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Quy tắc này cho biết mọi lưu lượng truy cập đến từ một địa chỉ trên mạng 192.168.0 sẽ sử dụng alternatebảng định tuyến thay vì mainbảng thông thường . Bước cuối cùng là đảm bảo tất cả các máy khách phải sử dụng eth0liên kết với nó. Với wget, ví dụ, được đặt --bind-address=192.168.0.2, cho NFS, đặtclientaddr=192.168.0.2tùy chọn gắn kết. Nếu sử dụng LibWWW với Perl, bạn có thể đặt tùy chọn localaddr trong LWP :: UserAgent để điều khiển giao diện cục bộ mà nó liên kết. Nếu bạn tình cờ có một máy khách, bạn không thể kiểm soát nguồn ràng buộc và biên dịch không phải là một tùy chọn, bạn có thể sử dụng quy tắc iptables để sửa đổi địa chỉ của nó, nhưng đây là một vụ hack và có thể không hoạt động. Bạn sẽ cần một quy tắc SNAT được thiết lập trong chuỗi PREROUTING của bảng nat hoặc bảng mangle. Bạn vẫn sẽ cần các bảng định tuyến đã sửa đổi ở trên để làm việc này.

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.