Linux防火墙
iptables
四表:主要用filter表和nat表
- filter:过滤数据包,防火墙
- nat:network address translathion 网络地址转换
- mangle:拆解报文,做出修改,封装报文
- raw:关闭nat 表上启用的链路追踪机制,决定数据包是否被状态跟踪机制处理
五链:
- prerouting :在对数据包作路由选择之前,应用此链中的规则。
- input:当接收到访问本机地址的数据包(入站)时,应用此链中的规则。
- forward:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
- output:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
- postrouting:在对数据包作路由选择之后,应用此链中的规则。
规则优化原则:
- 规则不要写太多,否则匹配缓慢
- 把匹配范围大的规则写在下面
规则表之间的优先顺序:raw>mangle>nat>filter
iptables规则
- 添加、插入、删除、清空规则和查看规则是最常用的管理选项
- 最基本的两种策略为ACCEPT(允许)、DROP(丢弃)
- 在iptables命令中使用-s 源地址和-d 目标地址的形式,分别对应于源(–source)地址和目标(–destination)地址。
- -A参数 是添加规则到结尾
- -I参数 是添加规则到最前面
filter表:
iptables -L #查看filter过滤规则表
设置filter表的INPUT链 插入一条允许出入站,一般只配置入站
iptables -t filter -A INPUT -p tcp --dport 10050 -j ACCEPT #表末尾添加允许入站10050端口.
iptables -I INPUT -p tcp --dport 10050 -j ACCEPT #表最上面添加允许入站10050端口.默认使用filter表不用-t参数
iptables -t filter -I INPUT 5 -p tcp --dport 10050 -j ACCEPT #插入规则到第五条
iptables -I INPUT -s 58.246.139.82 -p tcp -m tcp --dport 40022 -j ACCEPT #允许58.246.139.82访问40022端口
iptables-I INPUT -s 58.246.139.82 -j ACCEPT #允许58.246.139.82 访问本机所有端口
service iptables save #保存修改
添加规则禁止出入站
iptables -I INPUT -s 0.0.0.0 -p tcp --dport 25 -j DROP #禁用任意IP入站25端口
iptables -I OUTPUT -s 0.0.0.0 -p tcp --dport 25 -j DROP #禁用任意IP出站25端口
service iptables save #保存修改
删除规则,清空规则 慎用
iptables -L -n --line-number #查询规则所在行号
iptables -F #清空filter表、nat表、mangle表各链中的所有规则
iptables -t filter -D INPUT 2 #删除filter表INPUT链中的第2条规则。
iptables -t nat -D PREROUTING 17 删除nat表PREROUTING链的行号17的规则
设置规则链的默认策略
iptables -t filter -P FORWARD DROP #将filter表中FORWARD规则链的默认策略设为DROP
设置filter表的forward链转发策略
iptables -A FORWARD -s 192.168.1.11 -j REJECT #拒绝转发来自192.168.1.11主机的数据
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT #允许转发来自192.168.0.0/24网段的数据
NAT表
DNAT 目的地址转换,通常被叫做目的映射 (外网想访问内网端口)
web服务器放在内网,配置内网ip,前端有个防火墙,配置公网ip,互联网上的访问者使用公网ip来访问这个网站。当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip。防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换 。
SNAT 源地址转换,通常被叫做源映射 (内网想访问外网)
PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip。当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip。这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了。所以叫做SNAT,基于源地址的地址转换。
查看NAT表的规则
iptables -t nat -L -n --line-number
NAT 地址转发
如本机有公网IP,其他服务器在同一个子网,在本机做NAT地址转发,可以实现公网访问本机33389端口转发到内网的其他服务器的3389端口,实现公网的远程访问
设置NAT表的PREROUTING链 (公网远程访问内网)
iptables -t nat -A PREROUTING -d 0.0.0.0/0 -p tcp -m tcp --dport 33389 -j DNAT --to-destination 10.73.0.4:3389
#访问本机的33389端口转发到10.73.0.4服务器的3389端口
防火墙规则还原
#查看启动配置
which iptables
/etc/init.d/iptables
#查看iptables文件位置
/etc/sysconfig/iptables
#备份
cp iptables iptables.202402181531
#还原
iptables-restore < iptables.202402181531
#保存
iptables-save > /etc/sysconfig/iptables
firewalld 规则配置
概念
启动新规则时,不会像ipatbles一样,先清空规则,再启动所有规则,如此会对现在程序有影响,哪怕只是一条规则。而firewalld 规则变更不需要对整个防火墙规则重载,可直接添加新规则
iptables与firewalld的关系:
- firewalld底层使用iptables作为防火墙规则管理入口。
- firewalld内核模块还是netfilter,只是firewalld修改了daemon和service。
- 添加规则还是通过iptables管理的,可以通过iptables查看规则。
- firewalld没有链的概念
- redhat6用iptables,redhat7用firewalld/iptables用的少
相关配置文件位置
firewalld 配置:储存在/usr/lib/fierwalld/和/etc/firewalld/目录中的XML文件中
/usr/lib/fierwalld/services/ #模块目录,里面有每个服务对应的模板,配置默认端口
/etc/firewalld/ #配置目录
firewalld zone
firewalld将网卡对应到不同的区域(zone)
zone默认共有9个:block,dmz,drop,external,home,internal,public,trusted,work.
区域相当于iptables的表
drop区域:配置的规则为丢弃的规则
public区域:公共规则
规则配置
列出所支持的zone和查看当前的默认zone
firewall-cmd --get-zones
默认使用区域
firewall-cmd --get-default-zone
查看防火墙规则
firewall-cmd --list-all
查看规则状态
firewall-cmd --state
加载规则
firewall-cmd --reload
开放3306端口
firewall-cmd --add-port=3306/tcp --permanent
开放网段
firewall-cmd --permanent --add-source=192.168.0.0/22
移除规则
firewall-cmd --permanent --remove-source=192.168.0.0/22
开放服务
firewall-cmd --permanent --add-service=http
移除服务
firewall-cmd --permanent --remove-service=http
允许192.168.0.10访问80端口(富规则)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.10" port protocol="tcp" port="80" accept"
#family 对哪个协议
#source address 源地址
#accept 允许
#drop 拒绝
拒绝192.168.0.10访问80端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.10" port protocol="tcp" port="80" drop"
firewall-cmd --reload
配置完规则一定要重新加载防火墙:firewall-cmd --reload
同一规则允许及拒绝时,效果为拒绝,不会跟iptables一样,没有先后顺序优先匹配,为全文匹配,拒绝大于允许
端口转发
开启转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#sysctl -p
#或者
#echo 1 >/proc/sys/net/ipv4/ip_forward
将访问192.168.1.10(本机)主机8080端口的请求转发至80端口
firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10
将访问192.168.1.10(本机)主机8080端口的请求转发至192.168.1.111的80端口
firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toaddr=192.168.1.111:toport=80
将本机的80端口转发至192.168.1.109 8080端口
firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.109
转发时,要开启伪装,伪装就是SNAT
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --reload
firewall-cmd --query-masquerade