iptables
iptables 4表5链!!! 非常重要!!!
4个表(全部小写):
nat表 (地址转换表)
filter表(数据过滤表)
raw表 (状态跟踪表)
mangle表(包标记表)
备注:最常用的是nat和filter表,但是全部4个表都要记住!
5个链(全部大写):
INPUT链 (入站规则)
OUTPUT链 (出站规则)
FORWARD链 (转发规则)
PREROUTING链 (路由前规则)
POSTROUTING链 (路由后规则)
它读规则的顺序:从上往下读,匹配即停止!如果没有匹配,则匹配默认规则(可以是默认的允许或拒绝)!
#######################################################################
注意事项:
可以不指定表,默认为filter表
查的时候,可以不指定链,默认为对应表的所有链
如果没有找到匹配条件,则执行防火墙默认规则
选项/链名/目标操作用大写字母,其余都小写!严格区分大小写!!
########################################################################
目标操作:(这是一个动作)
ACCEPT:允许通过
DROP:丢弃,不给任何回应
REJECT:拒绝,会给出提示
LOG:记录日志,然后传给下一条规则
###########################################################################
选项
iptabels语法格式
# iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
解析:-t代表是哪个表table
注意:-I后面的INPUT等,和-j后面的DROP等,这样的关键字要大写!!!
查看规则:
-L 查看iptables的所有规则
-n 以数字形式来显示地址、端口等信息
--line-numbers 查看规则时,显示规则的行号
添加规则:
-I 单词全名insert,添加到规则的第一条!尽量用-I来添加规则!
-A 单词全名append,追加到规则的最后一条!
删除规则:
-D 删除指定的一个链,后面加数字
-F 清空所有的规则
默认规则:
-P 这是大写的P,为指定的链设置默认规则
其他:
-p 后面跟的是协议,如tcp、udp、icmp等
-j 后面跟的是链,如ACCEPT、DROP和REJECT等
######################################################################
关闭firewalld,启动iptables服务
10
关闭firewalld服务器
# systemctl stop firewalld.service
# systemctl disable firewalld.service
安装iptables-services并启动服务
# yum -y install iptables-services
# systemctl start iptables.service
# iptables -t filter -nL 显示filter数据过滤表。
显示如下:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
##################################################################
10
# iptables -t nat -nL 显示nat地址转换表
显示如下:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192.168.122.0/24 224.0.0.0/24
RETURN all -- 192.168.122.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
##############################################################
10
# iptables -t filter -F 清空filter表
# iptables -t filter -nL 发现真的清空了filter表
显示如下:
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
#######################################################################
20
# ping 192.168.4.10 此刻能ping得通10
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=64 time=0.699 ms
... ...
#######################################################################
10
iptabels语法格式
# iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
# iptables -t filter -I INPUT -p icmp -j REJECT 这里的REJECT是拒绝通过。
插入规则到filter数据过滤表的INPUT进口链这里,REJECT拒绝任何人使用icmp协议(可以用来ping的协议)访问本机。
就是不允许别人ping我。
#######################################################################
20
# ping 192.168.4.10 被10明确拒绝访问了,目标不可达
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
From 192.168.4.10 icmp_seq=1 Destination Port Unreachable
... ...
#######################################################################
10
# iptables -t filter -I INPUT -p icmp -j DROP 这里的DROP是直接丢弃,不给出任何回应
#######################################################################
20
# ping 192.168.4.10 一直都没有回应!!!
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
#######################################################################
10
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
... ...
# iptables -nL --line-numbers 加了--line-numbers,能显示行号
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- 0.0.0.0/0 0.0.0.0/0
2 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
... ...
如果只看某个链的规则,在后面加指定的链就行了。仅查看INPUT链的规则
# iptables -nL INPUT
#######################################################################
ssh走的是TCP协议,如果设置拒绝TCP,那么就无法远程了!!!
工作中不能这样做,很危险!!!就无法远程服务器了!!!
# iptables -A INPUT -p tcp -j ACCEPT 不写表名,默认是filter表。选项-A,是添加在最后一行!!!
追加规则至filter表中的INPUT链的末尾,允许任何人使用TCP协议访问本机
# iptables -nL --line-numbers 可以看到刚添加的规则在最后 1 行
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- 0.0.0.0/0 0.0.0.0/0
2 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
... ...
#############################################################################
尽量用-I来加规则!!!
后面不写数字的话,默认加在第1行。写数字,则对应在那一行!!!
# iptables -I INPUT -p udp -j ACCEPT 选项-I是在第1行添加
# iptables -nL --line-numbers 可以看到刚添加的规则在第 1 行
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
2 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 此时第2行是丢弃别人ping本机的请求
3 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
... ...
# iptables -I INPUT 2 -p icmp -j ACCEPT
插入规则到filter表中的INPUT链的第2行,允许任何人使用ICMP协议访问本机
# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 此时第2行是允许别人ping本机的请求
3 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 原本的第2行变成了第3行,丢弃别人ping本机的请求
4 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
... ...
先匹配第2行,匹配即停止,所以允许别人ping本机。
#################################################################
20
# ping 192.168.4.10 现在可以ping通主机10了
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=64 time=0.434 ms
... ...
#################################################################
删除规则,清空所有规则。
要养成一个好习惯,做实验,上来先iptables -F 先清空规则,再设置!
10
# iptables -D INPUT 3 删掉filter表中INPUT链的第3条规则
# iptables -nL --line-numbers 发现原本第3条的DROP规则已经被删除掉了
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
... ...
# iptables -F 清空filter表中所有链的防火墙规则。
# iptables -nL INPUT 现在再查就没有规则了
Chain INPUT (policy ACCEPT)
target prot opt source destination
# iptables -F 不写表名,默认是清空filter表中所有链的防火墙规则。
# iptables -t nat -F 清空nat表中所有链的防火墙规则
# iptables -t raw -F 清空raw表中所有链的防火墙规则
# iptables -t mangle -F 清空mangle表中所有链的防火墙规则
#################################################################
设置防火墙默认规则。当查看规则时,默认规则就是在()里面的内容。
# iptables -nL
Chain INPUT (policy ACCEPT) 在( )里面的默认规则是允许
target prot opt source destination
... ...
# iptables -F
# iptables -I INPUT -p tcp -j ACCEPT 要先允许TCP通过!否则后面设置默认规则拒绝时,远程才不会断开!
# iptables -nL INPUT 查看INPUT链的规则,可以看到现在默认规则是允许
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
# iptables -P INPUT DROP 设置INPUT链的默认规则是丢弃(拒绝前,一定要先允许TCP通过,否则远程就会断开了)
# iptables -nL INPUT
Chain INPUT (policy DROP) 此刻默认规则是丢弃
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
此刻20是ping不通主机10的,一直没有回应。
# iptables -P INPUT ACCEPT 一定记得设置回来,默认规则允许,否则之后实验很麻烦
# iptables -nL INPUT 确认一下
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
# iptables -Ln 不能反着打,会报错
iptables: No chain/target/match by that name.
#################################################################
根据防火墙保护的对象不同,防火墙可以分为主机型防火墙与网络型防火墙。
主机型防火墙,保护服务器本机(过滤威胁本机的数据包)。
网络防火墙,保护防火墙后面的其他服务器,如web服务器、FTP服务器等。
# iptables -F
# iptables -I INPUT -s 192.168.4.20 -p icmp -j REJECT
# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 REJECT icmp -- 192.168.4.20 0.0.0.0/0 reject-with icmp-port-unreachable
... ...
也可以拒绝一个网段,如果有域名解析的话,也可以写域名!
# iptables -I INPUT -s 192.168.4.0/24 -p icmp -j REJECT
如果本机有2个网卡,一个是192.168.4.10,一个是192.168.2.10。
那么拒绝4.0网段的主机来访问我们后,别人还可以访问我们的2.10这个网卡。
###########################################################################
通用匹配
协议匹配:-p 协议名称
地址匹配:-s 源地址、-d 目标地址
接口匹配:-i 接受数据的网卡、-o 发送数据的网卡
隐含匹配
端口匹配:--sport 源端口号、--dport 目标端口号
ICMP类型匹配:--icmp-type ICMP 类型
###########################################################################
主机型防火墙
10
# iptables -F
# iptables -I OUTPUT -d 192.168.4.254 -p icmp -j REJECT 设置本机不能ping真机254
# ping 192.168.4.20 发现可以ping主机20
PING 192.168.4.20 (192.168.4.20) 56(84) bytes of data.
64 bytes from 192.168.4.20: icmp_seq=1 ttl=64 time=0.726 ms
# ping 192.168.4.254 发现无法ping真机了
PING 192.168.4.254 (192.168.4.254) 56(84) bytes of data.
From 192.168.4.10 icmp_seq=1 Destination Port Unreachable
ping: sendmsg: 不允许的操作
###########################################################################
10 给eth1配192.168.2.10
# nmcli connection add type ethernet con-name eth1 ifname eth1 connection.autoconnect yes
# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.10/24 connection.autoconnect yes
# nmcli connection up eth1
# systemctl restart network
# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.10 netmask 255.255.255.0 broadcast 192.168.4.255
... ...
# ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
... ...
# iptables -F
# iptables -I INPUT -s 192.168.4.254 -p icmp -i eth0 -j REJECT 禁止真机ping本机的eth0。但不限制ping网卡eth1
############################################################################
真机
# ping 192.168.4.10 无法ping通4.10
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
From 192.168.4.10 icmp_seq=1 Destination Port Unreachable
# ping 192.168.2.10 可以ping通2.10
PING 192.168.2.10 (192.168.2.10) 56(84) bytes of data.
64 bytes from 192.168.2.10: icmp_seq=1 ttl=64 time=0.425 ms
#######################################################################
10
# nginx 启动nginx网页服务
#####################################################################
真机
# curl 192.168.4.10 现在可以访问得到10的网页
hello10
#####################################################################
10
# iptables -F
# iptables -I INPUT -p tcp --dport 80 -j REJECT 拒绝别人访问我们的端口80
# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
#####################################################################
真机
# curl 192.168.4.10 现在可以访问不了10的网页了
curl: (7) Failed connect to 192.168.4.10:80; 拒绝连接
#####################################################################
源端口一般都是随机端口,所以工作中一般不会用--sport来限制!!!
# iptables -F
# ss -antup | grep :80
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=6496,fd=6),("nginx",pid=6495,fd=6))
tcp ESTAB 0 0 192.168.4.10:80 192.168.4.254:58450 users:(("nginx",pid=6496,fd=3))
##########################################################
网络型防火墙
准备环境
proxy (充当转发的路由器)
eth0:192.168.4.5
eth0:192.168.2.5
client (客户端)
eth0:192.168.4.100
网关:192.168.4.5
web1 (网站服务端)
eth1:192.168.2.100
网关:192.168.4.5
我们要注意的是,因为要验证通过iptables来控制不同网段的通信,所以web1和client都只能有一个在用的网卡。
也就是说,client只能有eth0,4.100。web1只能有eth1,2.100,它们是不同网段。
##########################################################
添加网关的命令
主机client
# nmcli connection modify eth0 ipv4.gateway 192.168.4.5
# nmcli connection up eth0
主机web1
# nmcli connection modify eth1 ipv4.gateway 192.168.2.5
# nmcli connection up eth1
#########################################################
确认不同网络的联通性
主机client
# ping 192.168.2.100
主机web1
# ping 192.168.4.100
###########################################################
proxy 一定要把proxy主机的路由转发功能打开。
以下操作仅当前有效,计算机重启后无效
# echo 0 > /proc/sys/net/ipv4/ip_forward 关闭路由转发。此时web1是ping不通client的。
# echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由转发。此时web1可以ping通client。
修改/etc/sysctl.conf配置文件,可以实现永久有效规则
# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
###############################################################
web1 启动http服务
# yum -y install httpd
# systemctl restart httpd
# echo "192.168.2.100" > /var/www/html/index.html
# cat /var/www/html/index.html
192.168.2.100
###############################################################
没有防火墙的情况下client访问web服务
主机client
# curl 192.168.2.100
192.168.2.100
#############################################################
proxy 设置proxy主机的防火墙规则,保护防火墙后面的Web服务器
# iptables -F
# iptables -I FORWARD -s 192.168.4.100 -p tcp --dport 80 -j REJECT 拒绝4.100访问本机的80端口网页
###############################################################
client
# curl 192.168.2.100 无法访问web服务了
curl: (7) Failed connect to 192.168.2.100:80; 拒绝连接
#############################################################
proxy
# iptables -F
# iptables -I FORWARD -s 192.168.4.100 -p tcp --dport 22 -j REJECT 我们本意是不想让4.100远程所有的主机,包括本机
这里设置的规则是,插入规则到filter过滤数据表的,FORWARD转发数据链中,拒绝源IP4.100去远程(tcp的22端口)。
因为当前4.100的网关是proxy本机,如果4.100想要远程其他不同网段的主机时,的确是会被拒绝的。
但是当它远程同一个网段的主机的话,就不用经过转发这个端口,不需要走这个规则,所以这规则就对它无效。也就是4.100可以远程本机。
#############################################################
client
# ssh 192.168.4.5 还可以远程proxy
# ssh 192.168.2.100 但无法远程不同网段的主机,如2.100
ssh: connect to host 192.168.4.100 port 22: Connection refused 访问被拒绝
如果是在INPUT进口链这里设置规则的话,就会导致4.100无法远程本机,但是可以远程不同网段的主机
# iptables -F
# iptables -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j REJECT
# ssh 192.168.2.5 无法访问本机
ssh: connect to host 192.168.2.5 port 22: Connection refused
# ssh 192.168.2.100 可以正常远程不同网段的主机,如2.100
如果想要禁止4.100无法远程所有的主机,包括本机的话,就2条规则都写。
# iptables -F
# iptables -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j REJECT
# iptables -I FORWARD -s 192.168.4.100 -p tcp --dport 22 -j REJECT
现在就无法远程所有主机了。
###############################################################
禁ping的相关策略
默认直接禁ping会产生的问题!
proxy
# iptables -I INPUT -p icmp -j DROP
设置完上面的规则后,其他主机确实无法ping本机,但本机也无法ping其他主机了!!!
因为当本机ping其他主机,其他主机回应时也是使用icmp,可是对方的回应被丢弃了,所以我们也无法接收了。
##############################################################
proxy 禁止其他主机ping本机,允许本机ping其他主机
要知道下面两个的区别,虽然大家都是ping。
echo-request 是“请求”ping我
echo-reply 是我ping别人,然后别人“回应”我
# iptables -F
# iptables -I INPUT -p icmp --icmp-type echo-request -j REJECT 不允许别人ping我4.5和2.5,但我可以ping别人
# ping 192.168.4.100 可以正常ping
PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data.
64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=0.429 ms
##############################################################
client
# ping 192.168.4.5 发现ping不通proxy了
PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data.
From 192.168.4.5 icmp_seq=1 Destination Port Unreachable
###########################################################
关于ICMP的类型,可以参考help帮助
proxy
# iptables -p icmp --help 查看帮助信息
###########################################################
真机 暂时了解
# clone-vm7
Enter VM number: 99 新建一个虚拟机,编号为99
Creating Virtual Machine disk image...... [OK]
Defining new virtual machine...... [OK]
# virsh console rh7_node99 虚拟机开机后,还没配IP时,可以这样用console来连接。这个知识之后会学到的。
显示如下:
连接到域 rh7_node99
换码符为 ^]
[ OK ] Started Show Plymouth Boot Screen.
[ OK ] Reached target Paths.
... ...
Welcome to Red Hat Enterprise Linux Server 7.4 (Maipo)!
... ...
[ OK ] Started OpenSSH server daemon.
Red Hat Enterprise Linux Server 7.4 (Maipo)
Kernel 3.10.0-693.el7.x86_64 on an x86_64
... ...
localhost login: root
密码:
Last login: Tue Jan 30 12:29:01 on :0
[root@localhost ~]# 成功远程到这个还没有IP的虚拟机
##############################################################
防火墙扩展规则
根据MAC地址封锁主机
在一条规则中开放多个TCP服务
根据IP范围设置封锁规则
iptables在基本过滤条件的基础上还扩展了很多其他条件,在使用时需要使用-m参数来启动这些扩展功能,语法如下:
iptables 选项 链名称 -m 扩展模块 --具体扩展条件 -j 动作
###############################################################
根据IP过滤的规则,当对方修改IP后,防火墙会失效
proxy
# iptables -F
# iptables -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j DROP
设置规则,禁止client,192.168.4.100使用ssh远程本机
#############################################################
client
当client主机修改IP地址后,该规则就会失效。
注意因为修改了IP,对client主机的远程连接会断开,需要使用virt-manager开启虚拟机操作:
# ifconfig eth0 192.168.4.101
# ssh 192.168.4.5 依然能成功远程proxy
##############################################################
根据MAC地址过滤,可以防止对方改IP来远程本机这种情况的发生
proxy
# yum -y install nmap
# nmap -n -sP 192.168.4.100 查看client的MAC地址
显示如下:
Starting Nmap 6.40 ( http://nmap.org ) at 2018-12-11 16:16 CST
Nmap scan report for 192.168.4.100
Host is up (0.00031s latency).
MAC Address: 52:54:00:B0:C4:A2 (QEMU Virtual NIC) 这是client,4.100的物理mac地址。
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
# iptables -F
# iptables -I INPUT -m mac --mac 52:54:00:B0:C4:A2 -p tcp --dport 22 -j REJECT
拒绝mac地址是52:54:00:B0:C4:A2的这台主机远程本机。
不管它改成什么IP,都会被禁止远程本机4.5和2.5
#############################################################
client 发现无法远程proxy了
# ssh 192.168.4.5 无法远程4.5和2.5了
ssh: connect to host 192.168.4.5 port 22: Connection refused
# ssh 192.168.2.5
ssh: connect to host 192.168.2.5 port 22: Connection refused
#############################################################
基于“多端口”设置过滤规则。
一次性过滤/放行多个端口,会很方便。
多端口还可以限制多个源端口(限制多个源端口的参数是--sports),但因为源端口不固定,一般不会使用!!!
proxy
连续的端口用冒号: 来表示。 如20到30,就写20:30。
不连续的端口用都逗号,分开。
# iptables -F
# iptables -I INPUT -p tcp -m multiport --dports 1,2,3,80,50,22,100:500 -j ACCEPT
一次性开启1,2,3,80,50,22,100到500的所有端口
#############################################################
根据“IP地址范围”设置规则
一次性拒绝4.1到4.100这么多主机来远程本机4.5和2.5
# iptables -F
# iptables -I INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.1-192.168.4.100 -j REJECT
这里也可以限制多个目标IP的范围,参数是--dst-range,用法与--src-range一致。
禁止从 192.168.4.0/24 网段其他的主机登录
# iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
#############################################################
proxy
# iptables -t nat -nL
显示如下,会发现有很多POSTROUTING的规则:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192.168.122.0/24 224.0.0.0/24
RETURN all -- 192.168.122.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
# iptables -t nat -F 如果不写哪个表,就默认是filter表!!!
# iptables -t nat -nL 发现已清空nat表的所有链
显示如下:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
##############################################################################
配置SNAT实现共享上网
目标:搭建内外网环境,配置SNAT策略实现共享上网访问
我们假设192.168.2.0/24网络为外网,192.168.4.0/24为内网。
在外网中web1服务器192.168.2.100,因为设置了网关,client已经可以访问此web服务器了。
但,如果查看web1的日志就会发现,日志里记录的是192.168.4.100在访问网页。
我们需要实现的效果是,client可以访问web服务器,但要伪装为192.168.2.5后再访问web服务器
(模拟所有位于公司内部的电脑都使用的是私有IP,希望访问外网,就需要伪装为公司的外网IP后才可以)。
proxy (充当转发的路由器)
eth0:192.168.4.5
eth0:192.168.2.5
client (客户端)
eth0:192.168.4.100
网关:192.168.4.5
web1 (网站服务端)
eth1:192.168.2.100
网关:192.168.4.5
############################################################################
client
# curl 192.168.2.100
##############################################################################
web1
动态查看http的日志
# tailf /var/log/httpd/access_log
192.168.4.100 - - [11/Dec/2018:17:36:40 +0800] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0"
如果网站是用nginx搭建的话,要查看下面这个日志
tailf /usr/local/nginx/logs/access.log 这是nginx的访问日志
##############################################################################
设置防火墙规则,实现IP地址的伪装(SNAT源地址转换)
proxy
# iptables -F
# iptables -t nat -F
# iptables -t nat -I POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 192.168.2.5
设置防火墙规则,实现SNAT地址转换,把4.0网段的私网IP都转换成192.168.2.5 (实验中假设2.0网段是外网)
如果之前没有设置,可临时开启路由转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
##############################################################################
client
# curl 192.168.2.100
##############################################################################
web1
日志会自动跳出新信息
192.168.2.5 - - [11/Dec/2018:17:39:15 +0800] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0"
说现在是2.5在访问,可是事实上还是4.100在访问!
说明客户端4.100是先伪装为了192.168.2.5之后,再访问的web服务器!
可以先一直摁enter键,一直清空整个屏幕,然后client再访问一下,这样比较好查看它跳出的新信息!
##############################################################################
实现虚拟机可以像真机一样上网!
proxy
# ping www.baidu.com 此时因为没有DNS解析,所以会报错
ping: www.baidu.com: 未知的名称或服务
设置dns为谷歌免费的DNS服务器网址8.8.8.8,网关为真机的一个网卡192.168.4.254
# nmcli connection modify eth0 ipv4.method manual ipv4.dns 8.8.8.8 ipv4.gateway 192.168.4.254
# ping www.baidu.com 此时报错的性质和上次是不同的,因为它现在是私网地址,无法连接到NDS服务器8.8.8.8
ping: www.baidu.com: 未知的名称或服务
# iptables -F 清空filter的规则
# iptables -t nat -F 清空nat地址转换的规则
# iptables -nL 这一步可以省略,只是确认是否清空了而已
####################################################################
真机
# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
修改/etc/sysctl.conf配置文件,可以实现规则永久有效!!!
或者可以临时开启路由转发,仅当前有效,重启后无效!!!
# echo 1 > /proc/sys/net/ipv4/ip_forward
# cat /proc/sys/net/ipv4/ip_forward 里面是1代表开启,0代表关闭
1
# iptables -F 清空filter的规则
# iptables -t nat -F 清空nat地址转换的规则
# iptables -t nat -I POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 176.130.2.243
把虚拟机的私网IP转换成公网IP(本机真实的IP)
######################################################################
proxy
# ping 8.8.8.8 ping得通域名解析服务器
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=41 time=124 ms
... ...
# nslookup www.baidu.com 域名解析很慢,正常现象
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached
# cat /etc/resolv.conf 确定域名解析服务是对的,8.8.8.8
... ...
nameserver 8.8.8.8
# route -n 确定网关也是对的,192.168.4.254
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.4.254 0.0.0.0 UG 100 0 0 eth0
# ping www.baidu.com 可以ping得通域名
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=54 time=9.76 ms
... ...
# exit
# ssh -X 192.168.4.5 要加-X才能调用图形
# firefox www.baidu.com 要等很久,才能成功访问!
###############################################################
所有iptables规则都是临时规则,打下面这条命令可以永久保留规则,永久生效!!!
# service iptables save
显示如下:
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
###################################################################
如果外网IP不固定,经常变动的情况下,可执行下面的地址伪装,动态伪装IP!!!
也就是在-j后面加MASQUERADE这个单词,而不写固定的IP就行!
# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE