IPTABLES
一、四种功能,每个功能用一张表来表示
1、filter: 防火墙
2、nat: 网络地址转换
3、mangle: 流标标记
4、raw: 状态跟踪
二、五条链
1、INPUT:数据包的目的地是自己
2、OUTPUT:自己向外发,源是自己
3、FORWARD:一块网卡进,另一块出
4、PREROUTING:路由前,DNAT
5、POSTROUTING:路由后,SNAT
三、配置防火墙
1、清空规则
[root@node2 ~]# iptables -F
2、明确允许指定的服务
[root@node2 ~]# iptables -A INPUT -p tcp –dport 22 -j ACCEPT
[root@node2 ~]# iptables -A INPUT -p tcp –dport 80 -j ACCEPT
3、设置默认规则是DROP
[root@node2 ~]# iptables -P INPUT DROP
ptables默认有4个表,nat表(地址转换表)、filter表(数据过滤表)、raw表(状态跟踪表)、mangle表(包标记表)
2)iptables的5个链(区分大小写):
INPUT链(入站规则)
OUTPUT链(出站规则)
FORWARD链(转发规则)
PREROUTING链(路由前规则)
POSTROUTING链(路由后规则)
//目标操作:
// ACCEPT:允许通过/放行
// DROP:直接丢弃,不给出任何回应
// REJECT:拒绝通过,必要时会给出提示
// LOG:记录日志,然后传给下一条规则
实验案例
1)关闭firewalld服务器
[root@proxy ~]# systemctl stop firewalld.service
[root@proxy ~]# systemctl disable firewalld.service
2)安装iptables-services并启动服务
[root@proxy ~]# yum -y install iptables-services
[root@proxy ~]# systemctl start iptables.service
iptables命令的基本使用方法
1)iptabels语法格式
[root@proxy ~]# iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j REJECT
[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT
[root@proxy ~]# iptables -I INPUT -p icmp -j REJECT
//注意事项与规律:
//可以不指定表,默认为filter表
//可以不指定链,默认为对应表的所有链
//如果没有找到匹配条件,则执行防火墙默认规则
//选项/链名/目标操作用大写字母,其余都小写
#
//目标操作:
// ACCEPT:允许通过/放行
// DROP:直接丢弃,不给出任何回应
// REJECT:拒绝通过,必要时会给出提示
// LOG:记录日志,然后传给下一条规则
2)iptables命令的使用案例
创建规则的案例:
[root@proxy ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
//追加规则至filter表中的INPUT链的末尾,允许任何人使用TCP协议访问本机
[root@proxy ~]# iptables -I INPUT -p udp -j ACCEPT
//插入规则至filter表中的INPUT链的开头,允许任何人使用UDP协议访问本机
[root@proxy ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
//插入规则至filter表中的INPUT链的第2行,允许任何人使用ICMP协议访问本机
查看iptables防火墙规则
[root@proxy ~]# iptables -nL INPUT //仅查看INPUT链的规则
target prot opt source destination
ACCEPT udp – 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp – 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0
[root@proxy ~]# iptables -L INPUT –line-numbers //查看规则,显示行号
num target prot opt source destination
1 ACCEPT udp – anywhere anywhere
2 ACCEPT icmp – anywhere anywhere
3 ACCEPT tcp – anywhere anywhere
删除规则,清空所有规则
[root@proxy ~]# iptables -D INPUT 3
//删除filter表中INPUT链的第3条规则
[root@proxy ~]# iptables -nL INPUT //查看规则,确认是否删除
[root@proxy ~]# iptables -F
//清空filter表中所有链的防火墙规则
[root@proxy ~]# iptables -t nat -F
//清空nat表中所有链的防火墙规则
[root@proxy ~]# iptables -t mangle -F
//清空mangle表中所有链的防火墙规则
[root@proxy ~]# iptables -t raw -F
//清空raw表中所有链的防火墙规则
设置防火墙默认规则
[root@proxy ~]# iptables -t filter -P INPUT DROP //所有数据丢失,不给与任何回复
[root@proxy ~]# iptables -nL
Chain INPUT (policy DROP)
… …
根据防火墙保护的对象不同,防火墙可以分为主机型防火墙与网络型防火墙,如图-1所示。
主机型防火墙,主要保护的是服务器本机(过滤威胁本机的数据包)。
网络防火墙,主要保护的是防火墙后面的其他服务器,如web服务器、FTP服务器等。
1)主机型防火墙案例
[root@proxy ~]# iptables -I INPUT -p tcp –dport 80 -j REJECT
[root@proxy ~]# iptables -I INPUT -s 192.168.2.100 -j REJECT
[root@proxy ~]# iptables -I INPUT -d 192.168.2.5 -p tcp –dport 80 -j REJECT
[root@proxy ~]# iptables -I INPUT -i eth0 -p tcp –dport 80 -j REJECT
[root@proxy ~]# iptables -A INPUT -s 192.168.4.100 -j DROP
//丢弃192.168.4.100发给本机的所有数据包
[root@proxy ~]# iptables -A INPUT -s 192.168.2.0/24 -j DROP
//丢弃192.168.2.0/24网络中所有主机发送给本机的所有数据包
[root@proxy ~]# iptables -A INPUT -s 114.212.33.12 -p tcp –dport 22 -j REJECT
//拒绝114.212.33.12使用tcp协议远程连接本机ssh(22端口)
步骤二:开启Linux的路由转发功能
1)Linux内核默认支持软路由功能,通过修改内核参数即可开启或关闭路由转发功能。
[root@proxy ~]# echo 0 > /proc/sys/net/ipv4/ip_forward //关闭路由转发
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward //开启路由转发
//注意以上操作仅当前有效,计算机重启后无效
[root@proxy ~]# echo ‘net.ipv4.ip_forward=1’ >> /etc/sysctl.conf
//修改/etc/sysctl.conf配置文件,可以实现永久有效规则
网络型防火墙案例
1)网络型防火墙案例
部署如表-3所示的网络拓扑,一定要把proxy主机的路由转发功能打开。
添加网关的命令
[root@client ~]# nmcli connection modify eth0 ipv4.gateway 192.168.4.5
[root@client ~]# nmcli connection up eth0
[root@web1 ~]# nmcli connection modify eth1 ipv4.gateway 192.168.2.5
[root@web1 ~]# nmcli connection up eth1
确认不同网络的联通性
[root@client ~]# ping 192.168.2.100
[root@web1 ~]# ping 192.168.4.100
在web1主机上启动http服务
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo “test page” > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
没有防火墙的情况下client访问web服务
[root@client ~]# curl http://192.168.2.100 //成功
设置proxy主机的防火墙规则,保护防火墙后面的Web服务器
[root@proxy ~]# iptables -I FORWARD -s 192.168.4.100 -p tcp –dport 80 -j DROP
设置完防火墙规则后,再次使用client客户端访问测试效果
[root@client ~]# curl http://192.168.2.100 //失败