使用 iptables 进行端口重定向和日志记录是通过动作来完成的,借此机会我们总结一下在之前已经使用过的动作。
其实在本系列开篇文章已经列出了 iptables 常用的动作,经过前文的学习我们已经使用过的动作有如如下:
ACCEPT
:允许数据包通过;DROP
:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应;REJECT
:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息;SNAT
:源地址转换,解决内网用户用同一个公网地址上网的问题;MASQUERADE
:地址伪装,是SNAT
的一种特殊形式,适用于动态的、临时会变的IP
上。DNAT
:目标地址转换;
而接下来我们要学习的两个新动作如下:
REDIRECT
:端口重定向,即在本机做端口映射;LOG
:在/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配;
端口重定向(REJECT)
哦豁~看到这个标题如果你看过前文,肯定有一种熟悉的感觉,因为在上一篇文章【iptables(4)之网络地址转换】已经通过 DNAT 完成端口映射的方式实现了本机的端口重定向的功能,而我们这里把端口重定向单独拎出来说是因为还有一个动作是专门来做端口重定向的,它就是 REJECT。
下面我们来准备一下测试的环境,有如下两台主机:
- 主机 A:IP 为
10.0.1.200
,开启 httpd 服务,监听端口8080
(这里如何改端口就不多说了啊); - 主机 B:IP 为
10.0.1.201
;
先在主机 A 中修改一下 Web 首页内容:
$ echo in Host A > /var/www/html/index.html
下面我们就来演示一下 REDIRECT
动作,主机 A 已经有了监听在 8080
端口的 Web 服务,如果我们想要通过主机 B 访问主机 A 的 80
端口时映射到主机 A 的 8080
端口,此时我们需要在主机 A 中添加如下规则:
$ iptables -t nat -A PREROUTING -s 10.0.1.201 -p tcp --dport 80 -j REDIRECT --to-ports 8080
测试使用主机 B 访问一下主机 A 的 80
端口:
$ curl 10.0.1.200
in Host A
就是这么 easy,没啥多说的~~~
日志记录(LOG)
使用 LOG
动作,可以将符合条件的报文的相关信息记录到日志中,但当前报文具体是被“接受”,还是被“拒绝”,都由后面的规则控制,换句话说,LOG
动作只负责记录匹配到的报文的相关信息,不负责对报文的其他处理,如果想要对报文进行进一步的处理,可以在之后设置具体规则,进行进一步的处理。
下例表示将发往 80 号端口的报文相关信息记录在日志中。
$ iptables -I INPUT -p tcp --dport 80 -j LOG
浏览器访问一下 80 端口,查看日志文件(默认为 /var/log/messages
):
$ tailf /var/log/messages
Mar 2 14:07:27 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=60016 DPT=80 WINDOW=2058 RES=0x00 ACK URGP=0
Mar 2 14:07:27 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=679 TOS=0x02 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=56627 DPT=80 WINDOW=2058 RES=0x00 ACK PSH URGP=0
Mar 2 14:07:27 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=56627 DPT=80 WINDOW=2056 RES=0x00 ACK URGP=0
Mar 2 14:07:32 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=56627 DPT=80 WINDOW=2056 RES=0x00 ACK URGP=0
如上图所示,上述规则表示所有发往 22 号端口的 tcp 报文都符合条件,所以都会被记录到日志中,查看 /var/log/messages
即可看到对应报文的相关信息,但是上述规则只是用于示例,因为上例中使用的匹配条件过于宽泛,所以匹配到的报文数量将会非常之多,记录到的信息也不利于分析,所以在使用 LOG
动作时,匹配条件应该尽量写的精确一些,匹配到的报文数量也会大幅度的减少,这样冗余的日志信息就会变少,同时日后分析日志时,日志中的信息可用程度更高。
从刚才的示例中我们已经了解到,LOG 动作会将报文的相关信息记录在 /var/log/message
文件中,当然,我们也可以将相关信息记录在指定的文件中,以防止 iptables 的相关信息与其他日志信息相混淆。
以将 iptables 的日志记录在 /var/log/iptables.log
中为例,修改 /etc/rsyslog.conf
文件(或者 /etc/syslog.conf
),在 rsyslog 配置文件中添加如下配置即可。
$ vim /etc/rsyslog.conf
kern.warning /var/log/iptables.log
完成上述配置后,重启 rsyslog 服务(或者 syslogd):
$ systemctl restart rsyslog
服务重启后,配置即可生效,匹配到的报文的相关信息将被记录到指定的文件中,查看:
$ tailf /var/log/iptables.log
Mar 2 14:13:28 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=52042 DPT=80 WINDOW=65535 RES=0x00 CWR ECE SYN URGP=0
Mar 2 14:13:28 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=52043 DPT=80 WINDOW=65535 RES=0x00 CWR ECE SYN URGP=0
Mar 2 14:13:28 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=52042 DPT=80 WINDOW=2058 RES=0x00 ACK URGP=0
Mar 2 14:13:28 centos7-test-200 kernel: IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:50:56:c0:00:02:08:00 SRC=10.0.1.1 DST=10.0.1.200 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=52043 DPT=80 WINDOW=2058 RES=0x00 ACK URGP=0
LOG
动作也有自己的选项,常用选项如下(先列出概念,后面有示例):
--log-level
选项可以指定记录日志的日志级别,可用级别由高到低排序为emerg
、alert
、crit
、error
、warning
、notice
、info
、debug
。--log-prefix
选项可以给记录到的相关信息添加“标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。
注:
--log-prefix
对应的参数值不能超过 29 个字符。
比如,我想要将主动连接 80
号端口的报文的相关信息都记录到日志中,并且把这类记录命名为 new-conn-from-port-80
,则可以使用如下命令:
$ iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j LOG --log-prefix 'new-conn-from-port-80'
完成上述配置后,我在 IP 地址为 10.0.1.201
的客户端机上,尝试 curl
命令访问上例中的主机(10.0.1.200
),然后查看对应的日志文件(已经将日志文件设置为 /var/log/iptables.log
):
Mar 2 14:22:07 centos7-test-200 kernel: new-conn-from-port-80IN=eth0 OUT= MAC=00:0c:29:ec:96:39:00:0c:29:2b:ac:ef:08:00 SRC=10.0.1.201 DST=10.0.1.200 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41742 DF PROTO=TCP SPT=35574 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
如上图所示,curl
命令的连接操作的报文的相关信息已经被记录到了 /var/log/iptables.log
日志文件中,而且这条日志中包含“标签”:new-conn-from-port-80
,如果有很多日志记录,我们就能通过这个“标签”进行筛选了,这样方便我们查看日志,同时,从上述记录中还能够得知报文的源 IP 与目标 IP,源端口与目标端口等信息,从上述日志我们能够看出,10.0.1.201
这个 IP 想要在 14
点 22
分连接到 10.0.1.200
(当前主机的 IP)的 80
端口,报文由 eth0
网卡进入,eth0
网卡的 MAC 地址为 00:0c:29:ec:96:39
,客户端网卡的mac地址为 00:0c:29:2b:ac:ef
。
评论区