linux下iptables总结

基本概念

在linux操作系统中,Netfilter组件是集成在linux内核中扩展各种网络服务的结构化底层框架,在内核级提供防火墙功能。内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。

avatar

报文流向:

流入本机:PREROUTING –> INPUT–>用户空间进程

流出本机:用户空间进程–>OUTPUT–> POSTROUTING

转发:PREROUTING –> FORWARD –> POSTROUTING

内核中数据包的传输过程:

  1. 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
  2. 如果数据包就是进入本机的,数据包就会到达INPUT链。经INPUT链检查后,数据包被发往本地进程。本地进程进行相应处理后发送响应数据包,数据包经过OUTPUT链,然后到达POSTROUTING链输出;如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

企业内部的主机A若配了一个公网地址6.6.6.6,访问互联网上其他网段的公有地址不受限制,但若访问互联网上同网段的地址即6.0.0.0/8网段的地址,由于A的路由表就有到达该网段的路由记录,就直接访问了,不会去查询路由器,但是实际上访问的不是互联网上的主机,而是本地局域网的主机,也就是说该网段的所有公有地址A都将无法访问。所以企业内部的主机一般是私有地址,但是互联网上没有私有地址的路由,也就是说私有地址无法连接互联网,可以利用防火墙的nat表(network address translation 地址转换规则表)将私有地址转换为公有地址再去访问互联网。

SNAT

企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B,B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C;C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B,B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。

在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。

不能在防火墙B的prerouting链上设置转换源地址的防火墙策略,因为若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。

DNAT

互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。利用这种机制可以将企业内部的服务发布到互联网。

在这个过程中,修改了请求报文的目标地址,叫做DNAT(destination NAT POSTROUTING),用于互联网访问局域网。

必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。

iptables -t nat -A PREROUTING -d 本机IP -p tcp –dport 本机端口 -j DNAT –to-destination 目标机IP:目标机端口
iptables -t nat -A PREROUTING -d 192.168.172.130 -p tcp –dport 8000 -j DNAT –to-destination 192.168.172.131:80
iptables -t nat -A POSTROUTING -d 192.168.172.131 -p tcp –dport 80 -j SNAT –to 192.168.172.130

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> –sport 源端口 <-d 目标IP/目标子网> –dport 目标端口 -j 动作

iptables -t nat -A PREROUTING -d 10.175.131.164 -p tcp –dport 8000 -j DNAT –to-destination 192.168.122.232:80
iptables -t nat -A POSTROUTING -d 192.168.122.232 -p tcp –dport 80 -j SNAT –to 10.175.131.164

iptables命令

iptables命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。

iptables命令选项输入顺序:

1
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

表名包括:

1
2
3
4
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
nat:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。

规则链名包括:

1
2
3
4
5
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。

动作包括:

1
2
3
4
5
6
7
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
iptables -t nat -A PREROUTING -d 10.175.131.164 -p tcp --dport 8000 -j DNAT --to-destination 192.168.122.232:80
iptables -t nat -A POSTROUTING -d 192.168.122.232 -p tcp --dport 80 -j SNAT --to 10.175.131.164

显示规则
iptables -L INPUT --line-numbers

删除一条规则
iptables -D INPUT 7
```

### rinetd 端口转发

rinetd是一个轻量级TCP转发工具,简单配置就可以实现端口映射/转发/重定向。

源码下载

wget https://li.nux.ro/download/nux/misc/el7/x86_64/rinetd-0.62-9.el7.nux.x86_64.rpm

1
2

安装rinetd

rpm -ivh rinetd-0.62-9.el7.nux.x86_64.rpm

1
2

编辑配置文件

vi rinetd.conf
0.0.0.0 1234 127.0.0.1 22

1
2

启动转发

rinetd -c /etc/rinetd.conf

1
2
3
4
5

### ncat 端口转发
netcat(简称nc)被誉为网络安全界的”瑞士军刀“,一个简单而有用的工具,这里介绍一种使用netcat实现端口转发的方法。

安装ncat

yum install nmap-ncat -y

1
2

监听本机 9876 端口,将数据转发到 192.168.172.131的 80 端口

ncat –sh-exec “ncat 192.168.172.131 80” -l 9876 –keep-open

1
2
3
4

### socat 端口转发

socat安装

yum install -y socat

1
2

在本地监听12345端口,并将请求转发至192.168.172.131的22端口。

socat TCP4-LISTEN:12345,reuseaddr,fork TCP4:192.168.172.131:22

1
2
3
4

### portmap 端口转发

下载地址

http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip

1
2

监听本地1234端口,转发给192.168.172.131的22端口

./portmap -m 1 -p1 1234 -h2 192.168.172.131 -p2 22
08、portfwd端口转发
portfwd是meterpreter中内置的功能,也提供了单机版,用于TCP/UDP端口转发服务
Github 项目地址:
https://github.com/rssnsj/portfwd
(1)下载编译
git clone https://github.com/rssnsj/portfwd.git
cd portfwd/src
make
(2)将本地的12345端口转发到192.168.172.131:22

./tcpfwd 0.0.0.0:12345 192.168.172.131:22
09、NATBypass端口转发
一款lcx(htran)在golang下的实现
Gihub项目地址:
https://github.com/cw1997/NATBypass
(1)内网主机主动连接外网主机打通隧道
在目标机器上执行:nb -slave 127.0.0.1:3389 公网IP:51
在公网的机器执行:nb -listen 51 3340
在公网主机上连接 127.0.0.1:3340,即可连接上内网机器的3389端口。
`

参考文章

  1. https://blog.csdn.net/beanewself/article/details/78317626
  2. https://cloud.tencent.com/developer/article/1688152
  3. https://www.jianshu.com/p/d3f30fb9ebf6
  4. https://blog.csdn.net/lizhigang_bj/article/details/80495395