iptables 使用 快速教程

zjhqlmzldx 2017-11-02

    linux的netfilter模块不仅可以拦截数据包,还可以转发数据包。iptables 是一个配置netfilter的工具。

原理

   整个原理可见下图。数据进入后,只有两条路可走,如果目的地址是本机,就由本机处理,不是则可以转发。

   
iptables 使用 快速教程
 

    PREROUTING,FORWARD,POSTROUNT,INPUT,OUTPUT 是netfilter提供的钩子,在这些钩子上,可以定义规则,对数据包进行处理。处理的种类包括:过滤(filter),转发(nat),数据包修改(mangle,raw)。netfilter把这些种分别放在四张表中:filter,nat,mangle,raw。在这些表中放入了各种规则。iptables就是对这些内容进行配置。

命令格式

   

#iptables 目的 操作 规则

  目的是由两个组成:钩子和表 ,

    指定表是由 -t 指定 ,-t 后可跟 nat,filter,mangle,raw

    表则直接跟在 操作 后面。可先INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

    操作则包括 增(-A)删(-D)改(-R)查(-L)插入(-L)清除(-F)默认结果(-P)自定义分组(-N)

    规则则由两部分组成:检测规则与结果 

    检查规则包括 源地址(-s),目标地址(-d) ,进入的网卡(-i),出去的网卡(-o),协议 (-p),端口(--dport)

    结果则是对数据包的操作:-j ACCEPT | REJECT | DROP |SNAT |DNAT |MASQUERADE

    考虑到检查与结果的复杂性,netfilter 还有许多插件 ,插件可以对检查规则和操作进行扩展定义。

    插件由 -m 指定,关于各种扩展,可查看手册 

man 5 iptables-extensions

    举例:

iptables -t nat -I POSTROUTING -s 192.168.135.0/24 -j SNAT --to 192.168.137.77
#就是说 在 POSTROUTING的勾子上,进行nat操作,源地址是192.168.135.0/24 的,就修改源地址成
192.168.137.77

   

启用

yum install -y iptables-services
systemctl enable iptables.service

#如果有firewalld ,关闭
systemctl stop firewalld
systemctl disable firewalld

   

查看规则

iptables -vnL

保存规则

默认设置下,iptables 进行改动后,并不会主动保存,下次开机会丢失,所以要手工保存。

/usr/libexec/iptables/iptables.init save

 如果的想自动保存,则要在关机脚本里进行触发保存,用systemd 管理下,修改/etc/sysconfig/iptables-config

IPTABLES_SAVE_ON_STOP="yes"

基本配置

#屏蔽所有请求
iptable -A INPUT -j REJECT

#允许127.0.0.1可访问,因为netfilter默认是对物理网口起效,所以要对本机回环加规则
iptables -I INPUT -d lo -j ACCEPT

#允许本机可ping
iptables -I INPUT -p icmp -j ACCEPT

#允许本机对外访问任何地址与端口,由于本机主动向外请求时,目的IP与端口都不可预测,
#所以,不能按目的信息过滤。但本机主动发起请求的包,有个特征是状态是RELADTED,ESTABLISHED
iptables -I INPUT -m state --state RELAED,ESTABLISHED -j ACCEPT

#开放SSH
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

FTP

  

#FTP的登录端口是21
iptables -I INPUT -t tcp -dport 21 -j ACCEPT

#如果客户端采用主动模式 passive on ,需要FTP服务器主动从20端口向客户端指定的端口连接,
#所以需要保证下面一条存在
iptables -I INPUT -m state --state RELAED,ESTABLISHED -j ACCEPT

#如果客户端采用被动模式,FTP服务器需要开放随机的端口给客户端,由于端口是随机的,所以不能
#指定单一的端口。有两种办法
# 1. 指定的端口范围,比如50000-60000之间,需要FTP的配置文件中指定,同时在iptables中开放
#   这些端口
#    ftp配置文件/etc/vsftpd/vsftpd.conf中加入
#    pasv_min_port=50000
#    pasv_max_port=60000

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

# 2. 更简单的办法是用 iptables的模块,nf_conntrack_ftp
#在/etc/sysconfig/iptables-config 中加入配置:
#IPTABLES_MODULES="nf_conntrack_ftp" 

 

NAT

    若让内网中的电脑能够与外网通讯,其中一种技术是NAT。

#两台机器,A机器网址是内网eth0: 192.168.135.20/24 ,
#另一台B机器有两块网卡,分别是内网eth1: 192.168.135.10/24,  eth0:外网 192.168.137.77/24
在A机器上配置/etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
IPADDR=192.168.135.20
NETMASK=255.255.255.0
GATEWAY=192.168.135.10
DNS1=192.168.137.1

NAT是一种数据转发,所以B机器需要打开转发开关

sysctl -w net.ipv4.ip_forward=1

内网机器需要访问外网资源,需要做SNAT 或者 MASQUERADE。推荐使用MASQUERADE方式,这样可避免外网网卡的地址变化

#在B机器上SNAT
 iptables -t nat -I POSTROUTING -s 192.168.135.0/24 -j SNAT --to 192.168.137.77
#在B机器上MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.135.20 -o eth0 -j MASQUERADE
 

外网需要访问内网上的资源,比如A机器的80端口,要做DNAT

iptables -t nat -I PREROUTING -d 192.168.137.77 -p tcp --dport=8080 -j DNAT --to 192.168.135.20:80
  
 
 
 

相关推荐

老谢的自留地 / 0评论 2020-05-31