ウェブサイト検索

初心者向けのiptables


iptables は、Nftables に取って代わられたにもかかわらず、多くのシステム管理者にとって主要な防御リソースの 1 つと考えられています。大手ネットワーキング メーカーは、実稼働環境にあるハードウェアに Iptables を組み込みました。

iptables は汎用性が高く、必要に応じてルールをロードおよびアンロードできるユーザーからの直接コマンドを受け入れます。

このチュートリアルでは、Web サーバーを保護する方法、LAN から内部 IP アドレスに接続を転送する方法、 ホワイトリストに登録された IP アドレスのみに特定のサービスを提供する方法を説明します。

注: この Iptables チュートリアルは 2 年前に初めてリリースされ、2021 年 5 月 23 日に更新され、例が改善され、スクリーンショットの品質が向上しました。

インストールする方法

Nftables を組み込んだディストリビューションでは、iptables はデフォルトで省略されます。

Debian ベースの Linux ディストリビューションに Iptables をインストールするには、次のコマンドを実行します。

sudo apt update && apt install iptables

HTTP および HTTPS ポートを開く

まず、Web サーバーから始まるすべての ACCEPT ポリシーを追加しましょう。

注: ルールを使用してスクリプトを作成する場合は、sudo を使用する必要はありません。

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

追加されたルールを確認するには、「iptables -L」を実行します。

どこ :

iptables = プログラムを呼び出します

-A=ルールを追加します

INPUT=受信トラフィック

-p=プロトコル

–ddport=宛先ポート

-j = 「ターゲット」を指定します。ターゲットはポリシーのタイプです: ACCEPT、DROP、REJECT (組み込み)…

Iptables -L=iptables がロードしたルールをすべてリストします (Iptables -L -v=冗長性も同様)。

上の例では、TCP プロトコルとポート 80 (http) および 443 (https) を介した受信トラフィックに対するルールを追加するように Iptables に指示しています。

パラメータ「-s 」を追加することで、特定の IP からの接続のみを受け入れるようにコマンドを変更できます。

sudo iptables -A INPUT -s 127.0.0.1 -p tcp --dport 80 -j ACCEPT

どこ :

s = ソース

nmap を使用してファイアウォールをテストすることもできます。

注: 上記の例では、サーバーに SSL 証明書が適切に設定されていないため、ポート 443 は表示されません。

注: Nmap の詳細については、これを参照してください。

Iptables を使用してサーバーを保護する:

#Open HTTP and HTTPS services.

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT

#Open SSH Port Service

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

新しいパラメータは次のとおりです。

-m は「 match 」 を意味し、iptables コア機能の一部ではない conntrack などの Iptables 拡張機能を呼び出すために使用されます。

conntrack = 特定のアドレスなどの接続に関する情報、この場合は接続の状態を追跡できるようにします。一部の攻撃からサーバーを防御するための多くのルールでは conntrack が使用されますが、ハードウェアによってその使用が制限されており、そのような制限はサーバーのリソースに過負荷をかけるために使用される可能性があるため、これは慎重に使用する必要があります。

-ctstate = は、一致するルールの状態を決定します。考えられる状態は、新規確立関連、および無効です。

#Protect your SSH Service against brute force attacks by allowing only a specific IP

to access iptables -A INPUT -p tcp -s X.X.X.X --dport 22 -m conntrack --ctstate NEW,

ESTABLISHED -j ACCEPT

#Protect your SSH Service against brute force attacks by limiting connection attempts
Iptables -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j 22-test

Iptables -A 22-test -m recent --name CONNECTIONS --set --mask 255.255.255.255 --rsource

Iptables -A 22-test -m recent --name CONNECTIONS --rcheck --mask 255.255.255.255

--rsource --seconds 30 --hitcount 3 -j 22-protection

Iptables -A 22-test -j ACCEPT

Iptables -A 22-protection -j DROP

どこ :

最初の行では、ルールは「-m conntrack –ctstate NEW, 」 と述べています。これは、接続が新しい場合はルール「22-test 」に渡すことを意味します。

2 行目は、ネットマスク 255.255.255.255 のパケットが接続という名前であることを示しています。

3 行目は、30 秒以内に接続が 3 回を超えた場合、ファイアウォールはチェーンの22 保護を適用し続けることを示しています。 4 行目は、30 秒以内に 3 回以上接続が見られなかった場合は受け入れられると示しています。

5 行目は22 保護チェーンに属しており、30 秒以内に 3 回を超えそうな場合は接続をドロップするよう指示しています。

最後に、すべての無関心な受信接続を拒否し、すべての送信トラフィックを許可しましょう。

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP

P はチェーン ポリシーを指します。ターゲットはポリシー、ACCEPT、DROP、REJECT であることに注意してください。この場合、以前のルールで何か異なるものを指定しない限り、送信トラフィックのデフォルト ポリシーは受け入れること、受信トラフィックのデフォルト ポリシーは拒否することを意味します。これは非常に基本的なファイアウォールであり、多くの攻撃に対するルールは含まれておらず、運用目的ではなく学習目的に使用されます。記事の最後では、運用に使用したファイアウォールをサーバーに接続します。各ルールを説明するコメントが付いています。

特定のポートへの接続を特定の IP アドレスに転送する

これは、特定のデバイス経由で接続をルーティングしたいデスクトップ ユーザーにとっても非常に便利です。ゲーマーにとっても便利です。通常はルーターの設定から行いますが、ルーティングデバイスが Iptables を実行していると仮定します。

iptables -A PREROUTING -t nat -p tcp -d X.X.X.X --dport 8080 -j DNAT --to-destination Y.Y.Y.Y:80

iptables -A POSTROUTING -t nat -p tcp -j SNAT --to-source X.X.X.X

上記のルールは、NAT (ネットワーク アドレス変換) を呼び出して、プロトコル TCP を介してアドレス X.X.X.X への接続を指定し、ポート 8080 はアドレス Y.Y.Y.Y のポート 80 にリダイレクトされます。 2 番目のルールは、応答が送信元アドレス (X.X.X.X) に送信される必要があることを指定します。これらのルールを使用して、IP カメラへのアクセスを許可したり、外部ネットワークとのオンライン ゲームを有効にしたりできます。

このチュートリアルは、初心者に Iptables を紹介することを目的としており、限られた数の基本事項のみを説明します。以下に、運用サーバーに使用される、綿密に計画されたファイアウォールのサンプルを示します。これには、すでに確認したルールの一部から、DDoS などの攻撃を防ぐためのより複雑なルールまでが含まれています。

ボーナス: 実稼働ファイアウォールのサンプル

iptables -F

#---- Enable bad error message protection

enable /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

#---- Turn on reverse path filtering. Safer, but breaks asymmetric routing and/or IPSEC

enable /proc/sys/net/ipv4/conf/*/rp_filter

#---- Don't accept source routed packets. Source routing is rarely used for legitimate

purposes disable /proc/sys/net/ipv4/conf/*/accept_source_route

#---- Disable ICMP redirect acceptance which can be used to alter your routing tables

disable /proc/sys/net/ipv4/conf/*/accept_redirects

#---- As we don't accept redirects, don't send Redirect messages either

disable /proc/sys/net/ipv4/conf/*/send_redirects

#---- Ignore packets with impossible addresses

disable /proc/sys/net/ipv4/conf/*/log_martians

#---- Protect against wrapping sequence numbers and aid round trip time measurement

enable /proc/sys/net/ipv4/tcp_timestamps

#---- Help against syn-flood DoS or DDoS attacks using particular choices of initial

TCP sequence numbers enable /proc/sys/net/ipv4/tcp_syncookies

#---- Use Selective ACK which can be used to signify that specific packets are missing

disable /proc/sys/net/ipv4/tcp_sack

modprobe nf_conntrack_ipv4

modprobe nf_nat

# modprobe nf_conntrack_ipv6

# modprobe nf_conntrack_amanda

# modprobe nf_nat_amanda

modprobe nf_conntrack_h323

modprobe nf_nat_h323

modprobe nf_conntrack_ftp

modprobe nf_nat_ftp

# modprobe nf_conntrack_netbios_ns

# modprobe nf_conntrack_irc

# modprobe nf_nat_irc

# modprobe nf_conntrack_proto_dccp

# modprobe nf_nat_proto_dccp

modprobe nf_conntrack_netlink

# modprobe nf_conntrack_pptp

# modprobe nf_nat_pptp

# modprobe nf_conntrack_proto_udplite

# modprobe nf_nat_proto_udplite

# modprobe nf_conntrack_proto_gre

# modprobe nf_nat_proto_gre

# modprobe nf_conntrack_proto_sctp

# modprobe nf_nat_proto_sctp

# modprobe nf_conntrack_sane

modprobe nf_conntrack_sip

modprobe nf_nat_sip

# modprobe nf_conntrack_tftp

# modprobe nf_nat_tftp

# modprobe nf_nat_snmp_basic

#Now we can start adding selected services to our firewall filter. The first such thing

is a localhost interface iptables -A INPUT -i lo -j ACCEPT

#We told the firewall to take all incoming packets with tcp flags NONE and just DROP them.
iptables -A INPUT -p tcp ! -m conntrack --ctstate NEW -j DROP

#We tell iptables to add (-A) a rule to the incoming (INPUT)- SSH works on port 50683

instead 22.

iptables -A INPUT -p tcp -m tcp --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set

--name SSH -j ACCEPT

iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4

--rttl --name SSH -j LOG --log-prefix "SSH_brute_force "

iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4

--rttl --name SSH -j DROP

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set

--name SSH

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -j SSH_WHITELIST

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_bru

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 4 --rttl --name SSH -j DROP

#Now I allow imap,and smtp.
-A INPUT -p tcp --dport 25 -j ACCEPT

# Allows pop and pops connections

-A INPUT -p tcp --dport 110 -j ACCEPT

-A INPUT -p tcp --dport 995 -j ACCEPT

############ IMAP & IMAPS ############

-A INPUT -p tcp --dport 143 -j ACCEPT

-A INPUT -p tcp --dport 993 -j ACCEPT

########### MYSQL ###################

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

########## R1soft CDP System ###############

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 1167 -j ACCEPT

############### outgoing ###################

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

### Allow ongoing, block incoming not defined ###

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP

iptables -L -n

iptables-save | tee /etc/iptables.test.rules

iptables-restore < /etc/iptables.test.rules

#service iptables restart