iptables不仅是防火墙、转发、子网控制,很多人用这个是为了更好的管理服务器的进出网规则,“四表五链”是主要控制项:prerouting\input\forward\output\postrouting的基本工作原理要精准的掌握才好
一、
默认的情况下,linux的iptables至少有三个表格,包括管理本机进出的filter,管理后端主机的nat,管理特殊标志使用的mangle。另外我们还可以自定义。每个表格与其中链的用途:
filter:主要于进入Linux本机的数据包有关,这个时默认的table
INPUT:主要与进入linux本机的数据包有关;
OUTUT:主要与linux发送的数据包有关;
FORWARD:与linux本机比较没有关系,可以转发数据包到后端的电脑中,与nat table的相关性较
高
nat:主要进行来源与目的ip或port的转换。
PREROUTING:在进行路由判断之前进行的规则;
POSTROUTING:在进行路由判断之后进行的规则;
OUTPUT:与发送的包有关;
INPUT:与传入的包有关。
mangle:与特殊的数据包的路由标志有关,较少使用。
详细数据包路线见下图:
1.数据包进入linux主机使用的资源(路径A):在路由判断后确定是向linux主机要求资料的数据包,主要就会透过filter的INPUT链来进行控制;
2.数据包经过linux主机的转发,流向后端(路径B):在路由判断之前进行数据包表头的修改后发现到数据包主要流向防火墙去后端。主要的链是filter的forward以及nat的POSTROUTING,PERROUTING.
3.数据包经过linux本机发送出去(路径C):例如回应用户端的要求,或者主动发送。
二、
本机的iptables语法
1.规则的观察与清除
#iptables [-t tables] [-l] [-nv]
-t:后面接table,例如nat,filter。默认filter
-L:列出目前的table的规则
-n:不进行IP与hostname的反查。
-v:列出更多的资讯Chain INPUT (policy ACCEPT)
#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
其中,
target:代表进行的动作,ACCEPT是放行,而REJECT是拒绝,此外还有DROP(丢弃)
prot:代表使用的协议,主要有tcp udp icmp
opt:额外的选项说明
source:代表此规则是针对哪个(来源IP)进行限制
destination:代表规则是针对哪个(目标IP)进行限制
2.#iptables-save会列出完整的防火墙规则。
#iptables-save [-t table]
3.清除规则
#iptables [-t tables] [-FXZ]
-F:清除所有的规则
-X:清除自定义的chain
-Z:清零计数
4.定义预设政策(policy)
当数据包不在设定的规则之内时,则该数据包通过与否,以policy的设定为准
#iptables [-t table] -P [INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING] [ACCEPT,DROP,REJECT]
例如,#iptables -t nat -P PREROUTING ACCEPT
#iptables [-AI 链名] [-io 网卡] [-p 协议] [-s 来源ip/网络] [–sport 端口] [-d 目标ip/网络] [–dport 端口] -j [ACCEPT|DROP|REJECT|LOG]
-AI 链名:针对某个链进行增加或插入
-io 网卡:设定数据包进出的网卡的规则
-p 协议:设定规则用于哪种协议 tcp udp icmp all
-s 来源ip/网络:设置数据包的来源,例如:
IP: 192.168.1.100
网络:192.168.0.0./24 ,192.168.0.0/24均可
若规则为不允许时,加上! 例如,-s ! 192.168.100.0/24 表示不允许192.168.100.0/24的来源
–sport 端口范围:限制来源端口号码,可以是连续的 1024:65535
-d 目标IP/网络:同 -s
–dport 端口范围:限制目标端口
-j:后面接动作
因为仅有tcp与udp数据包具有端口,所以使用–dport –sport时,得加上-p tcp 或-p udp
例如,设定lo成为受信的装置
#iptables -A INPUT -i lo -j ACCETP
其中没有指定的项目,表示该项目完全接受
#iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
信任eth1连接的内网192.168.100.0
#iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 –sport 1024:65535 –dport ssh -j DROP
只要来自192.168.1.0/24的1024:65535的端口的数据包,且要连接到本机的ssh port的就予以丢弃。
5.iptables的外挂模块 mac和state
#iptables -A INPUT [-m state] [–state 状态]
-m :
state:状态模块
mac:硬件地址
–state :一些数据包的状态
INVALID:无效的数据包
ESTABISHED:已经成功连接
NEW :想建立连接
RELATED:表示这个数据包与我们主机发送出去的数据包有关。
例子,只要建立或相关的数据包通过,其他丢弃
#iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
#iptables -A INPUT -m state –state INVALID -j DROP
例子,针对网卡
#iptables -A INPUT -m mac –mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
–mac-source 就是来源主机的mac
三、NAT服务器的设定
NAT服务器重点在NAT table的PREROUTING 和POSTROUTING链,POSTROUTING在修改来源IP,PREROUTING则在修改目标ip。由于修改的ip不一样,所以就称来源NAT为SNAT及目标NAT为 DNAT。
1.SNAT:修改数据包来源,即ip分享
#iptables -A INPUT -i eth1 -j ACCEPT //eth1是连接内网的网卡
#echo “1”>/proc/sys/net/ipv4/ip_forward //让linux具有router的能力
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
//外部网卡eth0,内网为192.168.1.0
假设对外的ip,即eth0的ip为172.16.81.203,也可以指定ip
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT –to-source 172.16.81.203
2.DNAT :修改数据包目的
DNAT用到的是nat table的prerouting链
假设内部主机ip为192.168.1.101,提供www服务,连接网卡eth1,public ip的网卡为eth0.
#iptables -t -nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.101:80
3.本机端口转发
#iptables -t nat -A PREROUTING -i eth0 -p -tcp –dport 80 -j REDIECT –to-ports 8080
四、保存与重启iptables
#service iptables save && service iptables restart