iptables LXC konténer ip:port forwarding a host gépre, CentOS 6

Fórumok

Sziasztok!

Cél, hogy a CentOS 6 alapon egy LXC konténerben (192.168.122.10) lévő web szerver a host gép 80 és 443-as portján legyen elérhető.

A konténer a virbr0 interfészen belül van, a host pedig az eth0 interfészen keresztül érhető el.

/etc/sysctl.conf -ban:
net.ipv4.ip_forward=1

Ilyesmi irányban indultam el:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.122.10:80
iptables -A FORWARD -p tcp -d ??? --dport 80 -j ACCEPT

Kellene elvileg -j MASQUERADE is.
Valamint megoldani az interfészek között, hogy átmenjen az adat, mert ez a fenti, ha jól tippelek csak arra lenne jó, ha azonos interfészen elérhető ip:port-ok között lenne forwarding.

Most olvasom el az iptables alapokat újra, nagy baromságokat írhattam...

Szerintetek hogy a legcélszerűbb ezt megoldani?

Hozzászólások

(Saját vélemény) Nekem lxc hálózatánál ez a beállítás jött be végül a legjobban, nem virbr0 el megoldva:

Host(külső lába 192.168.9.1):
brctl addbr br0
ifconfig br0 10.0.0.254 netmask 255.255.255.0

iptables:
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to 192.168.9.1
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.9.1 --dport 80 -j DNAT --to-destination 10.0.0.101:80

VM:

config:
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.mtu = 1500

interfaces:
auto eth0
iface eth0 inet static
address 10.0.0.101
netmask 255.255.255.0
gateway 10.0.0.254
mtu 1500

Én az LXC-t libvirt -en keresztül kezelem, így tűnik a legjobbnak. Tudsz ennek bármi hátrányát?
A libvirtd DRBD-n fut, és arról indul el, majd úgy indulnak el a konténerek, ha kell, akkor a másik DRBD-s gépen, mint failover.

Mi a különbség az virbr0 és br0 között, az elnevezésen kívül? Jól tudom, hogy az, hogy a virbr0 csak NAT-os kapcsolódásra alkalmas és nem lehet fizikai eszközhöz kapcsolni?

Sakk-matt,
KaTT :)

"interfaces:
auto eth0
iface eth0 inet static
address 10.0.0.101
netmask 255.255.255.0
gateway 10.0.0.254
mtu 1500"

Akkor húzzak fel az /etc/sysconfig/network-scripts/ -ben egy ifcfg-br0-t, majd állítsam így be?

CentOS 5.x-ben volt még /etc/network/interfaces , a 6-ban már nincs.
Ezt hova kellene berakni? Vagy az LXC/Libvirt-hez? Libvirt XML-be?

Sakk-matt,
KaTT :)

A példád alapján:

iptables -A INPUT -i virbr0 -j ACCEPT
iptables -A FORWARD -d 192.168.122.10/32 ! -i virbr0 -o virbr0 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A FORWARD -d 192.168.122.10/32 ! -i virbr0 -o virbr0 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A FORWARD -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptabes -A FORWARD -i virbr0 ! -o virbr0 -j ACCEPT
iptables -A FORWARD -i virbr0 -o virbr0 -j ACCEPT

iptables -t nat -N LXC
iptables -t nat -A LXC ! -i virbr0 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.122.10:22
iptables -t nat -A LXC ! -i virbr0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.10:80

iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j LXC
iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j LXC
iptables -t nat -A POSTROUTING -s 192.168.122.10 ! -o virbr0 -j MASQUERADE

Szia Tommy!

Működik, ha ide csatlakozom a forward, localhost-ról:
192.168.122.1
az eth0 külső ip-jére csatlakozva

Azonban nem működik kívülről, az eth0 külső ip címén keresztül elérve.

De belülről, localhost-ról nézve jó, működik a forwarding.
Mi lehet a baj?

Sakk-matt,
KaTT :)

Ha a host gépről nézem, hogy mondjuk egy másik gépről el akarom érni a 80-as, forward-olt portot, akkor nem működik, de ez a dump, 31 végű a host, 32 végű amiről csatlakoztam a 80-as portra:

tcpdump -nnvvS -i eth0 port 80

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:25:49.960824 IP (tos 0x0, ttl 64, id 54029, offset 0, flags [DF], proto TCP (6), length 60)
192.168.1.32.60380 > 192.168.1.31.80: Flags [S], cksum 0x26a1 (correct), seq 1193164356, win 14600, options [mss 1460,sackOK,TS val 73329993 ecr 0,nop,wscale 7], length 0

Ha pedig az LXC-n belül nézem, akkor ha kintről csatlakozok, nem jön be semmi, ha a host gépről nézem meg, akkor ez van és jó:

[lxc_cont_1 ~]# tcpdump -nnvvS -i eth0 port 80

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
04:30:18.780022 IP (tos 0x0, ttl 64, id 52535, offset 0, flags [DF], proto TCP (6), length 60)
192.168.122.1.45134 > 192.168.122.10.80: Flags [S], cksum 0x2183 (correct), seq 884788264, win 65495, options [mss 65495,sackOK,TS val 73597215 ecr 0,nop,wscale 7], length 0
04:30:18.780041 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.122.10.80 > 192.168.122.1.45134: Flags [S.], cksum 0xac43 (correct), seq 4276630063, ack 884788265, win 14480, options [mss 1460,sackOK,TS val 73597215 ecr 73597215,nop,wscale 7], length 0
04:30:18.780063 IP (tos 0x0, ttl 64, id 52536, offset 0, flags [DF], proto TCP (6), length 52)
192.168.122.1.45134 > 192.168.122.10.80: Flags [.], cksum 0x11a0 (correct), seq 884788265, ack 4276630064, win 512, options [nop,nop,TS val 73597215 ecr 73597215], length 0
04:30:18.780242 IP (tos 0x0, ttl 64, id 52537, offset 0, flags [DF], proto TCP (6), length 282)
192.168.122.1.45134 > 192.168.122.10.80: Flags [P.], cksum 0x7688 (incorrect -> 0x5dc2), seq 884788265:884788495, ack 4276630064, win 512, options [nop,nop,TS val 73597215 ecr 73597215], length 230
04:30:18.780252 IP (tos 0x0, ttl 64, id 13103, offset 0, flags [DF], proto TCP (6), length 52)
192.168.122.10.80 > 192.168.122.1.45134: Flags [.], cksum 0x1240 (correct), seq 4276630064, ack 884788495, win 122, options [nop,nop,TS val 73597215 ecr 73597215], length 0
04:30:18.780748 IP (tos 0x0, ttl 64, id 13104, offset 0, flags [DF], proto TCP (6), length 264)
192.168.122.10.80 > 192.168.122.1.45134: Flags [P.], cksum 0x7676 (incorrect -> 0x4180), seq 4276630064:4276630276, ack 884788495, win 122, options [nop,nop,TS val 73597216 ecr 73597215], length 212

192.168.122.1 a host és 192.168.122.10 az LXC-s konténer.

# ip a

1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: mtu 1500 qdisc mq state UP qlen 1000
link/ether 18:a9:05:77:b5:f8 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.31/24 brd 192.168.1.255 scope global eth0
3: eth1: mtu 1500 qdisc mq state UP qlen 1000
link/ether 18:a9:05:77:b5:fa brd ff:ff:ff:ff:ff:ff
inet 172.21.1.1/12 brd 172.31.255.255 scope global eth1
4: docker0: mtu 1500 qdisc noqueue state UNKNOWN
link/ether 36:c0:4d:d8:cc:b6 brd ff:ff:ff:ff:ff:ff
inet 10.0.42.1/16 scope global docker0
5: virbr0: mtu 1500 qdisc noqueue state UNKNOWN
link/ether 52:54:00:a8:d7:af brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
6: virbr0-nic: mtu 1500 qdisc noop state DOWN qlen 500
link/ether 52:54:00:a8:d7:af brd ff:ff:ff:ff:ff:ff
9: veth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether ea:2e:7b:bf:fb:aa brd ff:ff:ff:ff:ff:ff
12: veth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether ca:47:da:23:88:e0 brd ff:ff:ff:ff:ff:ff
15: veth2: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether d2:45:71:c8:a3:45 brd ff:ff:ff:ff:ff:ff

Raktak ide iptables beállításokat is?

Sakk-matt,
KaTT :)

Itt: /etc/sysconfig/iptables

Ha például van 3 ilyen sor egymás után:

-A INPUT -i eth0 -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 110 -j ACCEPT

Tehát az eth0-s sor duplikálva van, van bármi hátránya, értelme, azon kívül, hogy felesleges?

Sakk-matt,
KaTT :)