安全矩阵

 找回密码
 立即注册
搜索
查看: 777|回复: 0

iptables防火墙与端口转发

[复制链接]

180

主题

231

帖子

1180

积分

金牌会员

Rank: 6Rank: 6

积分
1180
发表于 2022-12-19 15:55:32 | 显示全部楼层 |阅读模式

iptables防火墙与端口转发

iptables 的结构:iptables -> Tables -> Chains -> Rules


规则、表和链
规则就是我们设置的那些个过滤的条件,一般规则是:如果数据包头满足这样的条件就这样处理数据包。规则指定了源地址、目的地址、传输协议(TCP\UDP\ICMP)等,当数据包与规则匹配的时候,iptables 就根据定义的方法处理这些数据包,如:放行 accept、拒绝 reject、丢弃 drop 等
链就是数据包传播的路径,每一条链中有一条或多条规则,数据包到达一条链时,iptables 就会从该链中的第一条规则开始检查,如果满足规则就根据这个规则定义的方法处理数据包,否则继续检查下一条规则,如果数据包不符合链中任何一条规则,iptables 就根据这条链预先定义的默认策略处理数据包
默认有四个表 filter、NAT、Mangle、Raw
(1)一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转发出去
(2) 如果数据包就是进入本机的,它就会沿着图向下移动,到达 INPUT 链。数据包到了 INPUT 链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达POSTROUTING 链输出
(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD 链,然后到达 POSTROUTING 链输出



使用方法
iptables -F 删除所有规则
iptables -L -v -n  查看规则,其中还有个 -t 表示看哪个表,不指定默认是 filter






设置防火墙





在虚拟机使用 python 启动一个 http 的服务器,监听在 80 端口,正常情况下是可以访问的
使用以下命令设置一个丢弃从 80 端口进来的流量规则,其中-t filter 是指定 filter 表,-A 表示添加,INPUT 是添加的链,-j DROP 表示丢弃,-p 表示协议(TCP\UDP\ICMP\...),--dport 表示端口

iptables -t filter -A INPUT -j DROP -p tcp --dport 80
这时候再访问就不行了

使用以下命令删除规则 -D 表示删除,INPUT 表示删除的链,1 表示链上第一条规则(如果不知道是第几条,使用 iptables -L --line-numbers)

iptables -t filter -D INPUT 1

当然也可以指定某个 IP 不能访问 80 端口:

iptables -t filter -A INPUT -s 192.168.127.128 -j DROP -p tcp --dport 80

指定某个 IP 能访问,其他 IP 不能访问

iptables -t filter -A INPUT -s 192.168.127.128 -j ACCEPT -p tcp --dport 80iptables -t filter -A INPUT -j DROP -p tcp --dport 80
因为匹配顺序是从上往下的,所以如果这个顺序反过来就先匹配到了全都 DROP,直接就给丢弃了,哪怕是 192.168.127.128 也不行

有的时候使用 iptables -L -n 看的不全,比如如果看到有一条

ACCEPT     all  --  0.0.0.0/0        0.0.0.0/0
结果怎么都访问不到,可能是你有个参数没看到,使用 iptables -L -nv 看的仔细一点会发现,in 上有个 lo 表示本地回环,所以白搭

pkts bytes target     prot opt in     out     source               destination            28  4801 ACCEPT     all  --  lo      *       0.0.0.0/0            0.0.0.0/0
比如下面这个场景

iptables -t filter -I INPUT -s 192.168.127.128 -j ACCEPT -p tcp --dport 80iptables -t filter -A INPUT -i lo -j ACCEPT -p alliptables -t filter -A INPUT -j REJECT --reject-with icmp-net-unreachable
这种情况下第一条说的是 192.168.127.128 能访问到我们的 80 端口,第二条表示本地回环的随便访问,第三条表示其他主机一律回应 icmp-net-unreachable

此时查看 iptables 效果如下:

root@research:~# iptables -L -vnChain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination            11  1281 ACCEPT     tcp  --  *      *       192.168.127.128      0.0.0.0/0            tcp dpt:80    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0               0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-net-unreachable----------------------------------------------------------------------------------------------------------------root@research:~# iptables -L -nChain INPUT (policy ACCEPT)target     prot opt source               destination         ACCEPT     tcp  --  192.168.127.128      0.0.0.0/0            tcp dpt:80ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-net-unreachable





端口转发





网络情况如下,我们的电脑是 PC,可以访问 A 设备,但是访问不到 B 设备

在 A 设备上使用 iptables 进行流量的转发,使得 PC 可以通过 A 设备登录到 B 设备的 SSH
这里转发的时候要使用 nat 这个表,PREROUTING 链是流量首先进入的链,经过这个链的处理再干别的,所以我么在这条链上新建了一个规则,把去 192.168.127.170 的 6666 端口的流量修改目的地址为 192.168.47.131:22

iptables -t nat -A PREROUTING -d 192.168.127.170 -p tcp --dport 6666 -j DNAT --to-destination 192.168.47.131:22
然后通过 nat 表 POSTROUTING 链把去往 192.168.47.131:22 的源地址改为 192.168.47.129

iptables -t nat -A POSTROUTING -d 192.168.47.131 -p tcp --dport 22 -j SNAT --to-source 192.168.47.129
上面两条规则实际上就是把流量包里面的源地址和目的地址全都改了,这样来看就成了 192.168.47.129 在和 192.168.47.131 通信了

另外我们把流量包都给改了,数据包出了 PREROUTING 链之后是根据目标地址选择去向的,如果是本机地址那就进入 INPUT 链,如果是其他地址就进入 FORWARD 链,因为我们改了目标地址,所以会进入到 FORWARD 链,而这个链默认会拒绝所有的地址,所以我们得加上一个 192.168.47.131 的 ACCEPT

iptables -I FORWARD 1 -d 192.168.47.131 -p tcp --dport 22 -j ACCEPTiptables -I FORWARD 2 -s 192.168.47.131 -p tcp --sport 22 -j ACCEPT
再试一下,换台电脑,win7,IP 是 192.168.47.130 ,尝试通过端口转发,使用 192.168.127.170 连一下远程桌面

iptables -t nat -A PREROUTING -d 192.168.127.170 -p tcp --dport 9999 -j DNAT --to-destination 192.168.47.130:3389iptables -t nat -A POSTROUTING -d 192.168.47.130 -p tcp --dport 3389 -j SNAT --to-source 192.168.47.129iptables -I FORWARD 1 -d 192.168.47.130 -p tcp --dport 3389 -j ACCEPTiptables -I FORWARD 2 -s 192.168.47.130 -p tcp --sport 3389 -j ACCEPT
参考:

https://www.cnblogs.com/Dicky-Zhang/p/5904429.htmlhttps://wooyun.js.org/drops/Ipta ... %E8%BD%AC%E5%8F%91/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 04:51 , Processed in 0.013116 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表