Khi đặt bí danh IP, HĐH xác định địa chỉ IP nào sẽ được sử dụng làm nguồn cho các kết nối TCP / IP bên ngoài?


15

Tôi có một máy chủ chạy Ubuntu Server với bốn địa chỉ IP được đặt bí danh trên một NIC.

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(Sử dụng ví dụ 192.168.xx, giả sử đây là NAT-ed cho một loạt địa chỉ IP công cộng)

Một trong những khách hàng của chúng tôi xuất bản kho lưu trữ của họ qua FTP, vì vậy chúng tôi đăng nhập hàng đêm để tải xuống một tệp lớn từ máy chủ của họ. Tường lửa của họ hy vọng kết nối FTP (thụ động) của chúng tôi sẽ được thực hiện từ 192.168.1.100.

Cho rằng máy chủ của tôi hợp lý có bốn địa chỉ IP trên một bộ điều hợp, làm thế nào để hệ điều hành xác định địa chỉ IP nào được sử dụng làm nguồn cho các kết nối TCP / IP bên ngoài?

Giả sử tôi ssh vào máy chủ của mình trên 192.168.1.101 và chạy FTP tương tác. Kết nối TCP / IP bên ngoài có sử dụng 192.168.1.101 không vì HĐH biết đó là giao diện mà vỏ của tôi được kết nối?

Điều gì xảy ra nếu tác vụ FTP được chạy không tương tác thông qua một công việc định kỳ không có vỏ?

Như bạn có thể nói, điều này làm tôi khá bối rối, vì vậy tôi hy vọng các câu hỏi của tôi ít nhất có ý nghĩa.

Biên tập

Để làm rõ lý do tại sao tôi hỏi - Tôi chưa thực hiện bất kỳ thay đổi nào đối với bảng định tuyến và nó thực sự liệt kê 'eth0' là IFace cho các tuyến 0.0.0.0. Tuy nhiên, tất cả các dấu hiệu cho thấy nó thực sự sử dụng eth0: 0 làm nguồn.

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

Tôi có thể sử dụng bảng định tuyến hoặc yêu cầu khách hàng của chúng tôi thay đổi quy tắc tường lửa của họ để có được hành vi tôi cần, nhưng tôi đang cố gắng hiểu một chút về cách thức hoạt động của nó để biết liệu có lỗi trong HĐH hay chỉ là sự hiểu biết ngây thơ của tôi làm thế nào tất cả các mảnh phù hợp với nhau.

Cảm ơn

Câu trả lời:


12

Theo mặc định, trên Linux, nếu một giao diện có nhiều địa chỉ trên các mạng con khác nhau, lưu lượng truy cập dành cho các mạng con tương ứng sẽ có IP nguồn thích hợp. Nghĩa là, nếu eth0 có hai địa chỉ 192.168.1.1/24 và 10.1.1.1/8, thì lưu lượng truy cập đến bất cứ thứ gì trên mạng con 10.0.0.0 sẽ có nguồn 10.1.1.1 và lưu lượng truy cập đến bất cứ thứ gì trên mạng con 192.168.1.0 sẽ có nguồn 192.168.1.1. Bạn cũng có thể chỉ định địa chỉ nguồn rõ ràng trong trường hợp này bằng cách sử dụng tùy chọn "src 1.2.3.4" cho "tuyến đường ip".

Tuy nhiên, trong trường hợp của bạn, tất cả các địa chỉ của bạn nằm trên cùng một mạng con, do đó, địa chỉ "chính" (như được tiết lộ bởi "ip addr list dev eth0") được sử dụng làm IP nguồn cho lưu lượng truy cập trên giao diện đó. Tôi nghĩ rằng có thể kiểm soát IP nguồn trong trường hợp này chỉ bằng cách sử dụng "tuyến đường ip", nhưng tôi thấy việc sử dụng iptables để viết lại địa chỉ nguồn cho lưu lượng quan tâm dễ dàng hơn.

Nếu bạn muốn buộc một địa chỉ nguồn cụ thể được sử dụng cho các đích cụ thể, bạn có thể làm điều đó với quy tắc SNAT:

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

Vì vậy, nếu IP eth0 "chính" của bạn là 192.168.100.1, nhưng bạn muốn lưu lượng truy cập đến 1.2.3.4 để có nguồn 192.168.100.2, thì hãy làm điều này:

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

Lưu ý rằng "-s 192.168.100.1" rất quan trọng: nó ngăn chặn các địa chỉ nguồn của lưu lượng truy cập được chuyển tiếp theo quy tắc này.

Nếu bạn định triển khai các cấu hình mạng phức tạp trên Linux, bạn nên đọc tài liệu Kiểm soát lưu lượng và định tuyến nâng cao của Linux, http://lartc.org


Trong mẫu, có thể thay thế "-d 1.2.3.4/0" bằng "-d 1.2.3.4/332" hoặc "-d 1.2.3.4"
Christian

5

Tôi thấy trong ví dụ của bạn rằng tất cả các ips quá gần không nằm trong cùng một mạng

Bạn có chắc chắn rằng bạn đang thực sự đa dạng và không chỉ đơn giản là có 4 bí danh IP?

Nếu sau này là trường hợp thì bạn có thể đặt ip nguồn trên một tuyến đường tương tự như thế này

/ sbin / ip hiển thị 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 phạm vi liên kết mặc định thông qua 192.168.222.1 dev eth0

tuyến sudo / sbin / ip thay thế mặc định qua 192.168.222.1 src 192.168.222.178

/ sbin / ip hiển thị
192.168.222.0/24 dev eth0 proto kernel scope scope src 192.168.222.178 169.254.0.0/16 dev eth0 phạm vi liên kết mặc định thông qua 192.168.222.1 dev eth0 src 192.168.222.178

xem giao diện của con người về cách làm cho nó bền bỉ giữa các lần khởi động lại


Bạn nói đúng. Có lẽ tôi đang lạm dụng thuật ngữ multi-homing. Trung tâm dữ liệu của chúng tôi cung cấp cho chúng tôi bốn địa chỉ IP trên cùng một mạng con.
Joe Holloway

bạn biết rằng bạn có thể chỉnh sửa câu hỏi của bạn, phải không?
hayalci

5

Nó sử dụng bất cứ cổng nào mặc định trong bảng định tuyến, trừ khi có một tuyến cụ thể bảo nó sử dụng cổng khác: route -n

EDIT: Tôi đọc câu hỏi của bạn quá nhanh, có vẻ như ...

Vì bạn đang sử dụng chế độ thụ động và máy khách sẽ luôn bắt đầu kết nối, tôi nghĩ trường ip src trong tiêu đề IP sẽ luôn xuất hiện dưới dạng bất kỳ IP nào mà máy khách được kết nối. Nếu đó là chế độ hoạt động, máy chủ sẽ bắt đầu kết nối, tôi nghĩ nó sẽ luôn là IP 'Chính'. Nếu địa chỉ của bạn nằm trong cùng một mạng con, Linux sẽ tạo địa chỉ đầu tiên bạn đã thêm 'Chính' và các địa chỉ khác.

Mặc dù vậy, tôi không hoàn toàn chắc chắn, tôi sẽ chạy tcpdump -n và xem những gì nó xem là IP src.

EDIT2: Được rồi, tôi đã viết ở trên từ quan điểm rằng bạn đang chạy máy chủ, vì vậy bạn là khách hàng và bắt đầu kết nối, tôi nghĩ rằng nó sẽ luôn xuất hiện từ địa chỉ IP Chính, nhưng hãy thử lại và xem với tcpdump.


Bảng định tuyến chỉ là mặc định và chỉ có một mạng con. Một poster khác chỉ ra rằng tôi đã sử dụng sai thuật ngữ multihoming. Tuy nhiên, tôi vẫn hy vọng nó sẽ sử dụng bí danh eth0. Tôi đã sử dụng wget để tải xuống whatsmyip.net và nó cho tôi thấy rằng bằng cách nào đó tôi đang sử dụng eth0: 0.
Joe Holloway

Điều đó không thực sự có ý nghĩa với tôi, whatsmyip.net sẽ hiển thị ip công khai của bạn ...
Kyle Brandt

Để rõ ràng hơn, nó hiển thị địa chỉ IP công cộng là NAT-ed thành IP riêng được liên kết với eth0: 0, trong khi tôi hy vọng nó sẽ hiển thị địa chỉ IP công cộng là NAT-ed cho IP riêng được liên kết với eth0
Joe Holloway

1
Câu trả lời này ở đây được nâng cấp quá nhiều và chứa nhiều chỉnh sửa và gây nhầm lẫn nhiều thứ và không giúp ích gì. Câu trả lời của tbman và jknapka rất tuyệt vời và đã giúp tôi rất nhiều.
Christian

4

Trừ khi công việc FTP của bạn có cách chỉ định giao diện để sử dụng cho các kết nối, tôi tin rằng nó mặc định là giao diện vật lý đầu tiên trên mạng con có liên quan (eth0 trong trường hợp này). Nếu bạn có một máy chủ có hai NIC trên các mạng con khác nhau, nó sẽ tìm ra giao diện nào sẽ sử dụng dựa trên bảng định tuyến.

Vì chỉ có một giao diện vật lý duy nhất trên hệ thống (eth0) và bốn ảo / bí danh (eth0: 0 đến eth0: 2) trên cùng một mạng con, lưu lượng truy cập bên ngoài sẽ sử dụng địa chỉ IP eth0 làm nguồn trừ khi ứng dụng đủ thông minh để khai báo một giao diện gửi đi.


2
Đây là giả định của tôi, nhưng tất cả các thử nghiệm của tôi đều chỉ ra rằng nó sử dụng eth0: 0 làm nguồn.
Joe Holloway

Sau đó, có lẽ tuyến đường mặc định được cấu hình để sử dụng giao diện eth0: 0. Tôi có một bản cài đặt sử dụng cầu ethernet và nó được cấu hình để sử dụng giao diện cầu ảo cho tuyến đường mặc định.
sysadmin1138

Tôi thiết lập một chương trình tầm thường trên một máy khác để in IP mà nó nhận được kết nối từ đó. Kết nối với nó bằng nc -s <ip of eth0:2>bất cứ thứ gì luôn hiển thị địa chỉ nguồn thực sự là ip của eth0: 0, mặc dù netcat đã làm bind(2)trước đó connect(2). Vì vậy, có vẻ như các bí danh không hoạt động để cung cấp cho máy khả năng tạo kết nối từ nhiều địa chỉ nguồn.
Peter Cordes

4

Bạn có thể xem thiết bị và địa chỉ ip src nào sẽ được sử dụng bởi lệnh ip tuyến get như bên dưới:

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

Tôi đã không thử điều này trong môi trường bí danh, nhưng hy vọng điều này sẽ giúp.


1

Khi thiết lập kết nối ra, máy chủ của bạn sẽ xem bảng định tuyến để xác định giao diện nào trong bốn giao diện của bạn sẽ sử dụng; các kết nối TCP của bạn sẽ có IP nguồn của giao diện thoát của bạn.

netstat -rn

Sẽ cung cấp cho bạn đầu ra của bảng định tuyến của bạn; tìm kiếm bất kỳ mục cụ thể nào phù hợp với IP khách hàng mà bạn đang cố gắng kết nối. Nếu không tồn tại, thì bạn sẽ sử dụng một tuyến mặc định (0.0.0.0, mặt nạ 0.0.0.0). Nếu bạn có nhiều tuyến mặc định, tuyến có chi phí thấp nhất sẽ là tuyến được sử dụng.

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.