配置说明:
- A主机nginx主页地址:192.168.242.3:8080
- B主机nginx主页地址:192.168.242.4:80
现在想要将访问A主机8080端口的流量转发到主机B的80端口,并且将B的反馈返还给访问者
操作步骤:
关闭两台机器的selinux,防火墙
主机A与B共同配置 (这里可能你的linux重启后会恢复,所以下次出现问题的时候优先考虑一下是不是这个原因)
# 主机A,B都要配置以下命令
setenforce 0 #暂时设置selinux为permissive模式
systemctl stop firewalld #关闭防火墙
操作完后主机A与B都应该是以下状态(注意这里是临时关闭,下次开机可能就恢复了,想要永久关闭请查阅相关资料)
getenforce # 查看selinux状态
systemctl status firewalld # 查看防火墙状态
开启A主机的允许ip转发,并配置主机A的iptables的nat表的POSTROUTING与PREROUTING链
# 在主机A配置
sysctl -w net.ipv4.ip_forward=1 # 使A临时支持ip转发
sysctl net.ipv4.ip_forward # 如果显示1则开启成功
# 将目的地址为192.168.242.3:8080的流量转为192.168.242.4:80的地址(使得访问192.168.242.3:8080的相当于访问192.168.242.4:80)
iptables -t nat -I PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.242.4:80
# 将刚刚的流量的源地址再改为192.168.242.3:8080(使得主机B能够反馈上面的目的地址的访问,否则源地址还是浏览器请求那边的地址,导致主机B并不认识,因为这条流量是A给他的,导致B不知道该返回给谁)
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j SNAT --to 192.168.242.3:8080
配置完成应为类似如下显示
sysctl net.ipv4.ip_forward # 检查主机A是否开启了ip转发
iptables -t nat -L -v -n
成果展示:
访问A主机(192.16.242.3:8080)
访问主机B(192.168.242.4:80)
可能错误
如果你访问主机A时超时,那么可能有如下原因:
- 一,浏览器缓存,这时候做好清除一下缓存,我在第一次配置时也由于这个原因很头痛,最后发现就是浏览器缓存
- 二,可能是两台主机的防火墙或者iptables规则拒绝了访问,这时候要检查你的防火墙(firewalld)是否关闭,检查iptables每个表的规则,注意iptables目前是黑名单还是白名单。
- 三,你的虚拟机网络连接是否支持不同虚拟环境的局域网通信,NAT模式?桥接模式?……请了解你的连接模式以及其作用与特点(我这里是NAT模式)
- 四,注意可能是你两台主机不在一个网段或者被隔离了(可以互相ping一下,如果能通就可以排除了)
- 五,selinux,selinux,selinux重要的事说三遍,对于初学者来说,这一点很容易被忽略,建议学习用的系统永久设置selinux为宽容模式