赞
踩
在CentOS7系统中集成了多款防火墙管理工具,**默认启用的是firewalld(动态防火墙管理器)**防火墙管理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理方式。
防火墙分为硬件防火墙和软件防火墙,硬件防火墙有:华为、思科等品牌的防火墙,软件防火墙分为:firewalld和iptables,其中硬件防火墙比软件防火墙又快很多倍
对于接触Linux较早的人员对Iptables比较熟悉,但由于Iptables的规则比较麻烦,并且对网络有一定要求,所以学习成本较高。但firewalld的学习对网络并没有那么高的要求,相对iptables来说要简单不少,所以建议刚接触CentOS7系统的人员直接学习Firewalld。
需要注意的是:如果开启防火墙工具,并且没有配置任何允许的规则,那么从外部访问防火墙设备默认会被阻止,但是如果直接从防火墙内部往外部流出的流量默认会被允许。
firewalld 只能做和IP/Port相关的限制,web相关的限制无法实现。
那么相较于传统的Iptables防火墙,firewalld支持动态更新,并加入了区域zone的概念
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据不同的场景选择不同的策略模板,从而实现防火墙策略之间的快速切换
需要注意的是Firewalld中的区域与接口
一个网卡仅能绑定一个区域, eth0 -->A区域
但一个区域可以绑定多个网卡。A区域–>eth0 eth1 eth2
还可以根据来源的地址设定不同的规则。比如:所有人能访问80端口,但只有公司的IP才允许访问22端口
区域
区域 | 默认规则策略 |
---|---|
trusted | 允许所有的数据包流入流出 |
home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量 |
internal | 等同于home区域 |
work | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
#必须要记住的三个区域,其他的无所谓
trusted 白名单
public 默认区域
drop 黑名单
参数 | 作用 |
---|---|
zone区域相关指令 | |
–get-default-zone | 获取默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–get-zones | 显示总共可用的区域 |
–new-zone= | 新增区域 |
services服务相关命令 | |
–get-services | 列出服务列表中所有可管理的服务 |
–add-service= | 设置默认区域允许该填加服务的流量 |
–remove-service= | 设置默认区域不允许该删除服务的流量 |
Port端口相关指令 | |
–add-port=<端口号/协议> | 设置默认区域允许该填加端口的流量 |
–remove-port=<端口号/协议> | 置默认区域不允许该删除端口的流量 |
Interface网站相关指令 | |
–add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
–remove-interface=<网卡名称> | 取消网卡绑定区域 |
sourceIP相关指令 | |
–add-source=<IP/位数> | 设置默认IP允许服务的流量 |
–remove-source=<IP/位数> | 移除设置的默认IP允许服务的流量 |
其他相关指令 | |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–reload | 让“永久生效”的配置规则立即生效,并覆盖当前的临时规则 |
为了能正常使用firewalld服务和相关工具去管理防火墙,必须启动firewalld服务,同时关闭以前旧的防火墙相关服务,需要注意firewalld的规则分为两种状态:
runtime运行时: 修改规则马上生效,但如果重启服务则失效,测试建议使用。
permanent持久配置: 修改规则后需要reload重载服务才会生效,生产建议使用。
1.禁用与取消禁用防火墙
#禁用防火墙
[root@web02 ~]# systemctl mask iptables.service
Created symlink from /etc/systemd/system/iptables.service to /dev/null.
#取消禁用防火墙
[root@web02 ~]# systemctl unmask iptables.service
Removed symlink /etc/systemd/system/iptables.service.
2.启动firewalld
[root@web02 ~]# systemctl stop firewalld
[root@web02 ~]# systemctl start firewalld
[root@web02 ~]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
3.firewalld常用命令
#查看默认使用的区域 [root@web02 ~]# firewall-cmd --get-default-zone public #查看区域的规则 [root@web02 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: ssh dhcpv6-client ports: 80/tcp 80/udp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: #指定查看区域规则 [root@web02 ~]# firewall-cmd --list-all --zone=public public (active) #区域(活跃的) target: default #状态:默认 icmp-block-inversion: no #ICMP块 interfaces: eth0 eth1 #区域绑定的网卡 sources: #允许流量的IP services: ssh dhcpv6-client #允许流量的服务 ports: 80/tcp 80/udp #允许流量的端口 protocols: #允许流量的协议 {'tcp'|'udp'|'sctp'|'dccp'} masquerade: no #ip 伪装 forward-ports: #端口转发 source-ports: #来源端口 icmp-blocks: rich rules: #富规则 #查询区域是否允许某服务 [root@web02 ~]# firewall-cmd --zone=public --query-service=ssh no #重启防火墙(清理临时的设置) [root@web02 ~]# firewall-cmd --reload success
4.配置测试
配置要求:调整默认public区域拒绝所有流量,但如果来源IP是10.0.0.0/24网段则允许
#配置默认区域拒绝所有的访问 [root@web02 ~]# firewall-cmd --remove-service={ssh,dhcpv6-client} success [root@web02 ~]# firewall-cmd --remove-port={80/tcp,80/udp} success [root@web02 ~]# firewall-cmd --remove-protocol={tcp,udp} success #配置允许的网段 [root@web02 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted success #查看使用的区域规则 [root@web02 ~]# firewall-cmd --get-active-zones public interfaces: eth0 eth1 trusted sources: 10.0.0.0/24
1.firewalld放行服务
[root@web02 ~]# firewall-cmd --add-service=http
success
[root@web02 ~]# firewall-cmd --add-service={http,https}
success
#可以自己配置服务添加
[root@web02 ~]# cp /usr/lib/firewalld/services/{http.xml,suibian.xml}
[root@web02 ~]# firewall-cmd --add-service=suibian
2.firewalld放行端口
[root@web02 ~]# firewall-cmd --add-port=80/tcp success [root@web02 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: ssh dhcpv6-client ports: 80/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
#移除允许的端口
[root@web02 ~]# firewall-cmd --remove-port=80/tcp3.放行网段
3.放行网段
#配置允许的网段
[root@web02 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
success
端口转发是指传统的目标地址映射,实现外网访问内网资源
流量转发语法为:
firewalld-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
实例: 需要将本地的10.0.0.8:5555端口转发至后端172.16.1.7:22端口
#1.添加端口转发 [root@web02 ~]# firewall-cmd --add-forward-port=port=5555:proto=tcp:toport=22:toaddr=172.16.1.7 success #2.开启IP伪装 [root@web02 ~]# firewall-cmd --add-masquerade success #3.查看规则 [root@web02 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: ssh dhcpv6-client ports: 80/tcp protocols: masquerade: yes forward-ports: port=5555:proto=tcp:toport=22:toaddr=172.16.1.7 source-ports: icmp-blocks: rich rules: #4.测试连接 [d:\~]$ ssh 10.0.0.8 5555 Connecting to 10.0.0.8:5555... Connection established. To escape to local shell, press Ctrl+Alt+]. Last login: Sun Mar 15 19:55:23 2020 from 10.0.0.1 [root@web01 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c6:7b:51 brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c6:7b:5b brd ff:ff:ff:ff:ff:ff inet 172.16.1.7/24 brd 172.16.1.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fec6:7b5b/64 scope link valid_lft forever preferred_lft forever [root@web01 ~]#
firewalld中的富语言规则表示更细致,更详细的防火墙策略配置,他可以针对系统服务、端口号、原地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有的防火墙策略中也是最高的,下面为firewalld富语言规则帮助手册
#富规则语法 [root@web02 ~]# man firewalld.richlanguage rule [source] [destination] service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port [log] [audit] [accept|reject|drop|mark] rule [family="ipv4|ipv6"] source address="address[/mask]" [invert="True"] service name="service name" port port="port value" protocol="tcp|udp" protocol value="protocol value" forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address" accept | reject [type="reject type"] | drop #富语言规则相关命令 --add-rich-rule='<RULE>' #在指定的区域添加一条富语言规则 --remove-rich-rule='<RULE>' #在指定的区删除一条富语言规则 --query-rich-rule='<RULE>' #找到规则返回0,找不到返回1 --list-rich-rules #列出指定区里的所有富语言规则
例题:允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问10050端口
#允许10.0.0.1主机能够访问http服务
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 service name=http accept'
#允许172.16.1.0/24能访问10050端口
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=111 protocol=tcp accept'
例题:默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh reject'
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop'
#drop和reject
drop直接丢弃,不返回任何内容
reject拒绝,返回拒绝的内容
例题:当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.7的22端口
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.7'
success
[root@web02 ~]# firewall-cmd --add-masquerade
success
4.查看富规则
[root@web02 ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.7
5.firewalld配置禁ping
[root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp drop'
注:一般所有的拒绝或接受都配置在默认区域,当指定IP访问指定端口或者服务的时候使用富规则
#我们防火墙的配置,永久生效后会保存在/etc/firewalld/zones/这个目录下面,所以如果进行服务器集群扩展,或者配置相同防火墙时,只需要把该文件拿过来启动防火墙即可
#备份也备份以上文目录
#备份文件一定是在永久生效后才会在目录下多生成一个文件
在指定的带有公网IP的实例上启动Firewalld防火墙的NAT地址转换,以此达到内部主机上网。
在公司里面,服务器上没有外网的,除非使用路由器,或者使用防火墙实现内部共享上网
1.开启IP伪装
[root@web02 ~]# firewall-cmd --add-masquerade
success
[root@web02 ~]# firewall-cmd --add-masquerade --permanent
success
2.开启内核转发(如果使用iptables必须手动开启,firewalld不需要手动开启)
#配置内核转发
[root@m01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#在CentOS6中开启之后生效命令
[root@m01 ~]# sysctl -p
#查看内核转发是否开启
[root@m01 ~]# sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
3.配置没有外网机器的网关地址
[root@web03 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
#最后添加
GATEWAY=172.16.1.8
DNS1=223.5.5.5
#重启网卡
[root@web03 ~]# ifdown eth1 && ifup eth1
4.测试访问外网
Netfilter/Iptables(以下简称Iptables)**是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,**它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。
iptables是linux2.4及2.6内核中集成的服务。
iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持7层控制
学好iptables的基础:
1、OSI7层模型以及不同层对应哪些协议?
2、TCP/IP三次握手,四次断开的过程,TCP HEADER,状态转换
3、常用的服务端口要非常清楚了解。
4、常用服务协议原理http协议,icmp协议。
企业中安全配置原则:
1、尽可能不给服务器配置外网IP,可以通过代理转发或者通过防火墙映射。
2、并发不是特别大情况有外网IP,可以开启防火墙服务。
3、大并发的情况,不能开iptables,影响性能,利用硬件防火墙提升架构安全。
容器:装东西的器皿,docker容器技术,将镜像装在了一个系统中,这个系统就称为容器
iptables称为一个容器—装着防火墙的表
防火墙的表又是一个容器—装着防火墙的链
防火墙的链也是一个容器—装着防火墙的规则
iptables—>表—>链—>规则
规则:防火墙一条一条安全策略
防火墙匹配规则流程:
#四表:
1、Filter:实现防火墙安全过滤功能
INPUT 对于指定到本地套接字的包,即到达本地防火墙服务器的数据包 外面---->(门)房子iptables
FORWARD 路由穿过的数据包,即经过本地防火墙服务器的数据包 外面-----(前门)房子(后门)—房子
OUTPUT 本地创建的数据包 外面<-----(门)房子iptables
2、NAT:实现将数据包中IP地址或者端口信息,内网到外网进行改写/外网到内网进行改写
PREROUTING 一进来就对数据包进行改变 在路由之前,进行数据包IP地址或端口信息的转换
OUTPUT 本地创建的数据包在路由之前进行改变 本地防火墙要出去的流量进行相应转换(了解)
POSTROUTING 在数据包即将出去时改变数据包信息 在路由之后,进行数据包IP地址或端口信息的转换
SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念**。如果内网主机访问外网而经过路由时,源IP会发生改变,这种变更行为就是SNAT**;反之,当外网的数据经过路由发往内网主机时,数据包中的目标IP (路由器上的公网IP) 将修改为内网IP,这种变更行为就是DNAT
注:
在nat server 中,先更改配置文件,/etc/sysctl.conf 中改为net.ipv4.ip_forward = 1修改完成后,命令行sysctl -p 让其全部执行生效
3、Managle:对数据进行标记
4、Raw:将数据包一些标记信息进行拆解
#五链:
1.INPUT
2.FORWARD
3.OUTPUT
4.PREROUTING
5.POSTRUTING
1.filter表
主要作用就是阻止和允许访问
包含的链:
1.INPUT:过滤进入主机的数据包
2.FORWARD:负责转发流经主机的数据包
3.OUTPUT:处理从主机出去的数据包
2.NAT表
**主要作用就是端口和IP转发**
包含的链:
1.OUTPUT:处理从主机出去的数据包
2.PREROUTING:在数据包到达防火墙前进行判断,改写数据包目标地址或端口(端口转发)
3.POSTRUTING:在数据包到达防火墙后进行判断,改写数据包目标地址或端口(局域网共享上网)
1.安装iptables
[root@web02 ~]# yum install -y iptables-services
2.加载防火墙的内核模块y
[root@m01 ~]# modprobe ip_tables
[root@m01 ~]# modprobe iptable_filter
[root@m01 ~]# modprobe iptable_nat
[root@m01 ~]# modprobe ip_conntrack
[root@m01 ~]# modprobe ip_conntrack_ftp
[root@m01 ~]# modprobe ip_nat_ftp
[root@m01 ~]# modprobe ipt_state
#查看加载的模块
[root@m01 ~]# lsmod | egrep 'filter|nat|ipt'
3.停止firewalld,启动iptables
[root@web02 ~]# systemctl stop firewalld
[root@web02 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@web02 ~]# systemctl start iptables.service
#常用参数
-A — 表示将规则添加到指定链上
-I — 表示将规则插入到指定链上
-D — 表示将规则从指定链上删除
-R — 表示将规则信息进行修改
-p — 指定相应服务协议信息(tcp udp icmp all)
–dport — 表示指定目标端口信息
–sport — 表示指定源端口号信息
-j — 指定对相应匹配规则执行什么操作
ACCEPT 允许通过
DROP 直接拒绝,没有提示
REJECT 委婉拒绝, 会有提示
REDIRECT 重定向(端口转发)
MASQUERADE 地址伪装(端口转发)
-s — 指定匹配的源地址网段信息,或者匹配的主机信息
-d — 指定匹配的目标地址网段信息,或者匹配的主机信息
-i — 指定匹配的进入流量接口信息 只能配置在INPUT链上
-o — 指定匹配的发出流量接口信息 只能配置在OUTPUT链上
-m — 指定应用扩展模块参数
multiport — 可以匹配多个不连续端口信息
iptables防火墙配置初始化
iptables -F --- 清除防火墙默认规则
iptables -X --- 清除防火墙自定义链
iptables -Z --- 清除防火墙技术器信息
iptables防护墙信息查看方法
iptables -L --- -L 以列表形式显示所有规则信息
iptables -L -n --- -n 以数字形式显示IP地址或端口信息,不要转换为字符串显示
iptables -t nat -L -n --- -t 表示指定查看或者配置相应的表
iptables -L -n -v --- -v 表示显示详细规则信息,包含匹配计数器数值信息
iptables -L -n --line-number --- --line-number 显示规则序号信息
添加防火墙规则
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
iptables #命令
-t #指定表
filter #表名字
-A #添加规则至链的最后
INPUT #链名字
-p #指定协议
tcp #tcp协议
–dport #指定端口
-j #指定动作
DROP #丢弃
iptables防火墙端口规则配置
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP --- -A 表示添加规则到相应链上,默认表示添加规则到结尾
iptables -t filter -D INPUT -p tcp --dport 22 -j DROP --- -D 表示删除规则从相应链上。
iptables -t filter -D INPUT 规则序号
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP --- -I 表示插入规则到相应链上,默认表示插入规则到首部
iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP --- 指定规则插入位置
iptables -t filter -R INPUT 6 -p tcp --dport 8080 -j DROP --- -R 指定将配置好的规则信息进行替换
删除防火墙规则
[root@web02 ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@web02 ~]#
[root@web02 ~]# iptables -D INPUT 2
阻止相应网段主机访问服务端指定端口服务
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22 -j DROP
除了某个地址可以访问22端口之外,其余地址都不能访问
10.0.0.1 10.0.0.253 10.0.0.9(只允许)
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
通过利用 !进行规则取反,进行策略控制
指定阻止访问多个端口服务
iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP --- 匹配连续的端口号访问
iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP --- 匹配不连续的端口号访问
通过防火墙实现禁ping功能
实现ping功能测试链路是否正常,基于icmp协议实现的 icmp协议有多种类型: icmp-type 8:请求类型 icmp-type 0:回复类型 实践01:实现禁止主机访问防火墙服务器(禁ping) iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP 实践02:实现禁止防火墙访问主机服务器(禁ping) iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp --icmp-type 0 -j DROP 实践03:所有icmp类型都禁止 iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP 实践04:实现防火墙状态机制控制 NEW: 发送数据包里面控制字段为syn=1,发送第一次握手的数据包 ESTABLISHED: 请求数据包发出之后,响应回来的数据包称为回复的包 RELATED: 基于一个连接,然后建立新的连接 INVALID: 无效的的数据包,数据包结构不符合正常要求的 iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 实践04:nat实现端口转发 iptables -t nat -A PREROUTING -p tcp --dport 38080 -j REDIRECT --to-port 80
1.禁止端口访问
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 3306 -j DROP
2.拒绝IP访问
#配置访问抛弃
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.7 -i eth0 -j DROP
-s 指定源地址
-i 指定网卡
#测试访问
[root@web01 ~]# curl 10.0.0.8
curl: (7) Failed connect to 10.0.0.8:80; Connection timed out
#配置访问拒绝
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.9 -i eth0 -j REJECT
#访问测试
[root@web03 ~]# curl 10.0.0.8
curl: (7) Failed connect to 10.0.0.8:80; Connection refused
3.禁止IP网段访问
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.0/24 -i eth0 -j DROP
4.只允许某个IP访问
[root@web02 ~]# iptables -t filter -A INPUT -p tcp ! -s 10.0.0.1 -i eth0 -j DROP
5.匹配端口范围
#拒绝多个端口访问,可以使用逗号隔开
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
-m #指定扩展项
multiport #多端口匹配
#写端口范围可以使用 : 在端口之间
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22:100 -j DROP
1.配置之前考虑下
1.考虑防火墙开在哪台机器上
2.该机器部署了什么服务
nginx
keepalived
3.服务开启的是什么端口
80
443
22
4.默认规则为所有都拒绝
2.配置安全规则
#允许访问80和443
iptables -I INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
-I 添加规则至前面
#只允许跳板机连接22端口
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 22 -j ACCEPT
#禁止ping
iptables -A INPUT -p icmp --icmp-type 8 ! -s 172.16.1.61 -j DROP
#允许访问外网
iptables -A INPUT -i eth0 -j ACCEPT
注意:#默认拒绝所有
iptables -P INPUT DROP
-P 更改policy默认策略
3.企业中配置
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL
#把规则写入iptables配置文件 [root@m01 ~]# vim /etc/sysconfig/iptables # sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT #保存已经配置的规则 [root@m01 ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
1.在m01上操作
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-j 指定动作
SNAT 源地址转换
--to-source 源地址转换指向
2.没有外网ip的主机操作
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61
DNS1=223.5.5.5
[root@web01 ~]# ifdown eth1 && ifup eth1
1.端口转发
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 5555 -j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-d 指定目的ip
DNAT 目标地址转换
--to-destination 目标地址转换指向
2.IP转发
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.1.61 -j DNAT --to-destination 172.16.1.7
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
1、详述iptales工作流程以及规则过滤顺序?
2、iptables有几个表以及每个表有几个链?
3、iptables的几个表以及每个表对应链的作用,对应企业应用场景?
4、画图讲解iptables包过滤经过不同表和链简易流程图并阐述。
5、请写出查看iptables当前所有规则的命令。
6、禁止来自10.0.0.188 ip地址访问80端口的请求
7、如何使在命令行执行的iptables规则永久生效?
8、实现把访问10.0.0.3:80的请求转到172.16.1.17:80
9、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
10、写一个防火墙配置脚本,只允许远程主机访问本机的80端口(奇虎360面试题)
11、写一个脚本解决DOS攻击生产案例
t1=‘date -d "-1 min " +%Y:%H:%M’
log=/var/log/nginx/access.log
block_ip()
{
egrep "$t1:[0-5]+ " $log > /tmp/tmp_last_min.log
#把一分钟内访问量高于100的ip地址记录到一个临时文件中。
awk '{print $1}' /tmp/_last_min.log | sort -n | uniq -c | awk '$1>100 {print $2}' > /tmp/bad_ip.list
#计算ip的数量
n=`wc -l /tmp/bad_ip.list | awk '{print $1}'`
#当ip数大于0时,才会用iptables封掉。
if [ $n -ne 0 ]
then
for ip in `cat /tmp/bad_ip.list`
do
iptables -I INPUT -s $ip -j REJCT
done
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。