关闭

企业级网络安全构建之 Iptables

标签: linuxfilter网络安全iptables企业级
81人阅读 评论(0) 收藏 举报
分类:

一、Iptables过滤filter

主要针对网络访问
========================================================


一、安全体系概览
Firewalls --> TCP Wrappers --> Xinetd --> PAM -- > SELinux --> Server specific


二、预备知识:OSI七层模型
HOST_A firefox(封装) --------------- httpd server(解封装)HOST_B
应用层 ftp http smtp pop3 应用层
表示层 表示层
会话层 会话层

传输层 TCP,UDP s_port: xxxx --> d_port: 80 传输层
网络层 IP,ICMP s_IP: 192.168.5.10 --> d_IP: 192.168.5.240 网络层
数据链路层 ARP s_mac: 00:50:fc:12:34:56 --> d_mac: 00:50:fc:12:34:59 数据链路层
物理层 物理层

TCP: 面向连接,可靠的传输协议 类似于三次握手,四次挥手, window,确认, 重传...
UDP: 非面向连接,不可靠的传输协议


、Firewall: netfilter/iptables
netfilter组件 内核空间,是内核一部分
iptables组件 用户空间,提供管理防火墙的手段,通过iptables插入、删除、修改规则


、四张表,五条链
raw--->mangle--->nat-->filter
raw: 主要做连接追踪
mangle: 对数据包进行修改,例如给数据包打标记MARK
nat: 主要修改数据包的地址,例如源地址或目标地址
filter: 实现对数据包的过滤


、数据包的流向图


、iptables语法
iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配后的动作]
小写 大写 大写 小写 大写

示例:
iptables -L
iptables -t filter -L
iptables -t nat -L
iptables -t raw -L
iptables -t mangle -L
========================================================

常见的操作命令:
-L 查看,v详细,n不反解 --line-number
-A 追加,放置最后一条
-I 插入,默认插入成第一条
-D 删除
-F 清空flush
-P 设置默认策略policy

匹配的条件:
-s 192.168.2.0/24 源地址
-d 192.168.2.1 目标地址
-p tcp|upd|icmp 协议
-i lo input 从lo接口进入的数据包
-o eth0 output 从eth0出去的数据包
-p tcp --dport 80 目标端口是80,必须和-p tcp|udp 连用
-p udp --dport 53 目标端口是53/udp

处理动作:
filter:
-j ACCEPT 允许
-j DROP 丢弃
-j REJECT 拒绝
-j LOG 写日志

nat:
-j SNAT 源地址转换
-j DNAT 目标地址转换

mangle:
-j MARK 修改数据包,例如打标记
...

# iptables -t filter -A INPUT -s 192.168.1.0/24 -j SNAT --to 1.1.1.1 错误
========================================================

七、Iptables匹配示例
示例1:
iptables -F
iptables -A INPUT -j REJECT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -nL

示例1存在的问题:
1. 本机无法访问本机
例如:ping 127.0.0.1
解决方案:iptables -I INPUT -i lo -j ACCEPT

2. 本机无法访问其它主机
例如:ssh remote_host
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

3. FTP无法访问
方法一: 为vsftpd指定数据端口
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000

# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT

方法二: 使用连接追踪模块
[root@tianyun ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tianyun ~]# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
[root@tianyun ~]# modprobe nf_conntrack_ftp //加载连接追踪模块(临时)
[root@tianyun ~]# vim /etc/sysconfig/iptables-config //开机自动加载
IPTABLES_MODULES="nf_conntrack_ftp"

nf_conntrack_ftp: 针对数据端口连接时,将三次握手第一次的状态由NEW识别成RELATED

示例2: iptables标准流程
========================================================
[root@tianyun ~]# iptables -F
[root@tianyun ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -i lo -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT //允许内网任何访问,如MySQL,NAS存储
[root@tianyun ~]# iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -p tcp --syn --dport 21 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -j REJECT
[root@tianyun ~]# service iptables save
[root@tianyun ~]# chkconfig iptables on
[root@tianyun ~]# iptables -vnL INPUT
[root@tianyun ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
[root@tianyun ~]# service iptables restart

小知识:
常见协议的端口 /etc/services
[root@tianyun ~]# grep ^http /etc/services
服务 协议 端口/传输协议
sshd ssh 22/tcp
httpd http 80/tcp
https 443/tcp
dns domain 53/udp,53/tcp
mail smtp 25/tcp
smtps 465/tcp
pop3 110/tcp
pop3s 995/tcp
imap 143/tcp
imaps 993/tcp
dhcp bootps 67/udp
nfs nfs 2049/tcp
samba 137,138,139/tcp
445/tcp
ftp ftp 21/tcp
ftp-data 20/tcp
ntp ntp 123/udp
syslog syslog 514/udp
========================================================


示例3: 配置实例
一些常见允许外网访问的服务:
网站 www http 80/tcp
https 443/tcp
远程管理: SSH 22/tcp

一些常见不允许外网访问的服务:
文件服务器: NFS
SAMBA
FTP 20/tcp,21/tcp

[root@tianyun ~]# iptables -F
[root@tianyun ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -i lo -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -p tcp --syn --dport 443 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tianyun ~]# iptables -A INPUT -j REJECT

配置该策略后:
1. 员工在公司内部(192.168.2.0/24,192.168.3.0/24)能访问服务器上的任何服务
2. 当员工出差例如在上海,通过VPN连接到公司
外网 (员工) ===拨号到==> VPN服务器 =====> 内网FTP,SAMBA,NFS,SSH
3. SSH通常通过Jump Server连接
========================================================
二、
导流: 必须打开kernel ip_forward
KVM或Openstack中的虚拟机和外部通信通过iptables导流
Docker中的容器和外部通信通过iptables导流

SNAT 源地址转换 出口POSTROUTING
MASQUERADE 源地址转换 出口POSTROUTING
DNAT 目标地址转换 进口PREROUTING
REDIRECT 端口重定向 进口PREROUTING


==路由转发ip_forward==
当前的状态

file://C:\Users\zjyh\AppData\Local\Temp\ct_tmp/1.png


设置kernel参数,开机自动设置
file://C:\Users\zjyh\AppData\Local\Temp\ct_tmp/2.png



==宿主机host==
file://C:\Users\zjyh\AppData\Local\Temp\ct_tmp/3.png




一、SNAT,MASQUERADE 源地址转换
作用:让KVM虚拟机访问外部主机 POSTROUTING 路由之后
kvm_instance(192.168.122.0/24)---> 192.168.122.1 virbr0 eth0 172.16.100.1 ---> 172.16.100.254 外部主机
eth1 x.x.x.x
方法一:
[root@tianyun ~]# iptables -t nat -F
[root@tianyun ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j SNAT --to 172.16.100.1
[root@tianyun ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j SNAT --to 172.16.100.1

方法二:
[root@tianyun ~]# iptables -t nat -F
[root@tianyun ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
[root@tianyun ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE


二、DNAT 目标地址转换
作用:让外部主机可以访问KVM虚拟机(内网主机) PREROUTING 路由之前
建议:内网主机能访问外部主机(例如基于SNAT方式)
kvm_instance(192.168.122.0/24) <--- 192.168.122.1 virbr0 eth0 172.16.100.1 <--- 172.16.100.254 外部主机
eth1 x.x.x.x
[root@tianyun ~]# iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to 192.168.122.43:80
[root@tianyun ~]# iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 2222 -j DNAT --to 192.168.122.43:22
[root@tianyun ~]# iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 8080 -j DNAT --to 192.168.122.43:8080

[root@tianyun ~]# iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to 192.168.122.43:8080
[root@tianyun ~]# iptables -t nat -A OUTPUT -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to 192.168.122.43:8080



思考:如果有两台内网服务器需要提供80/tcp服务,如何映射?
[root@tianyun ~]# iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to 192.168.122.43:80
[root@tianyun ~]# iptables -t nat -A PREROUTING -d 172.16.100.2 -p tcp --dport 80 -j DNAT --to 192.168.122.53:80

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:975次
    • 积分:60
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档