iptables相关以及sudo
(一)、详述iptables五链 iptables: 包过滤型的防火墙
firewall: 防火墙,隔离工具; 工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配的报文做出相应处理的组件;
- 主机防火墙
- 网络防火墙
- 软件防火墙(软件逻辑)
- 硬件防火墙(硬件和软件逻辑)
文章图片
四表五链 四表:
- raw: PREROUTING, OUTPUT
- mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
- nat: PREROUTING, INPUT, OUTPUT, POSTROUTING
- filter: INPUT, FORWARD, OUTPUT
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
报文流向
文章图片
报文流向
- 流入本机: PREROUTING--->INPUT
- 由本机流出: OUTPUT--->POSTROUTING
- 转发: PREROUTING--->FORWARD--->POSTROUTING
主机类别 | ip地址 |
---|---|
远程访问的Client | 192.168.30.105 |
服务器主机Server | 192.168.30.104 |
[root@CentOS7_Server ~]#iptables -vnL
Chain INPUT (policy ACCEPT 6 packets, 428 bytes)
pkts bytes targetprot opt inoutsourcedestinationChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes targetprot opt inoutsourcedestinationChain OUTPUT (policy ACCEPT 4 packets, 448 bytes)
pkts bytes targetprot opt inoutsourcedestination
【iptables相关以及sudo】第二: 服务器端安装测试软件,包括但不限于(httpd,telnet,samba,ftp,vsftpd,mariadb等)
[root@CentOS7_Server ~]#yum install httpd telnet-server samba ftp vsftpd mariadb-server -y
第三: 启动服务器上iptables并加入开机启动项
[root@CentOS7_Server ~]#systemctl start firewalld.service
[root@CentOS7_Server ~]#systemctl status firewalld.service
[root@CentOS7_Server ~]#systemctl enable firewalld.service
第四: 配置服务器端iptables规则
[root@CentOS7_Server ~]#iptables -A INPUT -d 192.168.30.104 -p tcp --dport 22 -j ACCEPT###入站-放行SSH的22号端口
[root@CentOS7_Server ~]#iptables -A OUTPUT -s 192.168.30.104 -p tcp --sport 22 -j ACCEPT ###出站-放行SSH的22号端口[root@CentOS7_Server ~]#iptables -A INPUT -i ens33 -j REJECT###入站-拒绝通过ens33网卡的连接
[root@CentOS7_Server ~]#iptables -A OUTPUT -o ens33 -j REJECT###出站-拒绝通过ens33网卡的连接[root@CentOS7_Server ~]#iptables -I OUTPUT 2 -s 192.168.30.104 -p icmp --icmp-type 8 -j ACCEPT###出站-允许服务器ping外部主机
[root@CentOS7_Server ~]#iptables -I INPUT 2 -d 192.168.30.104 -p icmp --icmp-type 0 -j ACCEPT###进站-允许服务器接收主机ping要求
[root@CentOS7_Server ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
1907 69892 ACCEPTtcp--**0.0.0.0/0192.168.30.104tcp dpt:22
200 ACCEPTicmp --**0.0.0.0/0192.168.30.104icmptype 0
3222364 REJECTall--ens33*0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
1471 48640 ACCEPTtcp--**192.168.30.1040.0.0.0/0tcp spt:22
200 ACCEPTicmp --**192.168.30.1040.0.0.0/0icmptype 8
300 REJECTall--*ens330.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable
1.基本匹配条件: (无需加载任何模块,由iptables/netfilter自行提供)
参数选项 | 解释说明 |
---|---|
-s, --source address[/mask][....] | 检查报文中的源ip地址是否符合此处指定的地址或范围 |
-d, --destination address[/mask][...] | 检查报文中的目标ip地址是否符合此处指定的地址或范围 |
-p, --protocol protocol | protocol: tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all" |
-i, --in-interface name | 数据报文流入的接口; 只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链 |
-o, --out-interface name | 数据报文流出的接口; 只能应用于数据报文流出的环节,只能应用于FORWARD,OUTPUT和POSTROUTING链 |
隐式扩展: 在使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制Step1.隐式扩展:
显式扩展: 必须使用-m选项指明要调用的扩展模块的扩展机制
不需要手动加载扩展模块,因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块tcp参数选项:
参数选项 | 解释说明 |
---|---|
--source-port, --sport port[:port] | 匹配报文的源端口; 可以是端口范围 |
--destination-port, --dport port[:port] | 匹配报文的目标端口; 可以是端口范围 |
--tcp-flags mask comp | |
--tcp-flags SYN,ACK,FIN,RST SYN | 要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0 |
[root@CentOS7_Server ~]#iptables -A INPUT -d 192.168.30.104 -p tcp --dport 22 -j ACCEPT
[root@CentOS7_Server ~]#iptables -A OUTPUT -s 192.168.30.104 -p tcp --sport 22 -j ACCEPT
udp参数选项:
参数选项 | 解释说明 |
---|---|
--source-port, --sport port[:port] | 匹配报文的源端口; 可以是端口范围 |
--destination-port, -dport port[:port] | 匹配报文的目标端口; 可以是端口范围 |
[root@CentOS7 ~]#iptables -I INPUT -d 192.168.30.104 -p udp --dport 137:138 -j ACCEPT
[root@CentOS7 ~]#iptables -I OUTPUT -s 192.168.30.104 -p udp --sport 137:138 -j ACCEPT
icmp参数选项:
参数选项 | 解释说明 |
---|---|
--icmp-type {type[/code]typename} | |
echo-request: 8 | ping请求报文(出站) |
echo-reply: 0 | ping响应报文(进站) |
[root@CentOS7_Server ~]#iptables -I OUTPUT -s 192.168.30.104 -p icmp --icmp-type 8 -j ACCEPT
[root@CentOS7_Server ~]#iptables -I INPUT -d 192.168.30.104 -p icmp --icmp-type 0 -j ACCEPT
Step2.显式扩展:
必须使用-m选项指明要调用的扩展模块的扩展机制(1)、mutliport,多端口匹配
以离散或连续的方式定义多端口匹配条件,最多15个
参数选项 | 解释说明 |
---|---|
--source-ports,--sports port[,port|,port:port] | 指定多个源端口 |
--destination-ports,--dports port[,port|,port:port] | 指定多个目标端口 |
[root@CentOS7_Server ~]#ss -tnl
StateRecv-Q Send-QLocal Address:PortPeer Address:Port
LISTEN050*:445*:*
LISTEN0128127.0.0.1:9000*:*
LISTEN050*:3306*:*
LISTEN050*:139*:*
LISTEN0128*:111*:*
LISTEN05192.168.122.1:53*:*
LISTEN0128*:22*:*
LISTEN0128127.0.0.1:631*:*
LISTEN0100127.0.0.1:25*:*
LISTEN0128127.0.0.1:6010*:*
LISTEN0128127.0.0.1:6011*:*
LISTEN050:::445:::*
LISTEN050:::139:::*
LISTEN0128:::111:::*
LISTEN0128:::80:::*
LISTEN0128:::22:::*
LISTEN0128::1:631:::*
LISTEN0100::1:25:::*
LISTEN0128::1:6010:::*
LISTEN0128::1:6011:::*
第二步: 创建index测试页面
[root@CentOS7_Server ~]#cd /data/www/html/
[root@CentOS7_Server html]#vim index.html
[root@CentOS7_Server html]#curl http://192.168.30.104
Multiport Test !!
文章图片
防火墙阻挡httpd
[root@CentOS7_Server html]#iptables -I INPUT -d 192.168.30.104 -p udp --dport 137:138 -j ACCEPT
[root@CentOS7_Server html]#iptables -I OUTPUT -s 192.168.30.104 -p udp --sport 137:138 -j ACCEPT
第三步: 添加多端口规则,然后测试80访问页面以及samba服务
[root@CentOS7_Server html]#iptables -R INPUT 3 -d 192.168.30.104 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT
[root@CentOS7_Server html]#iptables -R OUTPUT 3 -s 192.168.30.104 -p tcp -m multiport --sports 22,80,139,445 -j ACCEPT
[root@CentOS7_Server html]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
100 ACCEPTudp--**0.0.0.0/0192.168.30.104udp dpts:137:138
200 ACCEPTicmp --**0.0.0.0/0192.168.30.104icmptype 0
3209 16884 ACCEPTtcp--**0.0.0.0/0192.168.30.104multiport dports 22,80,139,445
41169327 REJECTall--ens33*0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
15552 ACCEPTudp--**192.168.30.1040.0.0.0/0udp spts:137:138
200 ACCEPTicmp --**192.168.30.1040.0.0.0/0icmptype 8
3393700 ACCEPTtcp--**192.168.30.1040.0.0.0/0multiport sports 22,80,139,445
4656525 REJECTall--*ens330.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable
<测试samba服务>
[root@CentOS7_Client1 ~]#smbclient -L 192.168.30.104
Enter SAMBA\root's password:
Anonymous login successfulSharenameTypeComment
--------------------
print$DiskPrinter Drivers
IPC$IPCIPC Service (Samba 4.7.1)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successfulServerComment
----------------WorkgroupMaster
----------------
SAMBA
文章图片
测试httpd正常 (2)、iprange,ip范围匹配
以联系地址块的方式来指明多ip地址匹配条件
参数选项 | 解释说明 |
---|---|
--src-range from | 匹配源地址 |
--dst-range from | 匹配目标地址 |
[root@CentOS7_Server ~]#useradd usertest
[root@CentOS7_Server ~]#echo "usertest"|passwd --stdin usertest
[root@CentOS7_Server ~]#systemctl start telnet.socket
[root@CentOS7_Server ~]#ss -tnl|grep 23
LISTEN0128:::23:::*
第二步:添加规则允许IP范围连接23端口
[root@CentOS7_Server ~]#iptables -I INPUT 4 -d 192.168.30.104 -p tcp --dport 23 -m iprange --src-range 192.168.30.104-192.168.30.106 -j ACCEPT
[root@CentOS7_Server ~]#iptables -I OUTPUT 4 -s 192.168.30.104 -p tcp --sport 23 -m iprange --dst-range 192.168.30.104-192.168.30.106 -j ACCEPT
[root@CentOS7_Server ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
100 ACCEPTudp--**0.0.0.0/0192.168.30.104udp dpts:137:138
200 ACCEPTicmp --**0.0.0.0/0192.168.30.104icmptype 0
31172 94005 ACCEPTtcp--**0.0.0.0/0192.168.30.104multiport dports 22,80,139,445
400 ACCEPTtcp--**0.0.0.0/0192.168.30.104tcp dpt:23 source IP range 192.168.30.104-192.168.30.106
5595 59003 REJECTall--ens33*0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
1293072 ACCEPTudp--**192.168.30.1040.0.0.0/0udp spts:137:138
200 ACCEPTicmp --**192.168.30.1040.0.0.0/0icmptype 8
3685 78044 ACCEPTtcp--**192.168.30.1040.0.0.0/0multiport sports 22,80,139,445
400 ACCEPTtcp--**192.168.30.1040.0.0.0/0tcp spt:23 destination IP range 192.168.30.104-192.168.30.106
5686705 REJECTall--*ens330.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable
第三步测试telnet服务(client 192.168.30.105): 连接成功
[root@CentOS7_Client1 ~]#telnet 192.168.30.104
Trying 192.168.30.104...
Connected to 192.168.30.104.
Escape character is '^]'.
Kernel 3.10.0-862.el7.x86_64 on an x86_64
CentOS7_Server login: usertest
Password: [usertest@CentOS7_Server ~]$ ifconfig
ens33: flags=4163mtu 1500
inet 192.168.30.104netmask 255.255.255.0broadcast 192.168.30.255
测试telnet服务(client 192.168.30.107): 连接失败
[root@ftp-server ~]#telnet 192.168.30.104
Trying 192.168.30.104...
telnet: connect to address 192.168.30.104: Connection timed out
(3)、time, 匹配访问网络的时间
参数选项 | 解释说明 |
---|---|
--timestart hh:mm[:ss] | 时间开始点 |
--timestop hh:mm[:ss] | 时间结束点 |
--weekdays day[,day...] | 一周的第几天 |
--monthdays day[,day...] | 一月的第几天 |
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] | 日期开始时间点 |
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] | 日期结束时间点 |
--kerneltz: 使用内核配置的时区而非默认的UTC |
CentOS7才需要操作 |
ntp端口123
chrony端口323
[root@CentOS7_Server ~]#iptables -I INPUT 5 -d 192.168.30.104 -p udp -m multiport --dports 123,323 -j ACCEPT
[root@CentOS7_Server ~]#iptables -I OUTPUT 5 -s 192.168.30.104 -p udp -m multiport --sports 123,323 -j ACCEPT
第二: 配置IP端在什么时间段可以访问
[root@CentOS7_Server ~]#iptables -I INPUT 3 -d 192.168.30.104 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5,6 --kerneltz -j ACCEPT
[root@CentOS7_Server ~]#iptables -I OUTPUT 3 -s 192.168.30.104 -p tcp --sport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5,6 --kerneltz -j ACCEPT
###周一至周五早9点到晚18点允许访问,周六日全天可以访问,--kerneltz使用内核中的时间
(4)、string, 对应字符串匹配
参数选项 | 解释说明 |
---|---|
--algo {bm|kmp} | 字符串选择的类型 |
--string pattern | 匹配模式 |
--hex-string pattern | |
--from offset | |
to offset |
[root@CentOS7_Server html]#iptables -I INPUT 5 -d 192.168.30.104 -p tcp -m string --algo bm --string "linux" -j REJECT
[root@CentOS7_Server html]#iptables -I OUTPUT 5 -s 192.168.30.104 -p tcp -m string --algo bm --string "linux" -j REJECT
(5)、connlimit, 并发连接数限制
参数选项 | 解释说明 |
---|---|
--connlimit-upto n | 小于n被允许 |
--connlimit-above n | 大于n被拒绝 |
[root@CentOS7_Server html]#iptables -R INPUT 4 -d 192.168.30.104 -p tcp -m multiport --dports 80,139,445,3306 -j ACCEPT
[root@CentOS7_Server html]#iptables -R OUTPUT 4 -s 192.168.30.104 -p tcp -m multiport --sports 80,139,445,3306 -j ACCEPT
###开启对3306端口的放行
[root@CentOS7_Server html]#iptables -I INPUT 6 -d 192.168.30.104 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
[root@CentOS7_Server html]#iptables -I OUTPUT 6 -s 192.168.30.104 -p tcp --sport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
###设置对访问mariadb并发连接数小于2个的时候被允许
[root@CentOS7_Server html]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
100 ACCEPTicmp --**0.0.0.0/0192.168.30.104icmptype 0
22696198K ACCEPTtcp--**0.0.0.0/0192.168.30.104tcp dpt:22
300 ACCEPTtcp--**0.0.0.0/0192.168.30.104tcp dpt:23 TIME from 09:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri,Sat
400 ACCEPTtcp--**0.0.0.0/0192.168.30.104multiport dports 80,139,445,3306
500 REJECTtcp--**0.0.0.0/0192.168.30.104STRING match"linux" ALGO name bm TO 65535 reject-with icmp-port-unreachable
600 ACCEPTtcp--**0.0.0.0/0192.168.30.104tcp dpt:3306 #conn src/32 <= 2
7867883 REJECTall--ens33*0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
numpkts bytes targetprot opt inoutsourcedestination
100 ACCEPTicmp --**192.168.30.1040.0.0.0/0icmptype 8
21647200K ACCEPTtcp--**192.168.30.1040.0.0.0/0tcp spt:22
300 ACCEPTtcp--**192.168.30.1040.0.0.0/0tcp spt:23 TIME from 09:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri,Sat
400 ACCEPTtcp--**192.168.30.1040.0.0.0/0multiport sports 80,139,445,3306
500 REJECTtcp--**192.168.30.1040.0.0.0/0STRING match"linux" ALGO name bm TO 65535 reject-with icmp-port-unreachable
600 ACCEPTtcp--**192.168.30.1040.0.0.0/0tcp spt:3306 #conn src/32 <= 2
7312516 REJECTall--*ens330.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable
(6)、limit, 速率限制
这里的限制是指报文的发包速率限制。使用的是令牌桶算法,每拿一个令牌才能相应的发一个报文,而令牌按照固定频率发放,在没有报文发送的时候,会像桶一样把令牌攒起来,在需要发送报文的时候会一次性把桶里的报文都发出去,这就叫做令牌桶算法
参数选项 | 解释说明 |
---|---|
--limit rate[/second|/minute|/hour|/day] | 按秒/分/时/天限制速率 |
--limit-burst number | 所拥有的令牌桶数量 |
--syn, -m limit | 限制本机某tcp服务接收新请求的速率 |
[root@CentOS7_Server html]#iptables -I INPUT 6 -d 192.168.30.104 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 15/minute -j ACCEPT
[root@CentOS7_Server html]#iptables -I OUTPUT 6 -s 192.168.30.104 -p icmp --icmp-type 0 -j ACCEPT
文章图片
令牌桶测试 7、state(报文状态匹配)
主要参数: --state state
参数 | 解释说明 |
---|---|
NEW | 新连接请求 |
ESTABLISHED | 已经建立的连接 |
INVALID | 无法识别的连接 |
RELATED | 相关联的连接,当前连接是一个新请求,但附属于某个已经存在的连接 |
UNTRACKED | 未追踪的连接 |
调整可记录的连接数量最大值:/proc/sys/net/nf_conntrack_max
超时时长:/proc/sys/net/netfilter/timeout
[root@CentOS7_Server html]#iptables -F
[root@CentOS7_Server html]#iptables -A INPUT -d 192.168.30.104 -p tcp -m multiport --dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT
###清空之前规则,添加目前服务所有tcp端口
[root@CentOS7_Server html]#iptables -I INPUT -d 192.168.30.104 -m state --state ESTABLISHED -j ACCEPT
[root@CentOS7_Server html]#iptables -A OUTPUT -s 192.168.30.104 -m state --state ESTABLISHED -j ACCEPT
###进站和出站只要是ESTABLISHED都允许放行
[root@CentOS7_Server html]#iptables -I INPUT 2 -d 192.168.30.104 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
###第一次访问udp137和138端口的NEW允许放行
[root@CentOS7_Server html]#iptables -A INPUT -d 192.168.30.104 -j REJECT
[root@CentOS7_Server html]#iptables -A OUTPUT -s 192.168.30.104 -j REJECT
###默认规则调整为全部拒绝
文章图片
httpd测试访问
文章图片
samba测试访问 RELATED状态的追踪:
需要手动装载状态的追踪模块:nf_conntrack_ftp
iptables -I OUTPUT -s 192.168.30.104 -p tcp -m multiport --sports 22,80,139,445,3306 -m state --state ESTABLISHED,RELATED -j ACCEPT
处理动作(跳转目标)
- -j targetname [per-target-options]
- 简单target:
- ACCEPT, DROP
- 扩展target:
- REJECT
- --reject-with type
- LOG
- --log-level
- --log-prefix
- 默认日志保存于/var/log/messages
- 自定义链做为target:
保存和载入规则:
保存: iptables-save >/PATH/TO/SOME_RULE_FILE
重载: iptables-restore
规则优化的思路:
- 使用自定义链管理特定应用的相关规则,模块化管理规则:
- (1)优先放行双方向状态为ESTABLISHED的报文
- (2)服务于不同类别的功能的规则,匹配到报文可能性更大的放前面
- (3)服务于同一类别的功能的规则,匹配条件较严格的放在前面
- (4)设置默认策略: 白名单机制
- (a)iptables -P, 不建议
- (b)建议在规则的最后定义规则做为默认策略
SNAT是source network address translation的缩写,即源地址目标转换。Step1.搭建环境
比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip;
这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了所以叫做SNAT,基于源地址的地址转换.
简单来说: SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机
设备名称 | ip地址 |
---|---|
Client客户端 | 172.16.0.0/16 |
SNAT服务器 | ens33: 192.168.30.105, ens36: 172.16.8.100 |
远程云端服务器 | 192.168.30.103 |
文章图片
SNAT Step2.SNAT转发服务器配置双网卡
[root@SNAT-Server ~]#ifconfig
ens33: flags=4163mtu 1500
inet 192.168.30.105netmask 255.255.255.0broadcast 192.168.30.255
inet6 fe80::ebca:5abc:36ce:599cprefixlen 64scopeid 0x20
inet6 240e:82:f00d:95c6:2e01:fc37:1f2e:8c41prefixlen 64scopeid 0x0
inet6 fe80::ba8f:a1a3:c743:29ebprefixlen 64scopeid 0x20
inet6 fe80::a5b9:2f8e:5a1a:78fdprefixlen 64scopeid 0x20
ether 00:0c:29:38:0b:78txqueuelen 1000(Ethernet)
RX packets 2845bytes 254075 (248.1 KiB)
RX errors 0dropped 0overruns 0frame 0
TX packets 1770bytes 251538 (245.6 KiB)
TX errors 0dropped 0 overruns 0carrier 0collisions 0ens36: flags=4163mtu 1500
inet 172.168.0.254netmask 255.255.255.255broadcast 0.0.0.0
inet6 240e:82:f00d:95c6:44f:4c38:4b14:7prefixlen 128scopeid 0x0
inet6 fe80::ed88:92f2:476d:be7dprefixlen 64scopeid 0x20
inet6 240e:82:f00d:95c6:4353:9518:a38c:247dprefixlen 64scopeid 0x0
ether 00:0c:29:38:0b:82txqueuelen 1000(Ethernet)
RX packets 887bytes 97703 (95.4 KiB)
RX errors 0dropped 0overruns 0frame 0
TX packets 97bytes 14111 (13.7 KiB)
TX errors 0dropped 0 overruns 0carrier 0collisions 0
Step3. 在SNAT转发服务器开启核心转发功能
[root@SNAT-Server ~]#sysctl -w net.ipv4.ip_forward=1###开启服务器的核心转发功能
net.ipv4.ip_forward = 1
[root@SNAT-Server ~]#systemctl start firewalld.service
[root@SNAT-Server ~]#systemctl enable firewalld.service
Step4.配置iptables规则,使得192.168.30.0/24网段能够正常访问
[root@SNAT-Server ~]#iptables -F
[root@SNAT-Server ~]#iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o ens33 -j SNAT --to-source 192.168.30.105
Step5.如果是动态ip环境,配置如下规则:
[root@SNAT-Server ~]#iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE
DNAT是destination network address translation的缩写,即目标网络地址转换。
典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换.
简单来说:DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。
文章图片
DNAT
[root@SNAT-Server ~]#iptables -t nat -A PREROUTING -d 172.16.0.254 -p tcp--dport 80 -j DNAT --to-destination 192.168.30.103
PNAT端口修改
文章图片
PNAT
[root@SNAT-Server ~]#iptables -t nat -A PREROUTING -d 192.168.30.103 -p tcp --dport 80 -j REDIRECT --to-ports 8080
(四)、简述sudo安全切换工具,及详细讲解visudoer sudo su: switch user
- 用户切换
- (1) su -l user
- (2) su -l user -c 'COMMAND'
- 能够让获得授权的用户以另外一个用户的身份运行指定的命令
- 授权机制: 授权文件 /etc/sudoers
- rootALL=(ALL)ALL
- %wheelALL=(ALL)ALL
- 编译此文件的专用命令: visudo
- 授权项:
- whowhere=(whom)commands
- userhosts=(runas) commands
- users:
- username
- #uid
- %groupname
- %#gid
- user_alias
- 支持将多个用户定义为一组用户,称之为用户别名,即user_alias
- hosts:
- ip
- hostname
- NetAddr
- host_alias
- runas:
- ...
- runas_alias
- commands:
- command
- directory
- sudoedit: 特殊权限,可用于向其他用户授予sudo权限
- cmnd_alias
sudo命令的使用示例:
1.创建和删除
###创建系统用户并设置密码
[root@CentOS7_Client1 ~]#useradd hello
[root@CentOS7_Client1 ~]#echo "hello" |passwd --stdin hello
###su到对应用户下无法创建新用户或者删除用户,提示权限不够
[root@CentOS7_Client1 ~]#su - hello
[hello@CentOS7_Client1 ~]$ useradd linux
-bash: /usr/sbin/useradd: Permission denied
[hello@CentOS7_Client1 ~]$ userdel hello
-bash: /usr/sbin/userdel: Permission denied
###visudo编辑添加对应的权限操作
[root@CentOS7_Client1 ~]#visudo
## Same thing without a password
# %wheelALL=(ALL)NOPASSWD: ALL
helloALL=(ALL)/usr/sbin/useradd,/usr/sbin/userdel
###重新su到hello账户,添加和删除创建的用户
[root@CentOS7_Client1 ~]#su - hello
Last login: Fri Nov 16 14:38:52 CST 2018 on pts/0[hello@CentOS7_Client1 ~]$ sudo useradd linuxtest
[hello@CentOS7_Client1 ~]$ tail /etc/passwd
hello:x:1002:1002::/home/hello:/bin/bash
linuxtest:x:1003:1003::/home/linuxtest:/bin/bash[hello@CentOS7_Client1 ~]$ userdel linuxtest
-bash: /usr/sbin/userdel: Permission denied
[hello@CentOS7_Client1 ~]$ sudo userdel linuxtest
注意:一般sudo命令会验证su账号的密码才能使用,默认时间是5分钟,超过时间后执行会再次提示输入密码
2.自定义组实现sudo
[root@CentOS7_Client1 ~]#usermod -a -G wheel hello
[root@CentOS7_Client1 ~]#newgrp wheel
[root@CentOS7_Client1 ~]#id hello
uid=1002(hello) gid=1002(hello) groups=1002(hello),10(wheel)[root@CentOS7_Client1 ~]#visudo
## Same thing without a password
%wheelALL=(ALL)/usr/sbin/useradd,/usr/sbin/userdel[root@CentOS7_Client1 ~]#su - hello
Last login: Fri Nov 16 14:41:44 CST 2018 on pts/0
[hello@CentOS7_Client1 ~]$ sudo -k
[hello@CentOS7_Client1 ~]$ sudo useradd hellouser1
[sudo] password for hello:
[hello@CentOS7_Client1 ~]$ id hellouser1
uid=1004(hellouser1) gid=1004(hellouser1) groups=1004(hellouser1)
注意: 使用sudo su -root可以无密码切换到管理员账户,风险很大,所以需要做对应的修改
## Same thing without a password
%wheelALL=(ALL)ALL, !/bin/su, !/usr/bin/passwd root
3.定义别名实现sudo
[root@CentOS7_Client1 ~]#visudo
## Allows people in group wheel to run all commands
#%wheel ALL=(ALL)ALL
User_Alias USERADMIN=fedora,centos
Cmnd_Alias NETADMINCMD=/sbin/ip, /sbin/ifconfig, /sbin/route
Cmnd_Alias USERADMINCMD=/sbin/useradd, /sbin/userdel, /bin/passwd, !/bin/passwd root
fedoraALL=(ALL)NETADMINCMD
centosALL=(ALL)USERADMINCMD
[root@CentOS7_Client1 ~]#su - fedora
Last login: Fri Nov 16 15:08:38 CST 2018 on pts/0
[fedora@CentOS7_Client1 ~]$ sudo -l
User fedora may run the following commands on CentOS7_Client1:
(ALL) /sbin/ip, /sbin/ifconfig, /sbin/route
[fedora@CentOS7_Client1 ~]$ su - centos
Password:
[centos@CentOS7_Client1 ~]$ sudo -l
User centos may run the following commands on CentOS7_Client1:
(ALL) /sbin/useradd, /sbin/userdel, /bin/passwd, !/bin/passwd root
注意:每次用户操作的时候都要输入用户密码,只要在规则的别名前面加一个标签NOPASSWD就可以不需要密码操作。每次需要用户输入密码则加PASSWD。
[root@CentOS7_Client1 ~]# visudo
USERADMIN ALL=(ALL) NOPASSWD:NETADMINCMD,PASSWD:USERADMINCMD
推荐阅读
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- 思维导图作业3—工作相关导图
- 带你了解类型系统以及flow和typescript的基本使用
- AnyProxy抓取http/https请求
- day16-Linux|day16-Linux 软件管理
- 父母的状态
- 适合写进作文与疫情相关的句子|适合写进作文与疫情相关的句子|你看 爱和希望蔓延的比病毒更快 每一种爱 都刻进武汉的心脏
- Linux|Linux 服务器nginx相关命令
- 内存管理概念与原理以及解决办法