LXC, 포트 포워딩 및 iptables


8

10.0.3.2호스트에서 LXC 컨테이너 ( )가 실행 중입니다. 포트의 컨테이너 내부에서 서비스가 실행 중 7000입니다.

호스트 ( 10.0.3.1, lxcbr0)에서 서비스에 연결할 수 있습니다.

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

컨테이너 내부에서 실행되는 서비스를 외부 세계에 액세스 할 수있게 만들고 싶습니다. 따라서 7002호스트의 포트 7000를 컨테이너의 포트 로 전달하고 싶습니다 .

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

( iptables -t nat -L)의 결과 :

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

여전히 전달 된 포트를 사용하여 호스트에서 서비스에 액세스 할 수 없습니다.

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

나는 여기 바보 같은 것을 놓친 것 같은 느낌이 든다. 무엇을 확인해야합니까? 이러한 상황을 디버깅하는 좋은 전략은 무엇입니까?

완전성을 위해 다음 iptables은 호스트에서 설정되는 방법입니다 .

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

INPUT체인 을 확인 했습니까 ? 아마도 정책이 REJECT있을 수 있습니다.
Michael Härtl 2016 년

정책은ACCEPT
Roberto Aloi

미안, 나는 FORWARD사슬을 의미했다 . IP 전달이 활성화되어 있는지 확인하십시오 : cat /proc/sys/net/ipv4/ip_forward.
Michael Härtl

ip_forward로 설정 됨1
Roberto Aloi

FORWARD정책도ACCEPT
Roberto Aloi

답변:


3

기본 정책이 DROP이므로 10.0.3.1에서 7002 포트를 차단 한 것 같습니다

INPUT 규칙에 추가하십시오.

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT

1

나는 같은 문제에 부딪쳤다. 아직 해결책을 찾지 못했지만 다음과 같은 관찰 사항을 기록합니다.

호스트 ${host}시스템 (Ubuntu 12.04)이 있고 LXC를 통해 게스트 시스템을 실행합니다. 게스트는 켜져 IP 10.0.3.248있고 게이트웨이는 10.0.3.1입니다. 게스트에서 웹 서버를 실행하고에서 (으) ${host}:8888로 트래픽을 전달하려고 합니다 10.0.3.248:80. 다음은 관련 iptables 항목입니다.

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

현재 구성을 사용하면 다른 물리적 시스템에서 10.0.3.248:80의 웹 서버를 성공적으로 방문 할 수 있습니다. 그러나에서 10.0.3.248:80을 방문하려고하면 실패합니다 ${host}. 다른 컴퓨터에서 LXC 내부의 해당 서비스를 방문 할 수 있습니다.

내에서 방문 ${host}하면 패킷이 루프백 인터페이스를 통해 입력 체인으로 직접 들어갑니다. INPUT에서 모든 것을 허용하지만에서 서비스 수신이 없습니다 ${host}:8888. wireshark에서 RST가 수신 된 것으로 보입니다. 다른 물리적 시스템을 방문하면 패킷이 PREROUTING 체인으로 이동하여 예상대로 DNAT되었습니다.

하나의 관련 게시물 :


0

앞으로 규칙을 추가해야했습니다

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

0

좋아, 2018 년의 5 센트 :

나는 LXC를 설치하고 놀았다. 내 컨테이너 IP는10.0.0.10

이 규칙을 추가했습니다.

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

효과가 없었습니다. 그런 다음 FORWARD 정책도 받아 들여도 모든 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

그래서 나는 상단에 규칙을 주입해야했습니다.

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

이제 앞으로 host:81-> 10.0.0.10:22작동합니다.


-2

컨테이너는 호스트 브리지 인터페이스를 통해 LAN에서 액세스 할 수 있으므로 호스트와 동일한 서브넷에 연결됩니다.

라우터가 해당 포트를 컨테이너로 전달해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.