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

报文流向:
流入本机:PREROUTING –> INPUT–>用户空间进程
流出本机:用户空间进程–>OUTPUT–> POSTROUTING
转发:PREROUTING –> FORWARD –> POSTROUTING
内核中数据包的传输过程:
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
- 如果数据包就是进入本机的,数据包就会到达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 | raw:高级功能,如:网址过滤。 |
规则链名包括:
1 | INPUT链:处理输入数据包。 |
动作包括:1
2
3
4
5
6
7accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
实例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15iptables -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.rpm1
2
安装rinetd
rpm -ivh rinetd-0.62-9.el7.nux.x86_64.rpm1
2
编辑配置文件
vi rinetd.conf
0.0.0.0 1234 127.0.0.1 221
2
启动转发
rinetd -c /etc/rinetd.conf1
2
3
4
5
### ncat 端口转发
netcat(简称nc)被誉为网络安全界的”瑞士军刀“,一个简单而有用的工具,这里介绍一种使用netcat实现端口转发的方法。
安装ncat
yum install nmap-ncat -y1
2
监听本机 9876 端口,将数据转发到 192.168.172.131的 80 端口
ncat –sh-exec “ncat 192.168.172.131 80” -l 9876 –keep-open1
2
3
4
### socat 端口转发
socat安装
yum install -y socat1
2
在本地监听12345端口,并将请求转发至192.168.172.131的22端口。
socat TCP4-LISTEN:12345,reuseaddr,fork TCP4:192.168.172.131:221
2
3
4
### portmap 端口转发
下载地址
http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip1
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端口。`