Chuyển tiếp cổng cho khách trong libvirt / KVM


33

Làm cách nào tôi có thể chuyển tiếp các cổng trên máy chủ đang chạy libvirt / KVM sang các cổng được chỉ định trên VM, khi sử dụng NAT?

Ví dụ: máy chủ lưu trữ có IP công khai là 1.2.3.4. Tôi muốn chuyển tiếp cổng 80 đến 10.0.0.1 và cổng 22 đến 10.0.0.2.

Tôi giả sử tôi cần thêm quy tắc iptables, nhưng tôi không chắc nơi nào phù hợp và chính xác những gì cần được chỉ định.

Đầu ra của iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.0.0.0/24         state RELATED,ESTABLISHED 
ACCEPT     all  --  10.0.0.0/24          anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Đầu ra của ifconfig

eth0      Link encap:Ethernet  HWaddr 00:1b:fc:46:73:b9  
          inet addr:192.168.1.14  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:fcff:fe46:73b9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:201 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31161 (31.1 KB)  TX bytes:12090 (12.0 KB)
          Interrupt:17 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

virbr1    Link encap:Ethernet  HWaddr ca:70:d1:77:b2:48  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::c870:d1ff:fe77:b248/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)

Tôi đang sử dụng Ubuntu 10.04.


1
Tại sao sử dụng ifconfig? ip là sự kế thừa của ifconfig. ;)
Manuel Faux

5
Câu hỏi 233760 giải quyết điều này trên các phiên bản không bao giờ của libvirt. serverfault.com/questions/233760
akaihola

Câu trả lời:


36

Bản phát hành ổn định mới nhất cho libvirt cho Ubuntu là phiên bản 0.7.5, không có một số tính năng mới hơn (ví dụ như tập lệnh và bộ lọc mạng) giúp cấu hình mạng tự động dễ dàng hơn. Điều đó nói rằng, đây là cách kích hoạt chuyển tiếp cổng cho libvirt 0.7.5 trên Ubuntu 10.04 Lucid Lynx.

Các quy tắc iptables này nên thực hiện thủ thuật:

iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

Cấu hình KVM NAT mặc định cung cấp quy tắc tương tự như thứ 3 tôi đã đưa ra ở trên, nhưng nó bỏ qua trạng thái MỚI, điều này rất cần thiết để chấp nhận các kết nối đến.

Nếu bạn viết một tập lệnh khởi động để thêm các quy tắc này và bạn không cẩn thận, hãy trích dẫn 0.7.5 ghi đè chúng bằng cách chèn chính nó. Vì vậy, để đảm bảo các quy tắc này được áp dụng đúng khi khởi động, bạn cần đảm bảo libvirt đã được khởi tạo trước khi bạn chèn quy tắc của mình.

Thêm các dòng sau vào /etc/rc.local, trước dòng exit 0:

(
# Make sure the libvirt has started and has initialized its network.
while [ `ps -e | grep -c libvirtd` -lt 1 ]; do
        sleep 1
done
sleep 10
# Set up custom iptables rules.
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
) &

Trên đây sleep 10là một bản hack để đảm bảo daemon libvirt đã có cơ hội khởi tạo các quy tắc iptables của nó trước khi chúng ta thêm chính chúng ta. Tôi không thể đợi cho đến khi họ phát hành phiên bản libvirt 0.8.3 cho Ubuntu.


3
Bạn có thể giải thích làm thế nào bạn sẽ làm điều này với libvirt hiện tại?
Manuel Faux

1
Bạn không cần các lệnh loop và ngủ bị hack nếu một trong các tập lệnh hook chạy sau khi libvirt đã khởi tạo mạng của nó. Tôi không chắc tập lệnh / etc / libvirt / hook / daemon được chạy trước hay sau khi khởi tạo mạng, nhưng nếu bạn sử dụng / etc / libvirt / hook / qemu, bạn có thể tạo và hủy quy tắc khi máy ảo phù hợp khởi động và dừng lại. Tôi không chắc bạn sẽ sử dụng các bộ lọc mạng như thế nào (nếu có), nhưng một số ví dụ tại libvirt.org/firewall.html có mùi như chúng có thể sửa đổi để tự động tạo quy tắc iptables.
Isaac Sutherland

Tuyệt vời, tôi có thể xác nhận nó hoạt động, tuy nhiên tôi đã không thử điều gì xảy ra nếu tôi khởi động lại máy chủ ...
Aron Lorincz 17/08/2015

18

Có một cách để thiết lập chuyển hướng cổng một cách nhanh chóng khi khách đang sử dụng mạng chế độ người dùng , tôi đã viết blog về nó ở đây:

http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/

Bạn có thể xem chi tiết ở đó, nhưng để thuận tiện, đây là giải pháp tôi đã tìm ra:

virsh qemu-monitor-command --hmp sles11 'hostfwd_add ::2222-:22'

Điều này dễ dàng hơn nhiều so với các câu trả lời khác nhưng chỉ hoạt động trong một số trường hợp (ngăn xếp mạng chế độ người dùng).


3
Giải pháp của bạn khá thú vị - Bạn có thể đưa một số chi tiết nổi bật (hoặc ít nhất là các bit hướng dẫn) vào câu trả lời của bạn để nó vẫn hữu ích nếu blog của bạn không bao giờ được bảo trì? :)
voretaq7

Xong, hãy thoải mái giúp danh tiếng SF của tôi tăng cao hơn 1 ;-)
Adam Spiers

Cách tiếp cận này yêu cầu sử dụng mạng trong chế độ người dùng có thể mang lại cho chúng tôi một số hạn chế không thú vị. Xem: linux-kvm.org/page/Networking#User_Networking . Một tài liệu tham khảo khác: topic.alibabacloud.com/a/ Lời , snippets.webkn.com.au/howto/ mẹo ]
Eduardo Lucio

5

Một cách "chính thức" hơn [1] để làm điều này là tạo một tập lệnh hook như được mô tả tại trang web libvirt:

http://wiki.libvirt.org/page/Networking#Forwarding_In chuẩn_Connections

... về cơ bản, tập lệnh này sẽ được gọi khi khách KVM được khởi động. Bản thân tập lệnh sẽ thêm các quy tắc iptable thích hợp (tương tự như câu trả lời của Isaac Sutherland ở trên) với trạng thái kết nối 'MỚI' được thêm chính xác. Lưu ý rằng bạn phải sửa đổi tập lệnh với các giá trị chính xác cho máy chủ và cổng của bạn.

[1] mặc dù tài liệu libvirt tự nói rằng đây là một loại hack, hãy tìm hiểu


0

Cách "duy nhất" chúng ta có thể thực hiện chuyển tiếp cổng bằng cách sử dụng KVM (libvirt) với "mạng mặc định" (virbr0) là sử dụng hack / cách khắc phục được thông báo bởi @Antony Nguyen. Hoặc đơn giản hơn, bạn có thể sử dụng libvirt-hook-qemu .

Chủ đề này có một lời giải thích đầy đủ về cách giải quyết vấn đề này cho CentOS 7 (và chắc chắn cho các bản phát hành khác) bằng libvirt-hook-qemu: https://superuser.com/a/1475915/195840 .


-1
iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
 iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 22 -j DNAT --to-destination 10.0.0.1

1
Cảm ơn bạn vì điều này, nhưng đặc biệt với KVM, nó cũng cần cờ trạng thái MỚI
steveh7
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.