iptables转发端口配置方法

默认的 NAT 网络模式里的虚拟机可以访问外网,但不能从外界访问虚拟机,但是可以通过 KVM 服务器配置 iptables 端口转发来访问虚拟机。

端口转发就是基于 nat 表的 PREROUTING 和 POSTROUTING 链, 所有的数据报文都要先经过 nat 的 PREROUTING 链进行处理, 再根据路由规则选择是进入 filter 的 INPUT 链还是 filter 的 FORWARD 链, 不管进入哪个链, 之后都会进去 nat 表的 POSTROUTING 链, 最后数据报文再转发出去。

开启 KVM 服务器的 ip_forward 内核转发功能

# 打开 ip_forward 转发:
echo "1"> /proc/sys/net/ipv4/ip_forward

这种方法是暂时的,系统重启后会还原。要永久生效可修改 /etc/stsctl.conf 文件。

# 编辑 /etc/stsctl.conf 文件
vim /etc/stsctl.conf
# 添加 net.ipv4.ip_forward = 1
net.ipv4.ip_forward = 1
# 保存退出后执行 sysctl –p 使其生效
sysctl –p

设置 PREROUTING 路由规则

iptables -t nat -A PREROUTING -d 1.1.1.1/32 -p tcp -m tcp --dport 9556 -j DNAT --to-destination 192.168.122.8:22

这里是把访问 KVM 服务器公网 IP 1.1.1.1(假设的 IP) 的 9556 端口数据通过 DNAT 的方式将数据报文中的目的 ip 信息改为后端的 192.168.122.8:22

设置 filter 表的 FORWARD 规则

iptables -I FORWARD -d 192.168.122.8/32 -j ACCEPT

如果当前 FORWARD 链的默认规则为 REJECT 则需要添加, 如果是 ACCEPT 则不需要执行上面的操作。

设置 POSTROUTING 路由规则

iptables -t nat -A POSTROUTING -d 192.168.122.8/32 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.122.1

这里是把访问 192.168.122.8 端口 22 的返回数据再通过 SNAT 的方式将数据报文的源地址改为 192.168.122.1 (即 KVM 服务器的内网地址) 发送出去。

保存和查看 NAT 规则

/etc/rc.d/init.d/iptables save

# 保存 iptables 配置
service iptables save
# 重启 iptables
service iptables restart
# 查看 NAT 规则
iptables -t nat -nvL

其它

KVM 服务器启动时也会创建一些 NAT 规则,在上面 “查看 NAT 规则” 可以看到,正是那些规则才使我们创建的 NAT 网络模式的虚拟机默认即可访问外网。但它没并有写入 iptables 规则保存文件,所以我们在添加、修改 NAT 规则时重启 iptables 后最好也相应重启 KVM 服务。(如果我们使用 service iptables save 保存 iptables 配置时 KVM 服务在运行状态,那么就会把它的规则一起保存到 iptables 规则保存文件 /etc/sysconfig/iptables 里。)

iptables 是在内核层面实现端口转发功能的,相比其它应用层转发工具更高效、更灵活,但也相对更加复杂,请谨慎使用。

标签:Iptables 发布于:2019-11-12 00:14:08