iptables基础操作(必学)
## 查看规则 iptables -nL iptables -nL -t nat 专门查看nat表 iptables -nL -v --line-numbers -t filter 表filter带行号带流量数据 iptables -nL --line-numbers 带行号 ## 删除指定表指定链的指定行数据 iptables -t nat -D POSTROUTING 1 iptables -D FORWARD 7 -t filter ## 清空所有规则【默认是filter表】 iptables -F iptables -X iptables -Z iptables -t nat -F (清除NAT表) iptables -t nat -X iptables -t nat -Z
centos7.6+iptables+kvm+阿帕云管理面板(亲测)
命令行先安装阿帕云管理面板发现,只能使用外网IP配置云服务器
想实现,内网虚拟机通过外网上网,同时可以通过外网访问指定端口22管理内网虚拟机
一、kvm创建虚拟机
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name nat001 --memory 4096 --vcpus 2 --disk /home/kvm/nat001.qcow2,format=qcow2,size=40 --cdrom /data/template/CentOS-7.6-x86_64-Minimal-1810.iso --network network=default --graphics vnc,password=qqxxxxxxQQ,listen=0.0.0.0,port=59991 --noautoconsole
二、安装好系统后,配置网络
vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.122.11
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
DNS1=192.168.122.1
:wq
systemctl restart network
三、开启宿主机转发功能
vi /etc/sysctl.conf
把其中的net.ipv4.ip_forward = 0修为net.ipv4.ip_forward = 1
执行命令sysctl -p 使配置生效
开启KVM服务器的IPtables的转发功能
四、清空NAT表(仅首次)
iptables -t nat -F (清除NAT表)
iptables -nvL -t nat(查看nat表)
五、实现内网访问外网功能
首选如下规则,首次使用之后就不需要重复添加了
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
注意该命令中的网卡时br0,而不是eth0
此时虚拟机就可以访问外网了
或使用下面规则也可以实现:
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j SNAT --to 103.85.85.xxx
这条规则做了一个SNAT,也就是源地址转换,将来自192.168.122.0/24的地址转换为103.85.85.140。(不加时内网ping外网没有返回结果)
六、实现通过外网某端口转发给内网某端口
iptables -t nat -A PREROUTING -p tcp --dport 22201 -j DNAT --to-destination 192.168.122.11:22
或使用下面规划也可以实现:
iptables -t nat -A PREROUTING -d 103.85.85.xxx -p tcp --dport 22201 -j DNAT --to 192.168.122.11:22
完整语句如下:
iptables --table nat --append PREROUTING --protocol tcp --destination xx.xx.xx.xx --destination-port xxxx --jump DNAT --to-destination 192.168.122.xx:22
实现访问 103.85.85.xxx:22201 的请求转发到到内网192.168.122.11:22上面。
七、reject规则检查
检查是否存在reject规则
iptables -nL -v --line-numbers -t filter
10 2 84 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
11 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
这里的第10条和第11条,阻止了我们的端口转发,需要把他删掉
删除特定的iptables规则
iptables -D FORWARD 10 -t filter
iptables -D FORWARD 11 -t filter
八、使多个内网虚拟机访问指定IP通过网关转发出去(非必操作)
针对所有网段的语法:
iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.11 -j SNAT --to 192.168.122.1
意思是:把所有内网来自所有网段访问192.168.122.11:22的数据全部通过192.168.122.1这个网关转发出去。
如果仅是针对192.168.122.0/255.255.255.0网段的语法:
iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.11 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.122.1
意思是:把所有来自192.168.122.0/255.255.255.0网段访问192.168.122.11:22的数据全部通过192.168.122.1这个网关转发出去。
九、保存iptables规则(非必操作)
iptables-save > /etc/sysconfig/iptables
备用检查:
1、iptables -P FORWARD DROP(可以不使用)
将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet。
2、iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT (针对所有网段的)
这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用
3、当内网还是无法访问internet时
iptables -A FORWARD -s 192.168.122.11 -j ACCEPT # 允许单个地址 或者如下命令
iptables -A FORWARD -s 192.168.122.0/24 -j ACCEPT # 允许该网段
比如我想让192.168.122.11这个地址访问internet,那么你就加如上的命令就可以了。
4、排查外网开启单个外网端口
如果使用了FORWARD策略是DROP。那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内。因此,我们需要加入下面的规则。
iptables -A FORWARD -d 103.85.85.140 -p tcp --dport 22201 -j ACCEPT
iptables查看、添加、删除规则(可选学习)
blog.youkuaiyun.com/qq_31812703/article/details/79723033
iptables中DNAT和SNAT详解(可选学习)
blog.youkuaiyun.com/lee244868149/article/details/45147533
iptables中DNAT、SNAT和MASQUERADE详解(可选学习)
www.freesion.com/article/7430782361/
实战1:VMware实现iptables NAT及端口映射(首选借鉴)
blog.youkuaiyun.com/weixin_30407613/article/details/96932156
一、简单的NAT路由器
NAT需求介绍
网关2个网络接口
Lan口: 172.16.10.5/24 eth0
Wan口: 10.0.0.5/24 eth1
目的:实现内网中的节点服务器node01 IP:172.16.10.10(网段:172.16.10.0/24)可控的访问internet。
网关服务器操作
1、网关机器开启linux的转发功能
[root@gateway01 ~]# tail /etc/sysctl.conf # 添加如下内容 ………… net.ipv4.ip_forward = 1 [root@gateway01 ~]# sysctl -p # 生效
2、网关机器iptables操作
iptables -P FORWARD DROP
将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet。(******实际因为安装了KVM的管理面板,所以此步无需操作,否则面板功能可能会受到影响!******)
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用。(******实战中发现这条规则是已经存在的,无需操作******)
iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to 10.0.0.5
这条规则做了一个SNAT,也就是源地址转换,将来自172.16.10.0/24的地址转换为10.0.0.5。
有这几条规则,一个简单的nat路由器就实现了。
iptables -A FORWARD -s 172.16.10.10 -j ACCEPT # 允许单个地址 或者如下命令
iptables -A FORWARD -s 172.16.10.0/24 -j ACCEPT # 允许该网段
如上:这时可以让172.16.10.10或网段添加至FORWARD链,他就能访问internet了。
实战中,添加后,可以使得内网ping通外网后,有返回值,清空nat表后,没有这条内网ping通外网后,没有返回值。
3、保存iptables规则
iptables-save > /etc/sysconfig/iptables
二、端口转发
端口转发需求介绍
内部机器1个网络接口
Lan内web server: 172.16.10.10:80
网关2个网络接口
Lan口:172.16.10.5/24 eth0
Wan口:10.0.0.5/24 eth1
目的:对内部server进行端口转发,实现internet 10.0.0.8(网段:10.0.0.0/24)用户【模拟外网机器】访问内网服务器172.16.10.10:80。
网关服务器操作
1、网关机器开启linux的转发功能
[root@gateway01 ~]# tail /etc/sysctl.conf # 添加如下内容 ………… net.ipv4.ip_forward = 1 [root@gateway01 ~]# sysctl -p # 生效
2、网关机器iptables操作
iptables -P FORWARD DROP
将FORWARD链的策略设置为DROP,这样做的目的是做到ip的控制,你允许哪一个访问就可以增加一个规则,不在规则中的ip将无法访问。(******实际因为安装了KVM的管理面板,所以此步无需操作,否则面板功能可能会受到影响!******)
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用。(******实战中发现这条规则是已经存在的,无需操作******)
iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to 172.16.10.10:80
如果你要把访问 10.0.0.5:80 的数据包转发到Lan内web server,用上面的命令。
命令完成了,端口转发也做完了,本例能不能转发呢?不能,为什么呢?我下面分析一下。
本例中我们的FORWARD策略是DROP。那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内。因此,我们需要加入下面的规则。
iptables -A FORWARD -d 172.16.10.10 -p tcp --dport 80 -j ACCEPT
3、保存iptables规则
iptables-save > /etc/sysconfig/iptables
经测试:外网服务器(10.0.0.8)访问内部服务器(172.16.10.10:80)成功。
实战2:
KVM虚拟机通过iptables+NAT模式实现远程连接
配置NAT网络
按照正常情况下NAT都是默认开启的,执行virsh net-lis
查看
NAT模式开启之后会有一个NAT模式默认的网卡virbr0,这块网卡就是负责给虚拟机分配ip地址的网卡。
创建虚拟机(带有GPU直传)blog.youkuaiyun.com/weixin_43802844/article/details/112569060
sudo virt-install --name=ubuntu --memory=380000,maxmemory=380000 --vcpus=46,maxvcpus=46 --os-type=linux --os-variant=ubuntu18.04 --cdrom=/data/ubuntu-18.04.5-live-server-amd64.iso --disk path=/data/ubuntu.img,size=600 --network network=default --graphics vnc,listen=0.0.0.0,keymap=en_us --host-device 04:00.0 --host-device 83:00.0 --features kvm_hidden=on --machine q35 --check disk_size=off
--memory //分配的内存
--vcpus //分配的cpu
--cdrom //ios映像文件,--location会出现hvm报错,所以直接选用cdrom减少麻烦
--disk path //硬盘 size大小为G
--graphics vnc //登录方式为vnc,创建过程vnc远程配置即可
--host-device //显卡的id,建议按组全部添加
--features kvm_hidden=on //阻止nvidia驱动发现虚拟机
--machine q35 //采用q35架构
--network network=default //default即为默认的NAT网络模式
创建完成后使用vnc连接安装系统
配置iptables
开启IP转发
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl –p //令上面修改生效
配置iptables端口转发
sudo iptables --table nat --append PREROUTING --protocol tcp --destination xx.xx.xx.xx --destination-port xxxx --jump DNAT --to-destination 192.168.122.xx:22
sudo iptables -t nat -A PREROUTING -p tcp --dport xxxx -j DNAT --to-destination 192.168.122.2:22
sudo iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.2 -j SNAT --to 192.168.122.1
//注意:这里会有一个坑但是因人而异,这样配置完成之后可能会出现依旧无法实现远程连接的现象,这时候需要删除一个或者两个规则。
查看iptables规则
sudo iptables -nL -v --line-numbers -t filter
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 21974 22M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
2 21974 22M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
4 0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
5 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
6 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
7 11179 21M ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
8 10793 776K ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0
9 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
10 2 84 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
11 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
12 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
13 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0
14 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
15 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
这里的第10条和第11条,阻止了我们的端口转发,需要把他删掉
删除特定的iptables规则
sudo iptables -D FORWARD 10 -t filter
sudo iptables -D FORWARD 11 -t filter
远程连接测试OK
实战3:www.cnblogs.com/dwj192/p/8862199.html
NAT(网络地址)方式连接网络在桌面虚拟化使用是比较多的,比如VMware Workation。使用NAT方式联网可以节省IP地址。说实话这个对于公网IP地址比较少的公司,也节省了成本。
而KVM默认的网络连接方式就是NAT,只是我们一直没有使用。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网(需要对KVM服务器做配置),但不支持外界访问虚拟机(不过可以通过KVM服务器配置IPtables端口转发解决)。
本篇文章主要包括两个部分:
1、KVM为VM配置NAT网络
2、为VM配置iptables端口转发
一、KVM为VM配置NAT网络
我们可以通过如下命令,查看NAT是否开启。如下:
virsh net-list
default是宿主机安装VM支持模块的时候自动安装的。
我们也可以查看,系统中已经存在的网卡。使用ifconfig命令,如下
我们可以看出网卡virbr0就是NAT方式连接网络时,所使用到的网卡。
除此之外我们还可以通过配置文件,来查看NAT方式的DHCP地址池。该配置文件为:/etc/libvirt/qemu/networks/default.xml。如下:
通过上图我们可以看出,目前NAT使用的IP地址池是192.168.122.2-192.168.122.254,网关为192.168.122.1,子网掩码为255.255.255.0。
安装KVM虚拟机
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name nat001 --memory 4096 --vcpus 2 --disk /home/kvm/nat001.qcow2,format=qcow2,size=40 --cdrom /data/template/CentOS-7.6-x86_64-Minimal-1810.iso --network network=default --graphics vnc,password=qqxxxxxxQQ,listen=0.0.0.0,port=59991 --noautoconsole
注意该条命令中有关网络的配置--network network=default,我们使用的是默认网络配置default。这个就是NAT方式。
VM系统安装完毕后,我们进入VM中。默认情况下VM此时使用的DHCP方式获取IP地址,如果你在安装系统时未进行网络配置。我们现在修改VM使用静态IP地址,如下:
more /etc/sysconfig/network-scripts/ifcfg-eth0
此时VM通过NAT网络获取的IP地址无法与其他网段的服务器进行通信。是不是我们的NAT配置出错?还是其他原因?
这个其实不是我们NAT配置出错,而是要是NAT网络与其他服务器进行正常通信还需要做其他工作。
现在切换到KVM服务器,开启KVM服务器的IP转发功能。编辑/etc/stsctl.conf文件,把其中的net.ipv4.ip_forward = 0修为net.ipv4.ip_forward = 1,如下:
vi /etc/sysctl.conf
或者使用如下命令:
echo 1 >/proc/sys/net/ipv4/ip_forward
不过这种方法是暂时的,系统重启后消失。要使其永久生效,建议使用直接修改/etc/stsctl.conf文件的方法。
/etc/stsctl.conf文件修该完毕后,我们要使用sysctl --p使其生效。如下
以上配置完毕后,我们还要开启KVM服务器的IPtables的转发功能,使用如下命令:
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
注意该命令中的网卡时br0,而不是eth0。
此时,我们再切换VM中测试的网络通信情况。是可以ping通外网的
目前VM可以与服务器以及外网正常通信。
二、为VM配置iptables端口转发
为什么要为VM配置iptables端口转发呢?这个是因为有些业务是在公网的,有时候为了资金考虑不得不尽量节省公网IP的个数。比如现在我想管理KVM中的VM,通过SSH方式。但是KVM服务器对外只有一个公网IP,而且KVM服务器是在IDC机房中。
如果要达到我上述的要求,只能在KVM服务器为VM配置IPtables端口转发。
现在我们还以上述VM为例,目前该KVM的公网IP为192.168.1.102,VM的IP为192.168.122.173,现在我要求通过访问KVM的8022端口访问VM的22端口。
要想达到上述功能,我们需要在KVM服务器上设置如下IPtables规则:
iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.122.173:22
iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.122.1
注意这两条IPtables规则:
第一条规则很好理解,就是把所有访问192.168.1.102:8022的请求转发到192.168.122.173:22的端口上。
第二条规则我的理解是,把所有来自192.168.122.0/255.255.255.0网段访问192.168.122.173:22的数据全部通过192.168.122.1这个网关转发出去。
测试效果:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
ssh -p 8022 root@192.168.1.102
我们通过192.168.1.213这台服务器使用ssh通过8022端口登录到IP为192.168.122.173的VM
增加一个web服务的配置
iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp --dport 8023 -j DNAT --to-destination 192.168.122.173:80
iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.122.1
以上这个例子是通过192.168.102:8023访问VM92.168.122.173的web服务器。
为了在下次重启KVM服务器后,这些IPtables规则继续使用。我们要把这些规则保存下,使用如下命令:
/etc/init.d/iptables save
more /etc/sysconfig/iptables