一、iptables filter表小案例
需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.188.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。
这个需求写一个脚本,内容如下:
# vi /usr/local/sbin/iptables.sh
#! /bin/bash
ipt="/usr/sbin/iptables" //ipt:定义了一个变量,应写绝对路径。
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT (一定要加)
$ipt -A INPUT -s 192.168.93.0/24 -p tcp --dport 22 -j ACCEPT 想放行的源IP和24端口
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT 下面就是加端口
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
写完后保存,直接运行/bin/sh/usr/local/sbin/iptables.sh即可。
sh命令:执行命令从标准输入读取或从一个文件中读取。读取文件里的内容来执行。
# sh /usr/local/sbin/iptables.sh
# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
30 1980 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 192.168.188.0/24 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
-m state --state RELATED,ESTABLISHED -j ACCEPT
作用:为了让下面的数据包和端口更顺利的相互连接。
RELATED:编译员。
ESTABLISHED:保持连接。
如果想开机启动时初始化防火墙规则,
则需要在/etc/rc.d/rc.local中添加一行/bin/sh /usr/local/sbin/iptables.sh。
icmp案例
# iptables -I INPUT -p icmp --icmp-type 8 -j DROP 增加这条规则 -I
# iptables -D INPUT -p icmp --icmp-type 8 -j DROP 删除这条规则 -D
--icmp要和-p icmp一起使用,后面指定类型编号。8指的是能在本机ping通其他机器,而其他机器不能ping通本机。(牢记)
二、iptables nat表应用
需求1:两台机器A和B。A的ens33能连外网,ens37仅是内网,B只有ens37,和A的ens37可以通信互联。
准备工作:进虚拟机设置,将A和B两台机器都添加一个网卡,给第二个网卡设置一个LAN区段,区段名字自定义即可,将A和B的第2个网卡都连接同一个LAN区段。
LAN区段:相当于是一台内网的交换机,Windows连不上。
连上同一台交换机两台机器就能相互通信了。
# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens37
# vi /etc/sysconfig/network-scripts/ifcfg-ens37
给第二个网卡设置一个IP,修改NAME,DEVICE,IPADDR即可。
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.100.1 这个IP的网段和主网卡的网段不要一样的。
这样也可以改,但只是临时生效,重启就没了:# ifconfig ens37 192.168.93.133/24
B机器由于不能连外网了,就只能进虚拟机操作,虽然停用了ens33,为了保险,ifdown掉它。然后给同样拷贝ens33给ens37设置个IP。
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.100.10
然后可以先ping一下A机器的ens37网卡,若不通,先ping一下自己,看网卡连接了没有(mii-tool ens33),检查一下两台机器的IP。
# echo "1" > /proc/sys/net/ipv4/ip_forward 打开路由转发功能,该文件默认是0
# iptables -t nat -A POSTROUTING -s 192.168.98.1/24 -o ens33 -j MASQUERADE
-s想要给能连外网的IP。-o出口的有外网的网卡名。
到B机器上设置一个网关。
# route add default gw 192.168.98.134(或133,为默认网关,不可随意设置)
# route del default gw 192.168.98.134可以删除网关
可以route -n查看到。此时这台B机器就能ping通外网了。加个DNS就能ping通DNS和域名了。
# vi /etc/resolv.conf
nameserver 119.29.29.29
需求2:C只能和A通信,让C机器可以直接连通B机器的22端口。
让A机器做一个跳转作用,这就叫端口映射。把B机器的22端口映射出来,A机器的外网22端口是有的状态,比如映射成1122,实际上就是访问1122端口的时候就是在访问B机器的22端口。
1.打开A机器的端口转发。
# echo "1" > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -D POSTROUTING -s 192.168.98.1/24 -o ens33 -j MASQUERADE
先删掉之前的规则,以免影响后面的操作。
A上执行:# iptables -t nat -A PREROUTING -d 192.168.93.130 -p tcp --dport 1122 -j DNAT --to 192.168.98.134:22 进去的包
A上执行:# iptables -t nat -A POSTROUTING -s 192.168.98.134 -j SNAT --to 192.168.93.130 回来的包
还需要给B机器加上网关,因为前面做过了所以省略
B上执行:# route add default gw 192.168.98.134
再新建一个会话
连接即可。可以ifconfig发现是B机器的IP。
原文地址:http://blog.51cto.com/13576245/2090915