Debian 8.1网关迁移至VM后服务本地正常远程无法访问求助
解决Debian 8.1迁移虚拟机后服务远程无法访问的问题
看起来你已经搞定了网卡改名和SSH连接,卡在了服务远程访问这一步——这种情况在物理机转虚拟机时太常见了,大概率是服务绑定地址不对或者防火墙/路由规则没适配新网卡导致的,咱们一步步排查:
1. 先确认服务到底在监听什么地址
首先得搞清楚这些服务是不是只绑定了本地回环或者旧物理机的IP,而不是允许所有IP访问。在虚拟机里执行:
netstat -tulpn | grep -E '(apache2|svnserve|named)'
看输出里的Local Address列:
- 如果是
127.0.0.1:80(apache)、127.0.0.1:3690(svn)这种,说明服务只允许本地访问,得改配置让它监听所有IP; - 如果是
0.0.0.0:80或者你的虚拟机IP(比如192.168.1.1:80),那监听这块没问题,往下查。
对应服务的配置修改:
- Apache2:编辑
/etc/apache2/ports.conf,把Listen 127.0.0.1:80改成Listen 80(监听所有IP),然后检查站点配置文件(/etc/apache2/sites-available/*.conf)里的<VirtualHost>是不是写了旧IP,改成<VirtualHost *:80>;改完重启服务:service apache2 restart - SVN:如果用的是svnserve,启动命令里有没有加
--listen-host 127.0.0.1?如果是配置文件管理,检查/etc/default/svnserve里的OPTIONS,去掉--listen-host或者改成--listen-host 0.0.0.0,重启服务:service svnserve restart - Bind9:编辑
/etc/bind/named.conf.options,找到listen-on { 127.0.0.1; };,改成listen-on { any; };(或者加上你的虚拟机IP),重启服务:service bind9 restart
2. 检查防火墙(iptables)规则
Debian 8默认用iptables,物理机上的规则可能绑定了旧网卡名(比如原来的eth0,现在改成了ens33之类的),导致入站/转发规则失效。
查看当前规则:
# 查看过滤表规则(入站/出站/转发) iptables -L -n # 查看NAT表规则(网关的SNAT/DNAT) iptables -t nat -L -n
重点看:
- 有没有允许
INPUT链中80、3690、53(TCP/UDP)端口的规则?比如ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80; - NAT表中的
POSTROUTING链是不是还在用旧网卡名?比如SNAT -- 0.0.0.0/0 0.0.0.0/0 to:xxx.xxx.xxx.xxx -o eth0,这里的-o eth0要改成新的网卡名(比如ens33)。
修复规则:
如果规则里绑定了旧网卡,要么替换网卡名,要么改成-o any(不过网关建议指定正确网卡)。比如修改SNAT规则:
# 先看旧规则的编号,用这条命令:iptables -t nat -L -n --line-numbers iptables -t nat -D POSTROUTING 1 # 添加新规则,替换成新网卡名 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 你的公网/上级IP
另外,别忘了保存规则,避免重启后丢失:iptables-save > /etc/iptables/rules.v4
3. 确认网关的IP转发功能正常
作为网关服务器,物理机肯定开启了IP转发,迁移到虚拟机后可能被重置了:
# 查看当前状态 cat /proc/sys/net/ipv4/ip_forward
如果输出是0,说明没开启,执行:
# 临时生效 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效,编辑/etc/sysctl.conf,开启IP转发配置 sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf # 加载配置 sysctl -p
4. 虚拟机网络模式验证
如果你的虚拟机用的是NAT模式,那外部设备肯定没法直接访问虚拟机的服务(除非做端口转发),但你这是网关服务器,应该用桥接模式,确保虚拟机和物理机在同一局域网段,IP地址和原来的物理机一致或者在同一网段。
最后再测试
改完之后,先在虚拟机本地测试服务正常:curl 192.168.1.1:80,然后在局域网内另一台机器上用telnet 192.168.1.1 80或者curl 192.168.1.1测试,应该就能通了。
内容的提问来源于stack exchange,提问作者Ismail Sami
相关产品推荐
相关产品推荐

