本文共 9572 字,大约阅读时间需要 31 分钟。
firewalld RHEL7 (底层还是调用包过滤防火墙iptables)
iptables RHEL6
防火墙:隔离公网和私网
硬件防火墙、软件防火墙
表:防火墙的功能项
链:数据包传输的方向
表:raw(状态跟踪表) mangle(包标记表) nat(地址转换表) fillter(过滤表)
INPUT链:处理进入防火墙的数据包(不管私网或公网)
OUTPUT链:从防火墙出去的数据包
FORWARD链:匹配(处理)经过防火墙服务器的数据包(转发)
POSTROUTING(路由后):对数据包作路由选择后应用此链中的规则(所有的数据包出来的时候都先由这个链处理)
数据包到达目标主机经过的路径;到达我的防火墙,已知道你要去的路径,我要修改你的访问路径(路由选路之后要对他处理)
PREROUTING(路由前):对数据包作路由选择前应用此链中的规则(所有数据包进来时都先由这个链处理)
数据到达目标还没选好传输的路径,到达防火墙给他改要到达的目标主机
4表----->5链------>规则(行)
包过滤匹配流程:
顺序比对:匹配即停止(LOG记日志除外)逐行处理
若无任何匹配,则按该链的默认策略处理
格式:iptables [-t 表名]不写则默认filter 选项 [链名] [条件] [-j 目标操作(动作)]放行,丢弃
选项/链名/动作(目标操作)用大写
可以不指定表,默认filter表
可以不指定链,默认为对应表的所有链
如果没有匹配的规则,则使用防火墙默认规则(相当于最下面的规则)
动作(目标操作)
ACCEPT:允许通过/放行
DROP:直接丢弃,不给任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志,然后传给下一条规则(匹配即停止的唯一例外)
选项
添加规则 | -A | 在链的末尾追加一条规则 |
-I | 在链的开头(或指定序号)插入一条规则 | |
查看规则 | -L | 列出所有的规则条目 |
-n | 以数字形式显示地址、端口等信息 | |
--line-numbers | 查看规则时,显示规则的序号 | |
删除规则 | -D | 删除链内指定序号(或内容)的一条规则 |
-F | 清空所有的规则 | |
默认策略 | -P | 为指定的;链设置默认规则 |
所有链的初始默认规则均为ACCEPT
systemctl stop firewalld
systemctl disable firewalldyum -y install iptables-services
systemctl start iptablessystemctl status iptables
iptables -t filter -L
iptables -t filter -L -n iptables -t filter -Ln iptables -t filter -nL iptables -t filter -nL --line-numbers iptables -t nat -nL --line-numbers iptables -t mangle -nL --line-numbers iptables -t raw -nL --line-numbers iptables -L iptables -t filter -L iptables -t filter -nL iptables -t filter -nL --line-numbers iptables -t -nL --line-numbers iptables -t mangle -nL --line-numbres iptables -t mangle -nL --line-numbers iptables -t raw -nL --line-numbers iptables -t raw -nL OUTPUT --line-numbers iptables -t nat -nL OUTPUT --line-numbers iptables -t filter -nL OUTPUT --line-numbers iptables -t filter -nL INPUT --line-numbers iptables -t filter -nL FORWARD --line-numbers iptables -t filter -D INPUT 3 iptables -t filter -nL INPUT --line-numbers iptables -t filter -F INPUT iptables -t filter -nL INPUT --line-numbers iptables -t filter -nL INPUT --line-numbers iptables -t filter -L iptables -t filter -F iptables -t nat -F iptables -t raw -F iptables -t mangle -F iptables -t filter -nL --line-numbers
开启内核的IP转发
作为网关、路由的必要条件
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf 或 echo 1 > /proc/sys/net/ipv4/ip_forward
通用匹配
可直接使用,不依赖于其他条件或扩展
包括网络协议、ip地址、网络接口等条件
隐含匹配要求以特定的协议匹配作为前提
包括端口、TCP标记、ICMP类型等条件
需取反条件时,用“ ! ”
通用匹配 | 协议匹配 | -p 协议名 |
地址匹配 | -s 源地址、-d 目标地址 | |
接口匹配 | -i 收数据的网卡、 -o 发数据的网卡 | |
隐含匹配 | 端口匹配 | --sport 源端口 、 -dport 目标端口 |
ICMP类型匹配 | --icmp-type ICMP类型(echo-reply回应 | echo-request请求) |
例:
封禁IP地址/网段
主机防护,针对入站访问的源地址
iptables -A INPUT -s 192.168.4.50 -j DROP
网络保护,针对转发访问的源地址
iptables -A FORWARD -s 192.168.4.0/24 -j DROP
[root@host51 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #添加规则,重启失效
[root@host51 ~]# iptables -t filter -P INPUT DROP #默认拒绝[root@host51 ~]# iptables -nL --line-numbers
[root@host51 ~]# iptables -t filter -I INPUT -s 192.168.4.50 -p tcp --dport 22 -j DROP [root@host51 ~]# iptables -t filter -nL[root@host50 ~]# ssh 192.168.4.51 systemctl stop iptables #网络yum被限制,需关闭yum -y install httpd
systemctl start httpd systemctl start iptablesiptables -nL #服务重启规则还原
iptables -F
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPTiptables -t filter -P INPUT DROP
iptables -t filter -I INPUT 1 -s 192.168.4.50 -p tcp --dport 22 -j DROP #拒绝该主机22端口的规则 I插入在 指定1序号规则的前面
iptables -t filter -nL
iptables-save > /etc/sysconfig/iptables #保存到防火墙规则文件,下次重启则加载里面的规则了echo "web51" > /var/www/html/index.html
curl 192.168.4.51 #受防火墙限制无法访问 iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT #开放进来本机目标端口80curl 192.168.4.51 #再访问该网页
可能会自己访问自己会经过回环口,开放回环口允许访问 iptables -t filter -I INPUT -i lo -j ACCEPT curl 192.168.4.51 自己访问自己网站 |
iptables -t filter -A INPUT -p icmp --icmp-type echo-reply(ping回应) -j ACCEPT #
[root@host52 ~]# iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 DROP tcp -- 192.168.4.50 0.0.0.0/0 tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 0
有对应的防火墙模块支持
-m 扩展模块 --扩展条件 条件值
MAC地址匹配 | -m mac --mac-source MAC地址 |
多端口转发 | -m multiport --sports 源端口列表 |
-m multiport --dports 目标端口列表 | |
IP范围匹配 | -m iprange --src-range IP1-IP2 |
-m iprange --dst-range IP1-IP2 |
MAC地址匹配
[root@host52 ~]# iptables -t filter -I INPUT 4 -p icmp --icmp-type echo-request -m mac --mac-source 52:54:00:37:78:11 -j DROP
#在序号4前插入规则(此mac地址本机不接收请求)多端口匹配
[root@host52 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
#同时添加22,80端口为开放IP范围匹配
[root@host52 ~]# iptables -t filter -A INPUT -m iprange --src-range 192.168.4.250-192.168.4.254 -p icmp --icmp-type echo-request -j ACCEPT #此时只有该网段可以ping通(开放接收请求)
[root@host52 ~]# arp -n #查看谁ping过自己
网络型防火墙
A eth0 192.168.4.51 ;公网网站http ; iptables停掉 |
B eth0/eth1 192.168.4.52/192.168.2.52 ;iptables防火墙开启 |
C eth1 192.168.2.54 ; gw 192.168.2.52 ; iptables停掉 ; 访问A网站测试 |
192.168.2.54主机模拟私有网络的pc
[root@host54 ~]# systemctl stop NetworkManager
[root@host54 ~]# route add default gw 192.168.2.52# route del default gw 192.168.2.52 添加错了可以删掉
[root@host54 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.2.52 0.0.0.0 UG 0 0 0 eth1 192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.4.52主机(防火墙服务器)
eth0 192.168.4.52 模拟公网地址
eth1 192.168.2.52 模拟私网地址
运行iptales服务并清空所有表的默认规则
[root@host50 demo]# echo 1 > /proc/sys/net/ipv4/ip_forward #该文件不能vim修改,开启路由转发功能
[root@host52 ~]# vim /etc/rc.local #开机自动执行echo 1 > /proc/sys/net/ipv4/ip_forward
[root@host52 ~]# chmod +x /etc/rc.local
或[root@host52 ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
[root@host52 ~]# vim /etc/sysctl.confnet.ipv4.ip_forward = 1
[root@host52 ~]# sysctl -p
192.168.4.51 模拟公网的网站服务器
systemctl stop iptables
yum -y install httpd
echo AAAA > /var/www/html/index.html
echo BBBB > /var/www/html/a.html
systemctl start httpd
路由后处理 局域网/24 SNAT源地址转换 公网
192.168.4.52 在防火墙上写规则,具体如下
iptables -t nat -A POSTROUTING -s 192.168.2.0/24(局域网端地址) -p tcp(外网接口) --dport 80 -j SNAT --to source(外网接口的ip地址) 192.168.4.52 或
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE主要针对外网接口的ip地址不固定的情况
对于ADSL宽带拨号连接,网络接口可写为ppp+
iptables-save > /etc/sysconfig/iptables
iptables -t nat -nL POSTROUTING192.168.2.54 模拟内网
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl start iptables
curl http://192.168.4.51/a.html
ifdown eth0 #如有4.0网段需关掉
192.168.4.51 查看http访问日志
[root@host51 ~]# tail /var/log/httpd/access_log
192.168.4.52 - - [31/May/2019:09:57:42 +0800] "GET /a.html HTTP/1.1" 200 5 "-" "curl/7.29.0"
POSTROUTING源地址转换
入站:PREROUTING ----> INPUT
出站:OUTPUT -----> POSTROUTING
转发:PREROUTING ---> FOREARD ---> POSTROUTING
来自转载:
阻止指定IP地址
iptables -A INPUT -s 源ip地址 -j DROP
ipatebls -A INPUT -i eth0 -p tcp -s 源ip地址 -j DROP
允许所有ssh链接请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
使用multiport将多个规则结合在一起i
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示: 例:允许所有ssh,http,https的流量访问
iptables -A INPUT -i eth0 -p tcp -m multiport --dport 22,80 ,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
负载平衡传入的网络流量
使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。 例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
允许外部主机ping内部主机
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
允许内部主机ping外部主机
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
允许来自指定网络的MySQL连接请求
很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
防止DoS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
上述例子中: -m limit: 启用limit扩展 –limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。 –limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制
端口转发
例:将来自422端口的流量全部转到22端口。 这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
除此之外,还需要允许连接到422端口的请求
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT