专业编程基础技术教程

网站首页 > 基础教程 正文

IPTables: 你想知道的或许都在这里

ccvgpt 2024-12-16 11:27:49 基础教程 5 ℃

简介

iptables其实不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables,将其安全设置执行到对应的“安全框架”中,而这个“安全框架”才是真正的防火墙,这个框架的名字叫netfilter

netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,可以用这个工具操作真正的框架。

IPTables: 你想知道的或许都在这里

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

三表五链

表(Table)

  • Filterused to control the flow of packets in and out of a system(用于控制进出系统的数据包的流动)
  • NATused to redirect connections to other interfaces on the network(用于将连接重定向到网络上的其他接口)
  • Mangleused to modify packet headers(用于修改数据包头)

链(Chain)

  • Inputmanage incoming packets/connections(用于管理传入数据包/连接)
  • OutputOutgoing packet after it has been created/processed(创建/处理后传出的数据包)
  • ForwardForwards incoming packets from their source to destination(将传入的数据包从其源转发到目的地)
  • PreroutingAfter the packet enters the network interface(数据包进入网络接口之后)
  • PostroutingBefore the packet leaves the network interface after the routing decision has been made(在做出路由决策之后,数据包离开网络接口之前)

IPTables数据包处理

  • ACCEPT:Stop processing and lets the packet flow(停止处理并让数据包传输)
  • REJECT:Drops the packet with feedback(丢弃数据包并给出反馈)
  • DROP:Stops processing at the current chain and drops the packet(停止当前链的处理并丢弃数据包)
  • LOG:Similar to ACCEPT, however, it is logged to the /var/log/messages(与ACCEPT类似,但是它会记录到/var/log/messages中)

IPTables传输数据包的流程

IPTables命令行

IPTables基础(一)

1). Listing Chains

You can list all of the available chains in the filter table by using the list command:(可以使用list命令列出过滤表中所有可用的链)

iptables -L

2). Specifying Default Policy

During a fresh configuration, you do not have any predefined rules, so you have to begin by setting the default target policy. In this case, the default policy is set to ACCEPT, which means that all traffic is accepted by default.(在全新配置期间,没有任何预定义规则,因此必须从设置默认目标策略开始。在本例中,默认策略设置为ACCEPT,这意味着默认情况下接受所有流量)

You can specify the default policy for all the chains by running the following commands:(可以通过运行以下命令为所有链指定默认策略)

iptables --policy INPUT ACCEPT
iptables --policy FORWARD ACCEPT
iptables --policy OUTPUT ACCEPT

This sets the default policy for all chains to ACCEPT. You can also change this to DROP or REJECT if you wish to disable access to any services on the server and manually allow the services you wish to expose.(这会将所有链的默认策略设置为ACCEPT。也可以将其更改为DROPREJECT如果希望禁用对服务器上任何服务的访问并手动允许希望公开的服务)

3). Blocking & Allowing Connections From IP Address

You can block all incoming requests from an IP address by adding the following rule:(可以通过添加以下规则来阻止来自某个IP地址的所有传入请求)

iptables -A INPUT -s 192.168.1.1 -j DROP

You can also block all incoming connections from an entire subnet by adding the following rule:(还可以通过添加以下规则来阻止来自整个子网的所有传入连接)

iptables -A INPUT -s 192.168.1.1/24 -j DROP

To block all outgoing connections to a particular IP or subnet you can add the following rule to the OUTPUT chain:(要阻止到特定IP或子网的所有传出连接,可以将以下规则添加到OUTPUT链中)

iptables -I OUTPUT -s 192.168.1.1 -j DROP

To allow connections to these services and ports change the target to ACCEPT instead of DROP.(要允许连接到这些服务和端口,请将目标更改为ACCEPT而不是DROP)

4). Blocking & Allowing Connections To Ports

To block connections to ports and services, specify the protocol and the destination port. For example, if you want to block any incoming SSH connections to the server, add the following rule:(要阻止与端口和服务的连接,请指定协议和目标端口。例如如果想阻止任何传入到服务器的SSH连接,请添加以下规则)

iptables -I INPUT -p tcp --dport 22 -j DROP

You can also block any incoming connections to your web server running on port 80 by adding the following rule:(还可以通过添加以下规则来阻止在端口80上运行的任何传入连接)

iptables -I INPUT -p tcp --dport 80 -j DROP

You can go a step further and block a particular IP from connecting to a particular service. For example, you can block an IP from accessing our web server by adding the following rule:(可以更进一步,阻止特定IP连接到特定服务。例如可以通过添加以下规则来阻止IP访问我们的Web服务器)

iptables -I INPUT -p tcp --dport 80 -s <IP> -j DROP

To allow connections to these services and ports change the target to ACCEPT instead of DROP.(要允许连接到这些服务和端口,请将目标更改为ACCEPT而不是DROP)

5). Saving Changes

To save the changes you have made to your rule-set so that they are persistent, execute the following command:(要保存对规则集所做的更改以使其持久,请执行以下命令)

sudo /sbin/iptables-save

6). Deleting & Clearing Rules

If you want to delete a specific rule, you need to determine the rule line number. To do this, list the chains and the rules with the following options:(如果要删除特定规则,则需要确定规则行号。为此,请使用以下选项列出链和规则)

iptables -L --line-numbers

This lists out the relevant line numbers for each rule. Once the rule is identified and correlated to it’s line number you can delete it by running the following command:(这列出了每条规则的相关行号。一旦识别出规则并将其与行号关联,您就可以通过运行以下命令将其删除)

iptables -D INPUT 3

If you want to clear all the rules that you have added to start over, you can use the flush option:(如果要清除所有已添加的规则以重新开始,可以使用flush选项)

iptables -F

IPTables进阶(二)

在开始以下内容之前,先来认识下NAT的概念。

1). NAT

NAT是Network Address Translation的缩写,译为“网络地址转换”,N说白了就是修改报文的IP地址,NAT功能通常会被集成到路由器、防火墙、或独立的NAT设备中。为什么要修改报文的IP地址呢?

场景1:

假设,网络内部有10台主机,它们有各自的IP地址,当网络内部的主机与其他网络中的主机通讯时,则会暴露自己的IP地址,如果想要隐藏这些主机的IP地址,该怎么办呢?

当网络内部的主机向网络外部主机发送报文时,报文会经过防火墙或路由器,当报文经过防火墙或路由器时,将报文的源IP修改为防火墙或者路由器的IP地址,当其他网络中的主机收到这些报文时,显示的源IP地址则是路由器或者防火墙的,而不是那10台主机的IP地址,这样,就起到隐藏网络内部主机IP的作用,当网络内部主机的报文经过路由器时,路由器会维护一张NAT表,表中记录了报文来自于哪个内部主机的哪个进程(内部主机IP+端口),当报文经过路由器时,路由器会将报文的内部主机源IP替换为路由器的IP地址,把源端口也映射为某个端口,NAT表会把这种对应关系记录下来。

示意图如下:

于是,外部主机收到报文时,源IP与源端口显示的都是路由的IP与端口,当外部网络中的主机进行回应时,外部主机将响应报文发送给路由器,路由器根据刚才NAT表中的映射记录,将响应报文中的目标IP与目标端口再改为内部主机的IP与端口号,然后再将响应报文发送给内部网络中的主机。整个过程中,外部主机都不知道内部主机的IP地址,内部主机还能与外部主机通讯,于是起到了隐藏网络内主机IP的作用。

上述整个过程中,就用到了NAT功能,准确的说是用到了NAPT功能,NAPT是NAT的一种,全称为Network Address Port Translation,就是映射报文IP地址的同时还会映射其端口号,就像刚才描述的过程一样。

刚才描述的过程中,“IP地址的转换”一共发生了两次。

  • 内部网络的报文发送出去时,报文的源IP会被修改,也就是源地址转换:Source Network Address Translation,缩写为SNAT
  • 外部网络的报文响应时,响应报文的目标IP会再次被修改,也就是目标地址转换:Destinationnetwork address translation,缩写为DNAT

但是,上述“整个过程”被称为SNAT,因为这个过程的前半段使用了SNAT,如果过程的前半段使用了DNAT,则整个过程被称为DNAT,也就是说,被称为SNAT还是DNAT,取决于整个过程的前半段使用了SNAT还是DNAT。

其实刚才描述的场景不仅仅能够隐藏网络内部主机的IP地址,还能够让局域网内的主机共享公网IP,让使用私网IP的主机能够访问互联网。

比如,整个公司只有一个公网IP,但是整个公司有10台电脑,我们怎样能让这10台电脑都访问互联网呢?我们可以为这10台电脑都配置上各自的私网IP,比如“192.168”这种私网IP,但是互联网是不会路由私网IP的,如果想要访问互联网,则必须使用公网IP,那么,就需要想办法,能让这10台主机共享公司仅有的一个公网IP,没错,这与刚才描述的场景其实完全一致,我们只要在路由器上配置公网IP,在私网主机访问公网服务时,报文经过路由器,路由器将报文中的私网IP与端口号进行修改和映射,将其映射为公网IP与端口号,这时,内网主机即可共享公网IP访问互联网上的服务了,NAT表示意图如下

综上所述,SNAT不仅能够隐藏网内的主机IP,还能够共享公网IP,这在IPV4地址较为紧张的今天,是非常有用的。

场景2:

场景1中,我们描述的过程为SNAT的过程,虽然其过程中也牵扯到DNAT,但是由于整个过程的前半段使用了SNAT,所以整个过程称之为SNAT,那么在什么情况下,能称之为DNAT呢?

没错,当整个过程的前半段使用了DNAT时,整个过程被称为DNAT,具体场景如下。

公司有自己的局域网,网络中有两台主机作为服务器,主机A提供web服务,主机B提供数据库服务,但是这两台服务器在局域网中使用私有IP地址,只能被局域网内的主机访问,互联网无法访问到这两台服务器,整个公司只有一个可用的公网IP,怎样通过这个公网IP访问到内网中的这些服务呢?

可以将这个公网IP配置到公司的某台主机或路由器上,然后对外宣称,这个IP地址对外提供web服务与数据库服务,于是互联网主机将请求报文发送给这公网IP地址,也就是说,此时报文中的目标IP为公网IP,当路由器收到报文后,将报文的目标地址改为对应的私网地址,比如,如果报文的目标IP与端口号为:公网IP+3306,我们就将报文的目标地址与端口改为:主机B的私网IP+3306,同理,公网IP+80端口映射为主机A的私网IP+80端口,当私网中的主机回应对应请求报文时,再将回应报文的源地址从私网IP+端口号映射为公网IP+端口号,再由路由器或公网主机发送给互联网中的主机。

上述过程也牵扯到DNAT与SNAT,但是由于整个过程的前半段使用了DNAT,所以上述过程被称为DNAT

其实,不管是SNAT还是DNAT,都起到了隐藏内部主机IP的作用。

2). MASQUERADE

上文中,已经描述了SNAT,也就是源地址转换,那么现在来认识一个与SNAT类似的动作:MASQUERADE

当我们拨号网上时,每次分配的IP地址往往不同,不会长期分给我们一个固定的IP地址,如果这时,我们想要让内网主机共享公网IP上网,就会很麻烦,因为每次IP地址发生变化以后,我们都要重新配置SNAT规则,这样显示不是很人性化,我们通过MASQUERADE即可解决这个问题。

MASQUERADE会动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址,示例如下:

iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eno50332184 -j MASQUERADE

如上图所示,我们指定通过外网网卡出去的报文在经过POSTROUTING链时,会自动将报文的源地址修改为外网网卡上可用的IP地址,这时,即使外网网卡中的公网IP地址发生了改变,也能够正常的、动态的将内部主机的报文的源IP映射为对应的公网IP。

可以把MASQUERADE理解为动态的、自动化的SNAT,如果没有动态SNAT的需求,没有必要使用MASQUERADE,因为SNAT更加高效。

3). REDIRECT

使用REDIRECT动作可以在本机上进行端口映射

比如,将本机的80端口映射到本机的8080端口上

iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

经过上述规则映射后,当别的机器访问本机的80端口时,报文会被重定向到本机的8080端口上。

REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。

总结

如果想要Linux主机的核心NAT功能能够正常使用,需要开启转发功能。

echo 1 > /proc/sys/net/ipv4/ip_forward

1). SNAT

配置SNAT,可以隐藏网内主机的IP地址,也可以共享公网IP,访问互联网,如果只是共享IP的话,只配置如下SNAT规则即可。

iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP

如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作,如下命令表示将10.1网段的报文的源IP修改为eth0网卡中可用的地址。

iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADEDNAT相关操作

2). DNAT

配置DNAT,可以通过公网IP访问局域网内的服务。

注:理论上来说,只要配置DNAT规则,不需要对应的SNAT规则即可达到DNAT效果。

但是在测试DNAT时,对应SNAT规则也需要配置,才能正常DNAT,可以先尝试只配置DNAT规则,如果无法正常DNAT,再尝试添加对应的SNAT规则,SNAT规则配置一条即可,DNAT规则需要根据实际情况配置不同的DNAT规则。

iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 私网IP:端口号
iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 8080 -j DNAT --to-destination 10.1.0.1:80
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP

3). REDIRECT

在本机进行目标端口映射时可以使用REDIRECT动作。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

配置完成上述规则后,其他机器访问本机的80端口时,会被映射到8080端口。

最近发表
标签列表