创建iptables chain
对于多个虚拟机,创建对应的iptables链可以方便管理
iptables -t table -N name
其中table变量需要两类,分别是nat
和filter
,默认为filter
。name变量是链名称。
当前虚拟机名为ubuntu
iptables -t nat -N SNAT-ubuntu
iptables -t nat -N DNAT-ubuntu
iptables -t filter -N FWD-ubuntu
编辑映射规则和过滤规则
创建完iptables chain后,针对需要映射的端口添加规则
首先针对DNAT添加规则
iptables -t nat -A dnat_chain -p protocol -d public_ip --dport public_port -j DNAT --to dest
其中dnat-chain是iptables链名称。protocol为协议,tcp或者udp。public_ip是当前主机的ip。public_port是要映射的主机端口。dest是虚拟机的ip和端口组合。
当前虚拟机ip为192.168.0.10,主机ip为10.0.0.10。要将80端口映射到主机的8080端口
iptables -t nat -A DNAT-ubuntu -p tcp -d 10.0.0.10 --dport 8080 -j DNAT --to 192.168.0.10:80
添加SNAT规则
iptables -t nat -A snat_chain -p protocol -s private_ip --dport private_port -j SNAT --to-source public_ip
示例
iptables -t nat -A SNAT-ubuntu -p tcp -s 192.168.0.10 --dport 80 -j SNAT --to-source 10.0.0.10
添加MASQUERADE
iptables -t nat -A snat_chain -p protocol -s private_ip -d private_ip --dport public_port -j MASQUERADE
示例
iptables -t nat -A SNAT-ubuntu -p tcp -s 192.168.0.10 -d 192.168.0.10 --dport 8080 -j MASQUERADE
添加FWD过滤规则
iptables -t filter -A fwd_chain -p protocol -d private_ip --dport private_port -j ACCEPT
示例
iptables -t filter -A FWD-ubuntu -p tcp -d 192.168.0.10 --dport 80 -j ACCEPT
将添加的规则插入iptables规则中
iptables -t nat action OUTPUT -d public_ip -j dnat_chain
iptables -t nat action PREROUTING -d public_ip -j dnat_chain
iptables -t nat action POSTROUTING -s private_ip -d private_ip -j snat_chain
iptables -t filter action FORWARD -d private_ip -j fwd_chain
示例
iptables -t nat -I OUTPUT -d 10.0.0.10 -j DNAT-ubuntu
iptables -t nat -I PREROUTING -d 10.0.0.10 -j DNAT-ubuntu
iptables -t nat -I POSTROUTING -s 192.168.0.10 -d 192.168.0.10 -j SNAT-ubuntu
iptables -t filter -I FORWARD -d 192.168.0.10 -j FWD-ubuntu
使用MASQUERADE进行地址伪装
iptables-t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQUERADE
保存iptables的映射规则配置
service iptables save