初始目的是想直接在服务器的VM上编写代码,调试代码。由于工作机是Windows,就想直接在VM上开Samba服务,然后Windows直接编辑。总结了一下过程:
0、环境说明:工作机Windows10;Linux服务器Ubuntu18.04;VM:Ubuntu18.04
1、VM安装并开启Samba服务,网上一大堆,可以参考如下
Ubuntu 18.04安装Samba服务器及配置.
2、解决Windows访问VM的地址问题。Linux服务器的地址在172网段,而VM通常分配192.168网段。这需要一个NAT转换。首先在Linux宿主机的网卡上配置一些辅地址,然后映射到VM分配的IP地址,如下所示:
ip addr add 172.171.8.13/24 dev eno1 //设置辅地址
iptables -t nat -I OUTPUT -d 172.171.8.13 -j DNAT --to 192.168.122.236 //设置NAT规则
iptables -t nat -I PREROUTING -d 172.171.8.13 -j DNAT --to 192.168.122.236 //设置NAT规则
iptables -t nat -I POSTROUTING -d 192.168.122.0/24 -j SNAT --to 192.168.122.1 //设置NAT规则
具体的详细的iptables使用手册参见:
Linux下防火墙iptables用法规则详及其防火墙配置.
3、遇到的问题:我这样配置之后,windows ping 172.171.8.13 发现无法ping通,通过在宿主机上抓icmp的报文,发现目的端口不可达。使用iptables -nL看,一堆FORWARD规则:
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
怀疑与这些reject规则有关,先使用 iptables-save > /etc/iptables.up.rule 保存了规则,然后打开看看,发现与之相关的条目有:
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
再使用iptables -nvL 查看丢包,发现是这两个reject导致的丢包。由于虚机是virt-manager起的,怀疑是该管理程序自己加入的规则。使用命令删掉:
iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
iptables -D FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
这样就通了。