LXC, Port forwarding dan iptables

8

Saya memiliki kontainer LXC ( 10.0.3.2) yang berjalan di host. Layanan berjalan di dalam wadah di pelabuhan 7000.

Dari host ( 10.0.3.1, lxcbr0), saya dapat mencapai layanan:

$ telnet 10.0.3.2 7000
Trying 10.0.3.2...
Connected to 10.0.3.2.
Escape character is '^]'.

Saya ingin membuat layanan berjalan di dalam wadah yang dapat diakses oleh dunia luar. Oleh karena itu, saya ingin meneruskan port 7002pada host ke port 7000pada wadah:

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000

Yang menghasilkan ( iptables -t nat -L):

DNAT   tcp  --  anywhere     anywhere     tcp dpt:afs3-prserver to:10.0.3.2:7000

Namun, saya tidak dapat mengakses layanan dari host menggunakan port yang diteruskan:

$ telnet 10.0.3.1 7002
Trying 10.0.3.1...
telnet: Unable to connect to remote host: Connection refused

Aku merasa kehilangan sesuatu yang bodoh di sini. Hal-hal apa yang harus saya periksa? Apa strategi yang baik untuk men-debug situasi ini?

Untuk kelengkapan, berikut adalah cara iptablesmengatur host:

iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o lxcbr0 -j MASQUERADE

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000
Roberto Aloi
sumber
Apakah Anda memeriksa INPUTrantai? Mungkin kebijakannya REJECTada di sana.
Michael Härtl
Kebijakannya adalahACCEPT
Roberto Aloi
Maaf, maksud saya FORWARDrantai itu. Juga memeriksa apakah IP forwarding diaktifkan: cat /proc/sys/net/ipv4/ip_forward.
Michael Härtl
ip_forwarddiatur ke1
Roberto Aloi
FORWARDkebijakan jugaACCEPT
Roberto Aloi

Jawaban:

3

Tampaknya Anda telah memblokir port 7002 pada 10.0.3.1 karena kebijakan default Anda adalah DROP

Coba tambahkan ke aturan INPUT:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
orang dalam
sumber
1

Saya mengalami masalah yang sama. Saya belum menemukan solusi, tetapi mengikuti saya mencatat beberapa pengamatan.

Saya memiliki ${host}mesin host (Ubuntu 12.04) dan menjalankan mesin tamu melalui LXC. Tamu sudah aktif IP 10.0.3.248dan gateway sudah 10.0.3.1. Saya menjalankan server web di tamu dan ingin mem-forward lalu lintas dari ${host}:8888ke 10.0.3.248:80. Berikut ini adalah entri iptables yang relevan:

-A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.3.248:80
-A POSTROUTING -j MASQUERADE

Dengan konfigurasi saat ini, saya dapat berhasil mengunjungi server web pada 10.0.3.248:80 dari mesin fisik lain. Namun, gagal ketika saya mencoba mengunjungi 10.0.3.248:80 dari ${host}. Mungkin Anda dapat mencoba mengunjungi layanan itu di dalam LXC dari komputer lain.

Pemahaman saya adalah bahwa, ketika saya berkunjung dari ${host}, paket melewati antarmuka loopback dan memasuki rantai INPUT secara langsung. Meskipun saya mengizinkan semuanya di INPUT, tidak ada layanan mendengarkan ${host}:8888. Dari wireshark, saya melihat RST dikirim diterima. Ketika saya mengunjungi dari mesin fisik lain, paket itu masuk ke rantai PREROUTING dan DNAT-ed seperti yang diharapkan.

Satu pos terkait:

pengguna199716
sumber
0

Saya perlu menambahkan aturan FORWARD

iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT
teknopaul
sumber
0

ok, 5 sen saya dari tahun 2018:

Saya menginstal LXC dan bermain-main. IP kontainer saya adalah10.0.0.10

Saya menambahkan aturan ini:

iptables -t nat -A PREROUTING -p tcp -i ens192 --dport 81 -j DNAT --to-destination 10.0.0.10:22

Itu tidak berhasil. Kemudian saya menyadari, bahwa bahkan kebijakan FORWARD adalah MENERIMA, ada aturan yang memblokir semua FORWARD.

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            10.0.0.0/24          ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       10.0.0.0/24          0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    5   268 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Jadi saya harus menyuntikkan aturan di atas:

iptables -I FORWARD -p tcp -d 10.0.0.10 --dport 22 -j ACCEPT

Sekarang maju host:81-> 10.0.0.10:22berfungsi.

Nick
sumber
-2

Kontainer Anda dapat diakses dari LAN melalui antarmuka host bridge, dan dengan demikian terhubung ke subnet yang sama dengan host.

Anda harus meminta router Anda meneruskan port-port itu ke wadah Anda.

mVincent
sumber