Iptables
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作’target’(目标),也可以跳向同一个表内的用户定义的链。
iptables限制IP访问特定端口
允许某个IP (192.168.6.100)的机器进行SSH连接:
1
2
3
4
5$ iptables -A INPUT -s 192.168.6.100 -p tcp --dport 22 -j ACCEPT
$ iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.6.100 0.0.0.0/0 tcp dpt:22允许某一段的IP 访问SSH
1
2
3
4
5$ iptables -A INPUT -s 192.168.6.0/24 -p tcp --dport 22 -j ACCEPT
$ iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.6.0/24 0.0.0.0/0 tcp dpt:22限制某一IP 访问SSH
1
2
3
4
5$ iptables -A INPUT -p tcp -s ! 192.168.6.100 --dport 22 -j ACCEPT --注意!号有个空格
$ iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.6.0/24 0.0.0.0/0 tcp dpt:22
配置一个NAT表放火墙
防止外网用内网IP欺骗
1
2
3$ iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
$ iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
$ iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP禁止与211.101.46.253的所有连接
1
$ iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
禁用FTP(21)端口
1
2
3
4$ iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
# 这样写范围太大了,我们可以更精确的定义.
$ iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP
# 这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.iptables白名单
1
2
3
4
5$ iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 80 -j DROP
# 拒绝所有IP链接80端口
$ iptables -A INPUT -s 58.17.245.222 -p tcp --dport 80 -j ACCEPT
# 允许指定IP访问80端口允许所有已经建立的和相关的连接
1
2$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPTdrop非法连接
1
2
3$ iptables -A INPUT -m state --state INVALID -j DROP
$ iptables -A OUTPUT -m state --state INVALID -j DROP
$ iptables -A FORWARD -m state --state INVALID -j DROP
端口映射
- 这里使用的是FTP服务(36542)
1
2
3
4
5
6
7
8
9$ iptables -t nat -A PREROUTING -p tcp --dport 36542 -j DNAT --to 192.168.50.2:36542
$ iptables -t nat -A POSTROUTING -p tcp --dport 36542 -j MASQUERADE
# 因为FTP使用了两个端口21和20,21只是用于连接,20是执行命令的。20没办法修改,这里使用了被动模式连接。
$ iptables -t nat -I PREROUTING -p tcp --dport 60000:65000 -j DNAT --to 192.168.50.2
# 被动连接端口60000-65000全部转发给50.2
$ iptables -t nat -I POSTROUTING -p tcp --dport 60000:65000 -j MASQUERADE
# 需要开放60000:65000端口,
端口转发
公司有一台服务器连接外网,其他的服务器都不能上外网,我们可以通过这个外网服务器用作网关服务器,做端口转发,连接到内网服务器
这里使用数据库的3306映射到外网的的36544
1
2$ iptables -t nat -A PREROUTING -m tcp -p tcp --dport 36544 -j DNAT --to-destination 172.16.1.11:3306
$ iptables -t nat -A POSTROUTING -m tcp -p tcp --dport 3306 -d 172.16.1.11 -j SNAT --to-source 172.16.1.1添加连续端口
1
2
3
4
5$ iptables -A INPUT -p tcp --dport 60000:65000 -j ACCEPT
# 冒号表示添加一个连续的端口
$ iptables -A INPUT -p tcp -m multiport –dport 21:25,135:139 -j DROP
#使用multiport参数配置不连续端口和多个端口代理上网
内网机子无法上网,通过一台可以上网的电脑,在可以访问外网的server上iptables让其一个网段内的机子访问外网,这里是阿里云环境来做的,开启IP转发功能1
2$ sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
$ iptables -t nat -I POSTROUTING -s 172.16.3.0/24 -j SNAT --to-source 172.16.3.2
操作iptables的nat规则
查看规则
1
2$ iptables -nvL -t nat
$ iptables -t nat -L -n --line-numbers删除规则
1
2
3
4
5
6
7
8
9
10$ iptables -t nat -D POSTROUTING 1
# iptables的规则号
$ iptables -nL --line-number
# 修改/替换规则
$ iptbales -R INPUT {1} -j ACCEPT
# 删除规则
$ iptables -D INPUT {1}iptales端口通过一张网卡出去
1
2$ iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT
$ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT本机端口,映射到本机端口
1
2
3$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525
$ iptables -t nat -I PREROUTING --src 0/0 --dst 192.168.1.5 -p tcp --dport 80 -j REDIRECT --to-ports 8123
$ iptables -t nat -I OUTPUT --src 0/0 --dst 192.168.1.5 -p tcp --dport 80 -j REDIRECT --to-ports 8123保存防火墙
1
$ sudo /usr/libexec/iptables/iptables.init save
奇葩需求,开放ssh端口指定的IP地址访问,其他端口太多不想添加能对外访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$ cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.10.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j REJECT --reject-with icmp-port-unreachable
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT