web-dev-qa-db-ja.com

conntrackを使用している場合にのみSSHをブロックするIPtables

エラー

ご覧のとおり、機能している構成と機能していない構成の唯一の違いは-m conntrack --ctstate NEW,ESTABLISHED,RELATEDです。 -m conntrack --ctstate NEW,ESTABLISHEDを使用すると、それも機能しません...しかし、なぜですか?!

いくつかのテストの後、conntrackを使用するすべてのルールが機能しないことに気付きました...iptablesを使用する場合にのみSSHがconntrackによってブロックされる理由を説明できますか?

ありがとう:-)

作業構成

#!/ bin/bash 
 
 SERVER_IP = "XXXX" 
 
 iptables -F 
 iptables -X 
 
#デフォルトのフィルターポリシーの設定
 iptables -P INPUT DROP 
 iptables -P OUTPUT ACCEPT 
 iptables -P FORWARD DROP 
 
#以前の接続を許可する
 iptables -A INPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT 
 iptables -A OUTPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT 
 
#ループバックで無制限のトラフィックを許可する
 iptables -A INPUT -i lo -j ACCEPT 
 iptables -A OUTPUT -o lo -j ACCEPT 
 
#着信sshのみを許可
 iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -j ACCEPT 
 iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -j LOG --log-prefix "[ACCEPT INPUT] [SSH]" 
 
 
#makeこのボックスから何も出入りしないことを確認してください
 iptables -A INPUT -j LOG --log-prefix "[DROP INPUT] [DEFAULT]" 
 iptables -A INPUT -j DROP 

構成が機能していない

#!/ bin/bash 
 
 SERVER_IP = "XXXX" 
 
 iptables -F 
 iptables -X 
 
#デフォルトのフィルターポリシーの設定
 iptables -P INPUT DROP 
 iptables -P OUTPUT ACCEPT 
 iptables -P FORWARD DROP 
 
#以前の接続を許可する
 iptables -A INPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT 
 iptables -A OUTPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT 
 
#ループバックで無制限のトラフィックを許可する
 iptables -A INPUT -i lo -j ACCEPT 
 iptables -A OUTPUT -o lo -j ACCEPT 
 
#着信sshのみを許可
 iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -m conntrack --ctstate NEW、ESTABLISHED、RELATED -j ACCEPT 
 iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -m conntrack --ctstate NEW、ESTABLISHED、RELATED -j LOG --log-prefix "[ACCEPT INPUT ] [SSH] "
 
 
#このボックスから何も出入りしないことを確認してください
 iptables -A INPUT -j LOG --log-prefix "[DROP INPUT] [DEFAULT]" 
 iptables -A INPUT -j DROP 

[編集]

Conntrackが関与していることをどのように確信できますか?

ログファイルで私はこのようなものを見ることができるので:

[DROP][INPUT] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=X.X.X.X DST=X.X.X.X LEN=67 TOS=0x08 PREC=0x20 TTL=41 ID=39550 DF PROTO=TCP SPT=51093 DPT=22 WINDOW=229 RES=0x00 ACK PSH URGP

[DROP][INPUT]は、私のiptables構成ファイルの最後のルールです。

1
flexbrane

今回は、なぜこれが機能しないのかわからないまま、それを機能させる方法を知っています。 iptablesサービスを再起動すると、スクリプトが機能します:systemctl restart iptables

この単純なスクリプトに取り組む前に、私は別のスクリプトをもっと長く実装しようとしていました。 PREROUTINGや他の習慣のような他のチェーンに新しいルールを適用します。このスクリプトは、おそらくテーブルを最大限に埋めることによって、iptablescstateまたはconntrackでの作業を停止するように強制したに違いありませんか?

1
flexbrane

ご回答ありがとうございます!firewalldを削除してiptablesを優先したところ、いくつかの依存関係も削除したようです。削除してからiptablesを再度インストールすると、構成が機能的になりました。

[編集]実際、これはまだ機能していません:-(

ログで、「SYN」と「ACKSYN」のパケットがiptablesによってドロップされていることに気付きました。

 
 Dec 17 08:03:38 loki kernel:[DROP] [INPUT] [DEFAULT] IN = eth0 OUT = MAC = 0c:c4:...:00 SRC = myIP DST = serverIP LEN = 52 TOS = 0x00 PREC = 0x00 TTL = 120 ID = 12527 DF PROTO = TCP SPT = 51942 DPT = 22 WINDOW = 64240 RES = 0x00 SYN URGP = 0 
 12月17日08:03:38lokiカーネル:[DROP] [OUTPUT] [DEFAULT] IN = OUT = eth0 SRC = serverIP DST = myIP LEN = 52 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 0 DF PROTO = TCP SPT = 22 DPT = 51942 WINDOW = 29200 RES = 0x00 ACK SYN URGP = 0 
 Dec 17 08:03:38 loki kernel:[INPUT] [DROP] [NOT SYN] IN = eth0 OUT = MAC = 0c:c4:...:00 SRC = myIP DST = serverIP LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 120 ID = 12528 DF PROTO = TCP SPT = 51942 DPT = 22 WINDOW = 256 RES = 0x00 ACK URGP = 0 
 Dec 17 08:03:38 loki kernel:[ACCEPT] [INPUT] [SSH] IN = eth0 OUT = MAC = 0c:c4 :...:00 SRC = myIP DST = serverIP LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 120 ID = 12528 DF PROTO = TCP SPT = 51942 DPT = 22 WINDOW = 256 RES = 0x00 ACK URGP = 0 
 Dec 17 08:03:38 loki sshd [5074]:serverIPポート22 
 Dec 17 08:0のmyIPポート51942からの接続3:39 loki sshd [5074]:myIPポートからmyUSERのパスワードを受け入れた51942 ssh2 
 Dec 17 08:03:39 loki systemd-logind:ユーザーmyUSERの新しいセッション307。
 Dec 17 08 :03:39 loki systemd:ユーザーmyUSERのセッション307を開始しました。
 

私のルールでわかるように、サーバーへの接続を維持するために、テストのために実際にパケをドロップしませんでした。ここで使用されるスクリプトは次のとおりです。

 
#!/ bin/bash 
 
#
#========= 
#すべてリセット
#========= 
#
 iptables = "iptables" 
 ip6tables = "ip6tables" 
 
#ハードリセット
 $ iptables -P INPUT ACCEPT 
 $ iptables -P FORWARD ACCEPT 
 $ iptables -P OUTPUT ACCEPT 
 $ iptables -F 
 $ iptables -X 
#$ iptables -t nat -F 
#$ iptables -t mangle -F 
 
 
 ##ドロップブロードキャスト(ログなし)
 $ iptables -A INPUT -m pkttype--pkt-typeブロードキャスト-jDROP 
 $ iptables -A FORWARD -m pkttype--pkt-タイプブロードキャスト-jDROP 
 $ iptables -A INPUT -d 255.255.255.255 -j DROP 
 $ iptables -A FORWARD -d 255.255.255.255 -j DROP 
 
#接続を開いたままにします
#RELATEDを使用しませんか? https://Gist.github.com/azlux/6a70bd38bb7c525ab26efe7e3a7ea8ac
$iptables -A INPUT -m conntrack --ctstate ESTABLISHED、RELATED -j ACCEPT 
 $ iptables -A OUTPUT -mconntrack- ctstate ESTABLISHED、RELATED -j ACCEPT 
 
#
#=============== 
#localhost [.____を許可する。]#=============== 
#
 $ iptables -A INPUT -i lo -j ACCEPT 
 $ iptables -A OUTPUT -o lo -j ACCEPT 
 
#
#==== 
#IPv6 
#==== 
# 
 $ ip6tables -P INPUT DROP 
 $ ip6tables -A OUTPUT -j REJECT 
 $ ip6tables -P FORWARD DROP 
 
#
#=========== 
#ポートを許可する
#=========== 
#
 
 ## NEW NOT SYNC 
 $ iptables -A INPUT -p tcp! --syn -m conntrack --ctstate NEW -j LOG --log-prefix "[INPUT] [DROP] [NOT SYN]" 
 
 ## DNS(ログなし)
 $ iptables -A OUTPUT -p udp -s 0/0 --dport 53 -m conntrack --ctstate NEW、RELATED、ESTABLISHED -j ACCEPT 
 $ iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT 
 
 
 ## SSH 
 $ iptables -A INPUT -p tcp -s 0/0- dport 22 -m conntrack --ctstate NEW、RELATED、ESTABLISHED -j LOG --log-prefix "[ACCEPT] [INPUT] [SSH]" 
 $ iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate NEW、RELATED、ESTABLISHED -j ACCEPT 
 $ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT 
 
#
#================= 
#DROPパケットをログに記録
#==== ============= 
#
 $ iptables -A INPUT -j LOG --log-prefix = "[DROP] [INPUT] [DEFAULT]" 
 $ iptables -A FORWARD -j LOG --log-prefix = "[DROP] [FORWARD] [DEFAU LT] "
 $ iptables -A OUTPUT -j LOG --log-prefix =" [DROP] [OUTPUT] [DEFAULT] "
 
 exit 0 
 
0
flexbrane