一个iptables的小案例。
写一个脚本,并执行它。
在编辑之前可以先看iptables的规则,和之后会有对比
[root@litongyao ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[root@litongyao ~]# vim /usr/local/sbin/iptables.sh
ipt="/usr/sbin/iptables" (定义一个全局变量)
$ipt -F (计数器清零)
$ipt -P INPUT DROP (把进来的数据包链DROP掉)
$ipt -P OUTPUT ACCEPT (本机的数据包可以出去)
$ipt -P FORWARD ACCEPT (目标不是本机地址的可以通行)
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT (指定状态,RELATED和ESTABLISHED是要同时存在的,详细见下)
$ipt -A INPUT -s 192.168.52.0/24 -p tcp --dport 22 -j ACCEPT (指定只要源地址是这个网段的ip都可以远程连接ssh)
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT (开放本机的80端口)HTTP服务
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT (开放本机21端口)FTP服务
[root@litongyao ~]# sh /usr/local/sbin/iptables.sh sh执行这个命令
再来看看iptables的规则:
[root@litongyao ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
64 4472 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 192.168.52.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
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 37 packets, 3556 bytes)
pkts bytes target prot opt in out source destination
可以看到我们写的脚本都被加入了规则里,这里注意的是,没有运行service iptables save,就不会保存规则,重启即可恢复
实验:关于icmp的小案例 (在开始这个小案例之前,需要把上一条规则恢复默认,既重启服务)
[root@litongyao ~]# service iptables restart
下面执行一条命令:
[root@litongyao ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
我们ping外网,发现没有问题,可以ping通,用别的主机ping自己的时候,却发现ping不通了
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
Iptables的四种状态:
NEW
NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接的第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。
ESTABLISHED
ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。
RELATED
RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有关联的,如果没有在iptables的策略中配置RELATED状态,FTP-data的连接是无法正确建立的,还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID
INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西,因为防火墙认为这是不安全的东西
nat表的两个应用
-
1A机器有两个网卡。一个外网网卡。一个内网网卡。B机器有一个网卡,只有一个内网网卡。需求:B机器可以上网(路由器)
准备工作:
1.给litongyao虚拟机增加一块内网网卡,并设置为LAN区段,(如果没有LAN区段。则需要增加一个区段。)
2.给内网网卡设置一个IP和网段。
[root@litongyao ~]# ifconfig ens37 192.168.100.100/24
(这种方法设置的ip是临时性的,重启后就会失效。可以复制ens33的配置文件改名为ens37,并修改里面的配置)
3.给xuniji的内网网卡设置一个ip。(因为没有外网网卡。所以不能远程登录连接)
[root@xuniji ~]# ifconfig ens33 192.168.100.50/24
4.检查
用一台去Ping另外一台机器,如果Ping通,则准备工作完成
实验:
-
打开A机器端口转发,并更改防火墙设置
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。
[root@litongyao ~]# cat /proc/sys/net/ipv4/ip_forward (默认是0,则表示端口转功能关闭)
0
[root@litongyao ~]# echo "1" > /proc/sys/net/ipv4/ip_forward (打开端口转发功能,将0修改成1)
[root@litongyao ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@litongyao ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
2.设置B机器的网关
[root@litongyao ~]# route -n (查看网关的命令)
[root@litongyao ~]# route add default gw 192.168.100.1 (增加一个192.168.100.1的网关)
2.C机器只能和A机器通信,让C机器可以连通B机器的22端口(端口映射)
工作:
-
A机器上打开端口转发
[root@litongyao ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
2.A机器上更改防火墙配置 (最好恢复默认的配置,以免出现偏差)
[root@litongyao ~]# iptables -t nat -A PREROUTING -d 192.168.52.100 -p tcp --dport 1122 -j DNAT --to 192.168.100.50:22
[root@litongyao ~]# iptables -t nat -A POSTROUTING -s 192.168.100.50 -j SNAT --to 192.168.52.100
3.B机器上设置网关
实验:用xshell试着连接192.168.52.100:1122,看是否能映射到B机器的192.168.100.50