1.问题描述


          
          
宿主机ip:192 .168 .103 .41
宿主机内部创建的kvm虚拟机ip:192 .168 .11 .1
宿主机跟内部之间的网桥br0:192 .168 .11 .254
  • 1.
  • 2.
  • 3.

现象:在虚拟机内部部署了某个服务,假设端口是5000,如果外部可以直接跟192.168.11.0/24网段互通,那么直接访问

curl 192.168.11.1:5000

虚拟机内部端口转发失败的问题_iptables

如果外部网络跟192.168.11.0/24网段之间通不了,那么就需要通过iptables做转发了


          
          
iptables -t nat -A PREROUTING -d 192.168.103.41 -p tcp --dport 5000 -j DNAT --to-destination 192.168.11.1:5000
  • 1.

这时候就可以通过


          
          
curl 192.168 .103 .41: 5000
  • 1.

虚拟机内部端口转发失败的问题_虚拟机_02

来直接访问。

2.访问失败

虚拟机内部端口转发失败的问题_kvm_03

现在发现ping 192.168.11.1网段可以通,但是访问相关服务出现问题。那么就可能是转发出现了问题,这是好就要看看iptables的转发规则


          
          
iptables - nvL
  • 1.

虚拟机内部端口转发失败的问题_kvm_04

前面accept的两条规则是小编后来加的,可以看到后面的reject是拒绝出了icmp报文以外的所有报文。

3.解决办法

其实从能ping通内部ip,不能用内部ip地址加端口访问的时候,已经把问题给定位到了,也就是该网段的转发报文被拒绝了,那么只需要配置foward转发规则即可


          
          
iptables -I FORWARD -s 192.168.11.0/24 -j ACCEPT
iptables -I FORWARD -d 192.168.11.0/24 -j ACCEPT
  • 1.
  • 2.

-I是插入的意思。默认在第一 条插入,

-s是source,-d是目的。

配置了上面两条防火墙规则,那么报文从宿主机192.168.103.41上通过的时候,报文就不会被丢弃,而是转发到对应的

192.168.11.0/24网段了。所以问题就被解决了