가상 브리지를 통해 포트를 Tap 인터페이스로 전달할 수 없습니다.

가상 브리지를 통해 포트를 Tap 인터페이스로 전달할 수 없습니다.

Ubuntu 16.04에 즉시 libvirt를 설치했는데, 이는 해당 범위를 제공하는 dnsmasq 인스턴스인 192.168.122.0/24에 virbr0 가상 브리지를 생성하고 기본 NAT 위장을 설정했습니다.

가상화 소프트웨어에서 사용할 수 있도록 그 아래에 포인트 앤 클릭 인터페이스를 만들었습니다. 소프트웨어 자체는 인터넷과 나머지 네트워크에 완벽하게 액세스할 수 있으므로 위장이 제대로 작동합니다. 또한 소프트웨어에서 요청한 IP 주소를 사용하여 호스트에서 가상화 소프트웨어 SSH 포트에 액세스할 수도 있습니다. 그래서 나는 "즉시 사용 가능한" 라우팅 테이블이 일반적으로 정확하다고 생각합니다.

내가 원하는 것은 외부 포트에서 소프트웨어 및 전체 호스트 시스템으로 인바운드 SSH 연결을 전달하는 것입니다. 물론 이제 호스트 시스템에는 SSH가 있으며 작동하려면 SSH가 필요합니다. 그래서 다른 포트(예: 포트 2022)를 사용해 보았습니다.

포트 2022의 인바운드 트래픽을 포트 22의 소프트웨어 IP 주소로 전달하는 iptables에 DNAT 규칙을 만들었습니다. 외부(예: 아래 컴퓨터 A)에서 로그인하려고 하면 대상에 액세스할 수 없습니다. 주소 변환이 제대로 작동하는 것 같지만 iptables의 "FORWARD" 단계로 이동한 직후에 연결할 수 없는 아웃바운드 ICMP 패킷을 받기 시작합니다.

어떻게 진행해야 할지 혼란스럽습니다. 몇 가지 SNAT 규칙을 시도했지만 실수했거나 이것이 문제가 아닙니다. 누구든지 이것에 대해 어떤 생각을 가지고 있습니까?

업데이트: tap0의 Wireshark는 전달된 패킷이 수신되었음을 표시하지 않습니다. 반환된 패킷의 내용은 가상화 소프트웨어와 관련이 없습니다.

내 네트워크 사진은 다음과 같습니다.

           ----------
          | Internet |
           ----------
               |
               |
            --------
           | Router | 10.211.255.1
            --------
               |
               | 
   ____________|_______________
  |                            |
 ----------                   ---------
|          |                 |  enp0s5 | 10.211.255.4
| Computer | 10.211.255.2    |  Host   | 192.168.122.1
|    A     |                 |  virbr0 |
 ----------                   ---------
                                  |
                                  | LAN NAT 192.168.122.0/24 
                                  |
                              ----------
                             |   tap0   |
                             | Guest OS | 192.168.122.118
                             |          |
                              ----------

내 IP 테이블 규칙은 다음과 같습니다.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "INTRACE: "
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
LOG        all  --  anywhere             anywhere             LOG level debug prefix "FORTRACE: "
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.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
LOG        all  --  anywhere             anywhere             LOG level debug prefix "OUTTRACE: "
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

NAT tables:
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        tcp  --  anywhere             anywhere             tcp dpt:2022 LOG level debug prefix "NATPTRACE: "
DNAT       tcp  --  anywhere             anywhere             tcp dpt:2022 to:192.168.122.118:22

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATITRACE: "

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATOTRACE: "

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATQTRACE: "
SNAT       tcp  --  anywhere             anywhere             tcp spt:ssh to::2022
RETURN     all  --  192.168.122.0/24     base-address.mcast.net/24
RETURN     all  --  192.168.122.0/24     broadcasthost.localdomain
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24

마지막으로 위의 규칙을 사용하여 syslog에서 본 내용의 예는 다음과 같습니다.

Oct 20 09:49:15 ubuntu kernel: [85149.812291] RAWPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812318] MGPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812326] NATPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812336] MGFTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812340] FORTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812354] RAWOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812357] MGOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812361] OUTTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812364] MGQTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]

답변1

문제는 FORWARD 규칙에 있습니다. 내가 설정하지 않았기 때문에 출력을 잘못 해석했습니다 iptables --list.

이 목록의 규칙 4는 다음과 같습니다.

ACCEPT     all  --  anywhere             anywhere

이는 어디에서나 어디로든 바인딩되어 들어오는 모든 패킷을 받아들이는 것 같습니다.

iptables -S그러나 규칙 4를 살펴보면 실제로는 다음과 같습니다.

-A FORWARD -i virbr0 -o virbr0 -j ACCEPT

이는 enp0s5에서 들어오고 vibr0으로 향하는 패킷과 일치하지 않습니다. 따라서 vibr0으로 향하는 모든 패킷을 효과적으로 거부하는 REJECT 규칙 5가 발생합니다.

내가 배운 교훈은 출력을 신뢰하는 것이 아니라 문제가 발생했을 때 출력을 확인하는 것입니다 iptables --list.iptables -S

관련 정보