iptables

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 ACCEPT
  • drop非法连接

    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
坚持原创技术分享,您的支持将鼓励我继续创作!
0%