From bf90ec5a6a757ce6fe603241bbe6d7d56929708c Mon Sep 17 00:00:00 2001 From: diandian Date: Thu, 14 Sep 2023 13:08:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20'iptables'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iptables/企业级防火墙技术Firewalld.md | 352 ++++++++++++++++++ iptables/企业级防火墙技术IPtables.md | 315 ++++++++++++++++ 2 files changed, 667 insertions(+) create mode 100644 iptables/企业级防火墙技术Firewalld.md create mode 100644 iptables/企业级防火墙技术IPtables.md diff --git a/iptables/企业级防火墙技术Firewalld.md b/iptables/企业级防火墙技术Firewalld.md new file mode 100644 index 0000000..de00067 --- /dev/null +++ b/iptables/企业级防火墙技术Firewalld.md @@ -0,0 +1,352 @@ +

企业级防火墙技术Firewalld

+ +------ + +**作者:行癫(盗版必究)** + +## 一:Firewalld简介 + +​ 7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处; + +​ firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效 + +​ firewalld在使用上要比iptables人性化很多,即使不明白“四张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能 + +#### 1.目录结构 + +​ firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),有两个存储位置 + +​ /etc/firewalld/ + +​ /usr/lib/firewalld/ + +​ 使用规则 + +​ 当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找 + +​ 注意 + +​ 两个目录下的同名配置文件第一个目录内的生效 + +​ 第二个目录中存放的是firewalld给提供的通用配置文件,如果我们想修改配置, 那么可以copy一份到第一个目录中 + +​ 当然也可以直接修改第二个目录下的文件 + +#### 2.相关命令 + +​ 查看服务状态 + +```shell +[root@xingdian~ ]# systemctl status firewalld +[root@xingdian~ ]# systemctl status -l firewalld +``` + +​ 启动关闭服务 + +```shell +[root@xingdian~ ]# systemctl start firewalld +[root@xingdian~ ]# systemctl stop firewalld +[root@xingdian~ ]# systemctl reload firewalld +[root@xingdian~ ]# systemctl disable firewalld +``` + +## 二:Firewalld之Zone + +​ firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下;九个zone其实就是九种方案,而且起决定作用的其实是每个xml文件所包含的内容,而不是文件名,所以不需要对每种zone(每个文件名)的含义花费过多的精力,比如trusted这个zone会信任所有的数据包,也就是说所有数据包都会放行,但是public这个zone只会放行其中所配置的服务,其他的一律不予放行,其实我们如果将这两个文件中的内容互换一下他们的规则就换过来了,也就是public这个zone会放行所有的数据包 + +注意: + +​ 生效的只有默认zone里面的规则 + +​ trusted.xml中zone的target,就是因为他设置为了ACCEPT,所以才会放行所有的数据包 + +​ 而 public.xml中的zone没有target属性,这样就会默认拒绝通过,所以public这个zone只有其中配置过的服务才可以通过 + +#### 1.drop(丢弃) + +​ 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接 + +#### 2.block(限制) + +​ 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝 + +#### 3.public(公共) + +​ 在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接 + +#### 4.external(外部) + +​ 是为路由器启用了伪装功能的外部网。不信任来自网络的其他计算,不相信它们不会对您的计算机造成危害,只接收经过选择的连接 + +#### 5.dmz(非军事区) + +​ 用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接 + +#### 6.work(工作) + +​ 用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接 + +#### 7.home(家庭) + +​ 用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接 + +#### 8.internal(内部) + +​ 用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接 + +#### 9.trusted(信任) + +​ 可接受所有的网络连接 + +## 三:规则配置 + +#### 1.方式 + +​ firewall-config(图形方式) + +​ firewall-cmd(命令行方式) + +​ 直接编辑xml文件 + +#### 2.命令行方式 + +```shell +显示防火墙状态: +[root@xingdian~ ]# firewall-cmd --state + running +列出当前有几个zone: +[root@xingdian~ ]# firewall-cmd --get-zones +block dmz drop external home internal public trusted work +取得当前活动的zones: +[root@xingdian~ ]# firewall-cmd --get-active-zones + public + interfaces: ens33 + +设置当前区域的接口: +[root@xingdian~ ]# firewall-cmd --get-zone-of-interface=enp03s +临时修改网络接口(enp0s3)为内部区域(internal): +[root@xingdian~ ]#firewall-cmd --zone=internal --change-interface=enp03s +取得默认的zone: +[root@xingdian~ ]# firewall-cmd --get-default-zone + public +设置默认zone: +[root@xingdian~ ]# firewall-cmd --set-default-zone=public + +取得当前支持的service(跟当前服务器是否已经安装某服务无关): +[root@xingdian~ ]# firewall-cmd --get-services + RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server + +检查下一次重载后将激活的服务: +[root@xingdian~ ]# firewall-cmd --get-service --permanent + RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server + +列出zone public 端口: +[root@xingdian~ ]# firewall-cmd --zone=public --list-ports + +列出zone public当前设置: +[root@xingdian~ ]# firewall-cmd --zone=public --list-all + public (default, active) + interfaces: eno16777736 + sources: + services: dhcpv6-client ssh + ports: + masquerade: no 伪装功能 + forward-ports: + icmp-blocks: + rich rules: + +增加zone public开放http service: +[root@xingdian~ ]# firewall-cmd --zone=public --add-service=http + success +[root@xingdian~ ]# firewall-cmd --permanent --zone=internal --add-service=http + success + --permanent 永久生效 +重新加载配置: +[root@xingdian~ ]# firewall-cmd --reload + success +增加zone internal开放443/tcp协议端口: +[root@xingdian~ ]# firewall-cmd --zone=internal --add-port=443/tcp + success +删除zone public 中ssh服务 +[root@xingdian~ ]# firewall-cmd --zone=public --remove-service=ssh +列出zone internal的所有service: +[root@xingdian~ ]# firewall-cmd --zone=internal --list-services + dhcpv6-client ipp-client mdns samba-client ssh + +设置黑/白名单: (hosts.allow hosts.deny) + 增加172.28.129.0/24网段到zone trusted(信任) +[root@xingdian~ ]# firewall-cmd --permanent --zone=trusted --add-source=172.28.129.0/24 + success +add-sourc +列出zone truste的白名单: +[root@xingdian~ ]# firewall-cmd --permanent --zone=trusted --list-sources + 172.28.129.0/24 + +活动的zone: +[root@xingdian~ ]# firewall-cmd --get-active-zones + public + interfaces: eno16777736 + +添加zone truste后重新加载,然后查看--get-active-zones: +[root@xingdian~ ]# firewall-cmd --reload + success +[root@xingdian~ ]# firewall-cmd --get-active-zones + public + interfaces: ens32 veth4103622 + trusted + sources: 172.28.129.0/24 + +列出zone drop所有规则: +[root@xingdian~ ]# firewall-cmd --zone=drop --list-all + drop + interfaces: + sources: + services: + ports: + masquerade: no + forward-ports: + icmp-blocks: + rich rules: + +添加172.28.13.0/24到zone drop: +[root@xingdian~ ]# firewall-cmd --permanent --zone=drop --add-source=172.28.13.0/24 + success + +添加后需要重新加载: +[root@xingdian~ ]# firewall-cmd --reload + success + +[root@xingdian~ ]# firewall-cmd --zone=drop --list-all + drop + interfaces: + sources: 172.28.13.0/24 + services: + ports: + masquerade: no + forward-ports: + icmp-blocks: + rich rules: + +[root@xingdian~ ]#firewall-cmd --reload + success + +从zone drop中删除172.28.13.0/24: +[root@xingdian~ ]# firewall-cmd --permanent --zone=drop --remove-source=172.28.13.0/24 + success + +查看所有的zones规则: +[root@xingdian~ ]# firewall-cmd --list-all-zones + +案例: + 比如我当前的默认zone是public,需要开放80端口对外访问,则执行如下命令: +[root@xingdian~ ]# firewall-cmd --zone=public --permanent --add-port=80/tcp + success +[root@xingdian~ ]# firewall-cmd --reload + success +``` + +#### 3.修改配置文件 + +```xml +以public zone为例,对应的配置文件是/etc/firewalld/zones/public.xml,像我们刚刚添加80端口后,体现在public.xml 中的内容为: +[root@xingdian~ ]# cat public.xml + + + Public + For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted. + + --reload 或重 + + +注意在修改配置文件后 --reload 或重启 firewall 服务。 +``` + +## 四:高级规则 + +#### 1.Direct Rules概述 + +​ 通过firewall-cmd工具,可以使用 --direct选项在运行时间里增加和删除链。如果不熟悉iptables,使用直接接口非常危险,因为可能无意间导致防火墙被入侵。直接端口模式适用于服务或者程序,以便于在运行时间内增加特定的防火墙规则。直接端口模式添加的规则优先应用 + +```shell +Direct Options + The direct options give a more direct access to the firewall. These options + require user to know basic iptables concepts, i.e. table + (filter/mangle/nat/...), chain (INPUT/OUTPUT/FORWARD/...), commands + (-A/-D/-I/...), parameters (-p/-s/-d/-j/...) and targets + (ACCEPT/DROP/REJECT/...). + + Direct options should be used only as a last resort when it's not possible to + use for example --add-service=service or --add-rich-rule='rule'. + + The first argument of each option has to be ipv4 or ipv6 or eb. With ipv4 it + will be for IPv4 (iptables(8)), with ipv6 for IPv6 (ip6tables(8)) and with eb + for ethernet bridges (ebtables(8)). + + [--permanent] --direct --get-all-chains + Get all chains added to all tables. This option concerns only chains + previously added with --direct --add-chain. + + [--permanent] --direct --get-chains { ipv4 | ipv6 | eb } table +``` + +查看防火墙上设置的规则 + +```shell +[root@xingdian zones]# firewall-cmd --direct --get-all-rules +``` + +添加高级规则 + +```shell +[root@xingdian zones]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.77 -j ACCEPT +``` + +注意: + +​ 只允许172.25.254.77通过80端口访问主机位为110的http服务。因为访问的是主机位为110的http服务,需要主机位为110的内核同意开启http服务,需要在表filter中设置INPUT;-p 数据包类型;--dport 服务端口 + +删除防火墙上的规则 + +```shell +[root@xingdian zones]# firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.217 -j REJECT +``` + +注意: + +​ 移除:不允许172.25.254.217通过22端口的访问ssh,连接172.25.254.110这条规则 + +#### 2.端口转发 + +​ 端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题 + +​ 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了 + +​ 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP + +案例 + +```shell +1. firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 +# 将80端口的流量转发至8080 +2. firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 +# 将80端口的流量转发至192.168.0.1 +3. firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 +# 将80端口的流量转发至192.168.0.1的8080端口 +``` + +开启IP伪装 + +```shell +查看: +[root@xingdian zones]# firewall-cmd --query-masquerade yes no +开启: +[root@xingdian zones]# firewall-cmd --add-masquerade +关闭: +[root@xingdian zones]# firewall-cmd --remove-masquerade +``` + +作用 + +​ 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去 + +​ 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器 \ No newline at end of file diff --git a/iptables/企业级防火墙技术IPtables.md b/iptables/企业级防火墙技术IPtables.md new file mode 100644 index 0000000..cfeefc2 --- /dev/null +++ b/iptables/企业级防火墙技术IPtables.md @@ -0,0 +1,315 @@ +

企业级防火墙技术IPtables

+ +------ + +**作者:行癫(盗版必究)** + +## 一:防火墙简介 + +#### 1.简介 + +​ iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框架叫做netfilter + +​ netfilter 内核态 位于内核空间 + +​ iptables 用户态 位于用户空间 + +注意: + +​ 企业环境内部服务器需关闭Linux自身防火墙;(解决安全问题尽量不给服务器配置外网IP.需要访问的话,就使用代理转发)因为高并发,iptables会加大延迟。除非并发小,服务器必须处于公网,考虑开启防火墙;大并发的情况,不能开iptables,影响性能因为iptables是要消耗CPU的,利用硬件防火墙提升架构安全 + +#### 2.分类 + +逻辑分类 + +​ 主机防火墙:针对单个主机进行防护 + +​ 网络防火墙:它往往处于网络入口或者边缘,针对于网络入口进行防护,服务于防火墙背后的局域网 + +物理分类 + +​ 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分基于软件实现,性能高,成本高 + +​ 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上,性能低,成本低 + +## 二:相关术语 + +#### 1.表(tables) + +​ 表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables),如上,如果把Netfilter看成是某个小区的一栋楼,那么表(tables)就是楼里的其中的一套房子 + +#### 2.链(chains) + +​ 链(chains)是规则(Policys)的容器。如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等) + +#### 3.规则(Policy) + +​ 规则(Policy)就比较容易理解了,就是iptables系列过滤信息的规范和具体方法条款了.可以理解为柜子如何增加并摆放柜子东西等 + +| **Netfilter/iptables** | 表(tables) | 链(chains) | 规则(Policy) | +| ---------------------- | ------------ | ------------ | -------------------- | +| **一栋楼** | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 | + +## 三:Iptables表和链 + +​ 默认情况下,iptables根据功能和表的定义划分包含四个表,filter,nat,mangle,raw其每个表又包含不同的操作链(chains ) + +#### 1.表 + +​ raw 追踪数据包 + +​ mangle 对数据包打标记 + +​ nat 地址转换 + +​ filter 数据包过滤 + +#### 2.链 + +​ PREROUTING 在路由之前 + +​ INPUT 数据包进入时 + +​ FORWARD 数据包经过时 + +​ OUTPUT 数据包出去时 + +​ POSTROUTING 在路由之后 + +#### 3.表详情 + +raw: + Chain PREROUTING (policy ACCEPT) + +​ Chain OUTPUT (policy ACCEPT) + +mangle: + +​ Chain PREROUTING (policy ACCEPT) + +​ Chain INPUT (policy ACCEPT) + +​ Chain FORWARD (policy ACCEPT) + +​ Chain OUTPUT (policy ACCEPT) + +​ Chain POSTROUTING (policy ACCEPT) + +nat: + Chain PREROUTING (policy ACCEPT) + +​ Chain INPUT (policy ACCEPT) + +​ Chain OUTPUT (policy ACCEPT) + +​ Chain POSTROUTING (policy ACCEPT) + +filter: + Chain INPUT (policy ACCEPT) + +​ Chain FORWARD (policy ACCEPT匹配过的数据包不会在去匹配) + +​ Chain OUTPUT (policy ACCEPT) + +#### 4.访问顺序 + +​ 当一个数据包进入网卡,先进入PREROUTING链,内核根据数据包的IP判断是否需要转发 + +​ 如果是到本机的,就会到INPUT链,然后本机的所有进程可收到这个包 + +​ 如果不是到本机的,且内核允许转发,就会到达FORWARD链,然后到POSRTROUTING链输出 + +​ 本机发出一个数据,会通过OUTPUT链,再到POSRTROUTING链输出 + +注意: + +​ 规则顺序:匹配即刻停止 + +image-20230309194921559 + +## 四:Iptables操作 + +#### 1.安装 + +```shell +centos(5/6) +启动防火墙:#/etc/init.d/iptables start +centos7 +[root@xingdian ~]# yum install -y iptables iptables-services +[root@xingdian ~]# systemctl stop firewalld +[root@xingdian ~]# systemctl disable firewalld +[root@xingdian ~]# systemctl start iptables +查看版本: +[root@xingdian ~]# iptables -V +iptables v1.4.21 +配置文件: + /etc/sysconfig/iptables-config + /etc/sysconfig/iptables #记录规则文件 +``` + +#### 2.参数解释 + +```shell +-L:列出一个链或所有链中的规则信息 +-n:以数字形式显示地址、端口等信息 +-v:以更详细的方式显示规则信息 +--line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1 +-F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号) +-D:删除链内指定序号(或内容)的一条规则 +-P:为指定的链设置默认规则 +-A:在链的末尾追加一条规则 +-I:在链的开头(或指定序号)插入一条规则 +-t: 指定表名 +.... 更多参数可通过--help查看 +``` + +#### 3.常见操作 + +```shell +1.如果不写-t 默认使用filter表 +指定表名查看规则 +[root@xingdian ~]# iptables -t nat -L +默认查看规则: +# iptables -L +以数字的形式显示ip和端口与协议 +# iptables -nL +显示规则行号 +# iptables -nL --line +清空规则: +#iptables -F +清空单独的某一个链里面的规则 +#iptables -F 链名 +保存规则: +# service iptables save +# iptables-save > /etc/sysconfig/iptables +# iptables-restore < /etc/sysconfig/iptables +``` + +#### 4.常见协议 + +```shell +协议:-p (小p) +tcp ---用的最多 +udp +icmp ---ping的时候用的协议 +#使用协议的时候可以不指定端口,使用端口的时候必须指定协议。 +案例: +禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。 +[root@xingdian ~]# iptables -F +[root@xingdian ~]# iptables -A INPUT -p icmp -j REJECT ----拒绝 +验证: +[root@xingdian ~]# ping 192.168.246.200 +PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data. +From 192.168.246.200 icmp_seq=1 Destination Port Unreachable +``` + +#### 5.目标动作 + +​ ACCEPT 允许数据包通过(默认策略) + +​ DROP 直接丢弃数据包,不给任何回应 + +​ REJECT 拒绝数据包,必要时会给数据发送端一个响应 + +​ SNAT 源地址转换,可以解决內网用户用一个公网IP上网问题 POSTROUTING + +​ DNAT 目标地址转换 PREROUTING + +​ REDIRECT 做端口映射 + +#### 6.规则案例 + +```shell +添加规则:-A +[root@xingdian ~]# iptables -t filter -A INPUT -p icmp -j REJECT +[root@xingdian ~]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.122.113 -j REJECT +插入规则:-I + 如果不指定插入到第几条,默认插入到第一条 + 插到那默认就是第几条 +[root@xingdian ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -s 192.168.122.114 -j REJECT 插入到第二条上面 +[root@xingdian ~]# iptables -t filter -I INPUT -p tcp --dport 22 -s 192.168.122.114 -j REJECT 默认插入到第一行 +替换(修改)规则:-R +[root@xingdian ~]# iptables -t filter -R INPUT 2 -p tcp --dport 22 -s 192.168.122.115 -j REJECT 把114-->115 +删除规则:-D +[root@xingdian ~]# iptables -t filter -D INPUT -p tcp --dport 22 -s 192.168.122.115 -j REJECT +[root@xingdian ~]# iptables -L --line (要删除的序号) +[root@xingdian ~]# iptables -t filter -D INPUT(链) 2 +修改默认策略:-P 只能用DROP和ACCEPT +[root@xingdian ~]# iptables -t filter -P INPUT DROP +[root@xingdian ~]# iptables -t filter -P INPUT ACCEPT +添加自定义链:-N 默认不生效 是用来存储规则的 +[root@xingdian ~]# iptables -N blackrach 自己创建的链 +[root@xingdian ~]# iptables -t filter -A blacrach -p tcp --dport 22 -s 192.168.122.116 -j REJECT 往自定义链上添加 +[root@xingdian ~]# iptables -A INPUT -j blackrach 关联自定义链,使用自定义链 +修改自定义链名称:-E +[root@xingdian ~]# iptables -E blackrach blackcloud +删掉自定义规则:不能被关联,必须是空链 +[root@xingdian ~]# iptables -X +链名 删除自定义链 +``` + +#### 7.匹配规则 + +基本匹配 + +```shell +协议 -p tcp udp icmp +查端口:vim /etc/services 记录的是tcp/udp协议簇 +vim /etc/protocols 记录的是icmp +-p tcp udp icmp +端口:使用端口前加协议(-p) + --sport源端口 +[root@xingdian ~]# iptables -A INPUT -p tcp --sport 22 -s 10.18.44.10 -j REJECT + --dport目标端口 +[root@xingdian ~]# iptables -A INPUT -p tcp --dport 22 -s 10.18.44.10 -j REJECT + +IP + -s 源IP source ip地址 网段 逗号可以分开多个地址 + -d 目标IP destination +``` + +扩展规则 + +```shell +-m 后面+扩展匹配 +-m multiport 多端口 +[root@xingdian ~]# iptables -A INPUT -m multiport --sports(--source-ports) 80,20,22,1000:2000 -j DROP + --dports(--destination-ports) +-m iprange 多ip地址 +[root@xingdian ~]# iptables -A INPUT -m iprange --src-range 10.18.44.211-10.18.44.250 -j DROP +-m mac +[root@xingdian ~]# iptables -A INPUT -m mac --mac-source 52:54:00:86:a1:86 -j REJECT +获取MAC的方式 +[root@xingdian opt]# arp -a 10.0.102.101 +[root@xingdian opt]# arping -I eth0 10.0.102.101 +``` + +#### 8.网络地址转换 + +​ 注意:实验环境效果不佳/无 + +SNAT:把内网地址转换成公网地址 + +​ client ----------------iptables----内网ip--公网(baidu公网) + +​ 一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING + +```shell +[root@xingdian ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -d 192.168.122.0/24 -j SNAT --to-source 192.168.2.1 +``` + +DNAT:要把别人的公网ip换成我们内部的IP + +​ web-server iptables client + +​ 如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING + +```shell +[root@xingdian ~]# iptables -t nat -A PREROUTING -d 192.168.1.2 -j DNAT --to-destination 192.168.2.2 +[root@xingdian ~]# iptables -t nat -A POSTROUTING -d 192.168.2.2 -j SNAT --to 192.168.2.1 +``` + +面试题 + +```shell +[root@xingdian ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 -dport 80 -j REDIRECT --to-destination 192.168.1.1:8080 +``` \ No newline at end of file