小規模ネットワークのトラフィックシェーピングを使用してPPPoEを構成する

かつて、数十台のコンピューター(オフィスと自宅)のインターネットの配布を構成するタスクがありました。 箱入りのソリューションは有料であるか、設定が難しいことが判明したため、Debian Linuxベースの独自のソリューションを使用することにしました。 この投稿で取り上げた経験を皆さんと共有したいと思いますが、ここに記載されているバージョンは、「for for myself」というマニュアルを書いてから少し古くなっている可能性があるため、注意が必要です。 また、上記のソリューションは理想的でプロフェッショナルではないことを考慮する必要があります。 むしろ、インターネットを配布するサーバーを迅速に選択する必要がある人に役立ちます。 最終的に、内部IPクライアントの割り当て、トラフィックシェーピング、DNSサーバー、およびコンソールからの現在のセッションの簡単な監視を伴うPPPoEを介したインターネット配信が可能になります。





システムの準備



aptitude update

aptitude install openssh-server mc mtr tracert nano tcpdump bind9 pppoe freeradius radiusclient1 rcconf php5








DNSサーバーのセットアップ



実施します

nano /etc/bind/named.conf.options







ファイルの最後に追加します。

allow-transfer { none; };

allow-query { 10.128.0.0/16; localhost; }; //

allow-recursion { 10.128.0.0/16; localhost; }; //

version "My ISP DNS"; //









DNSサーバーのchroot環境のセットアップを始めましょう。 DNSサーバーのルートファイルシステムのディレクトリを作成します-root-dns:

mkdir -p /root-dns/etc

mkdir /root-dns/dev

mkdir -p /root-dns/var/cache/bind

mkdir -p /root-dns/var/run/bind/run

/etc/init.d/bind9 stop

nano /etc/default/bind9








行「OPTIONS = "を見つけて、置き換えました:

OPTIONS="-u bind -t /root-dns"







mv /etc/bind /root-dns/etc

ln -s /root-dns/etc/bind /etc/bind

nano /etc/init.d/bind9









行「OPTIONS = "を見つけて、置き換えました:

OPTIONS="-u bind -t /root-dns"







以下を開始します。

nano /etc/init.d/rsyslogd







「RSYSLOGD_OPTIONS」が見つかり、置き換えられました。

RSYSLOGD_OPTIONS="-c3 -a /root-dns/dev/log"







named.conf構成ファイルを編集および削除から保護します。

chattr +i /root-dns/etc/bind/named.conf







ご注意 構成ファイルを編集する前に、「i」属性を削除することを忘れないでください(chattr -i ...)



mknod /root-dns/dev/null c 1 3

mknod /root-dns/dev/random c 1 8

chmod 666 /root-dns/dev/null /root-dns/dev/random

chown -R bind:bind /root-dns/var/*

chown -R bind:bind /root-dns/etc/bind

/etc/init.d/bind9 start









PPPoEサーバー



cd /tmp

apt-get build-dep pppoe

apt-get source pppoe

cd rp-pppoe-3.8/src

./configure









以下を開始します。

nano config.h







作成したconfig.hファイルで、次の行を置き換える必要があります。

/* #undef HAVE_LINUX_KERNEL_PPPOE */







ライン上:

#define HAVE_LINUX_KERNEL_PPPOE 1







私たちは実施します:

cd ..

./debian/rules PLUGIN_PATH=/usr/lib/pppd/2.4.4/rp-pppoe.so

./debian/rules binary

cd ..

dpkg -i pppoe_3.8-3_i386.deb









システム上のパッケージをフリーズして、自動的に更新されないようにします。

echo pppoe hold | dpkg —set-selections







これ以降、少なくともシステムを更新するたびに、更新のリストを表示する必要があります。 脆弱性を解決するpppoeのアップデートが閉じられた場合、新しいソースからパッケージを再構築し、コマンドを使用してシステムからパッケージを削除する必要があります。

echo pppoe install | dpkg --set-selections







これでPPPoEサーバーを含むパッケージがシステムにインストールされ、カーネルレベルのPPPoE接続をサポートできるようになりました。 このモードでサーバーを起動するには、前のセクションで説明したコマンドに-kオプションを追加します。pppoe-server -I eth1 -L 192.168.0.1 -k



以下を開始します。

nano /etc/ppp/pppoe-server-options







挿入:

logfile /var/log/pppoe.log

debug

mtu 1472

mru 1472

auth

require-pap

#require-chap

default-asyncmap

ktune

lcp-echo-interval 20

lcp-echo-failure 2

ms-dns 10.128.0.1

plugin radius.so

plugin radattr.so

10.128.0.1:

nobsdcomp

noccp

noendpoint

noipdefault

noipx

novj

receive-all








以下を開始します。

nano /etc/ppp/options







config / etc / ppp / options:すべてを削除して、設定します:

lock







以下を開始します。

nano /etc/init.d/pppoe-server









スクリプト:

#!/bin/bash

# init file for rp-pppoe server

#

# description: PPPOE kernel mode server

#

# processname: pppoe-server

# chkconfig: - 45 45

# source function library

#. /etc/rc.status

case "$1" in

start)

echo -n "Starting PPPOE server: "

/usr/sbin/pppoe-server -I eth0 -L 10.128.0.1 -R 10.128.1.1 -k

# eth0 — ,

#10.128.0.1 - IP PPPoE

#10.128.1.1 - IP

#touch /var/lock/subsys/pppoed

#rc_status -v

;;

stop)

echo -n "Shutting down PPPOE server: "

pkill pppoe-server

#rm -f /var/lock/subsys/pppoed

#rc_status -v

;;

restart)

$0 stop

$0 start

;;

status)

status pppoe-server

;;

*)

echo "Usage: pppoed {start|stop|restart|status}"

exit 1

esac

exit 0









以下を開始します。

rcconf







バインドを無効にします。 その後、再びそこに行き、彼がリストから完全に消えたことを確認します。 一番下にあり、次はpppoe-serverです。 彼らはこれとそれの両方を含んでいた。 アウト。



cd /root-dns/etc/bind

rndc-confgen -r /dev/urandom -a

chgrp bind rndc.key

chmod +r rndc.key

nano named.conf.options









ファイルの最後に、次を追加します。

controls {

inet 127.0.0.1 allow { localhost; } keys { rndc-key; };

};

include "/etc/bind/rndc.key";









カーネルで転送を有効にし、iptablesルールフックを作成する必要があります。 構成は今のところテストされます。



パラメーターsysctl.conf、iptables、ネットワークインターフェイス設定



以下を開始します。

nano /etc/sysctl.conf







コメントなし、そうでないものを追加:

net.ipv4.conf.default.rp_filter=1

net.ipv4.conf.all.rp_filter=1

net.ipv4.tcp_syncookies=1

net.ipv4.ip_forward=1

kernel.panic = 1

kernel.panic_on_oops = 1

kernel.panic_on_io_nmi = 1

kernel.panic_on_unrecovered_nmi = 1








最後の4行は、さまざまなシステムクラッシュ時の再起動であり、再起動のために別の都市に移動しないようにします。 保存してから、iptablesのテスト構成を作成します。

iptables -t nat -F

iptables-save > /etc/firewall.conf

nano rc.local









rc.localで次のようになります。

ifconfig eth0 up

iptables-restore </etc/firewall.conf









次に、/ etc / network / interfacesを構成します-ここではeth0がローカルであることが判明しました。自動eth0を除き、何も書き込みません。 eth1について-インターネットの場合-静的な外部IPについて考えます。そうでない場合、SNATは使用できませんが、MASQUERADEのみが使用でき、システムの読み込みが難しくなります。



以下を開始します。

nano /etc/network/interfaces







構成:

auto lo

iface lo inet loopback

auto eth0

auto eth1



allow-hotplug eth0 eth1

iface eth1 inet dhcp









このリストでは、eth1はNATおよびDHCP構成を介したインターネットです。



PPPoEサーバーのテスト実行



次に、半径のないPPPoEをテストする必要があります。 これを行うには、/ etc / ppp / pppoe-server-optionsのプラグインの2行にコメントします。



以下を開始します。

nano /etc/ppp/pppoe-server-options







構成:

#plugin radius.so

#plugin radattr.so









以下を開始します。

nano /etc/ppp/pap-secrets







最後に追加するか、内容を完全に置き換えます。

test * test 10.128.2.10







pppoe-serverを起動します。

/etc/init.d/pppoe-server start







サーバーを再起動し、PPPoEとインターネットを確認しました。 任意のクライアントで、PPPoE接続を作成し、ユーザー名とパスワードのテストを使用して接続します。 インターネットをクライアントと連携させるには、マスカレードを有効にする必要があります。

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE







動作しますか? さて、そのまま返されました:

iptables -t nat -F







フリー半径



以下を開始します。

nano /etc/radiusclient/servers







ファイルの内容を置き換えます。

127.0.0.1 my-isp-radius







以下を開始します。

nano /etc/radiusclient/radiusclient.conf







ファイルの内容を置き換えます。

auth_order radius,local

login_tries 4

login_timeout 60

nologin /etc/nologin

issue /etc/radiusclient/issue

# RADIUS settings

authserver localhost:1812

acctserver localhost:1812

servers /etc/radiusclient/servers

dictionary /etc/radiusclient/dictionary

login_radius /usr/sbin/login.radius

# RADIUS server

seqfile /var/run/radius.seq

mapfile /etc/radiusclient/port-id-map

default_realm

radius_timeout 10

radius_retries 3

login_local /bin/login









以下を開始します。

nano /etc/freeradius/radiusd.conf







ファイルの内容を置き換えます。

prefix = /usr

exec_prefix = /usr

sysconfdir = /etc

localstatedir = /var

sbindir = ${exec_prefix}/sbin

logdir = /var/log/freeradius

raddbdir = /etc/freeradius

radacctdir = ${logdir}/radacct

# .

confdir = ${raddbdir}

run_dir = ${localstatedir}/run/freeradius

# .

libdir = ${exec_prefix}/lib

# pid-. .

pidfile = ${run_dir}/freeradius.pid

# FreeRADIUS

user = freerad

group = freerad

# ( ) .

max_request_time = 30

# max_request_time

delete_blocked_requests = no

# ( ) reply NAS.

cleanup_delay = 5

# .

# 256.

# 1024.

max_requests = 5120

# ip . RADIUS

# ip .

bind_address = 127.0.0.1

# FreeRADIUS port. ,

# /etc/services

port = 0

# / ip dns .

# .

hostname_lookups = no

# / .

allow_core_dumps = no

# .

regular_expressions = yes

extended_expressions = yes

# User-Name .

log_stripped_names = no

# .

log_auth = yes

# .

# log_auth_badpass -

# log_auth_goodpass -

log_auth_badpass = yes

log_auth_goodpass = no

# / .

usercollide = no

# / .

lower_user = no

lower_pass = no

# / .

nospace_user = no

nospace_pass = no

# DoS .

security {

# RADIUS .

max_attributes = 200

# ( ) Access-Reject .

reject_delay = 1

# Status-Server

status_server = no

}

# RADIUS .

# .

$INCLUDE ${confdir}/clients.conf

# snmp .

snmp=no

# .

thread pool {

# .

start_servers = 5

# .

max_servers = 32

# .

min_spare_servers = 3

max_spare_servers = 10



# .

# RADIUS . 300,

# .

max_requests_per_server = 0

}



# .

modules {

# PAP .

# PAP .

# encryption_scheme .

# clear - .

pap {

encryption_scheme = clear

}

# CHAP .

# CHAP .

# authtype Auth-Type=CHAP

chap {

authtype = CHAP

}

# .

# .. .

preprocess {

# huntgroups - . huntgoups.

# hints - .

huntgroups = ${confdir}/huntgroups

hints = ${confdir}/hints



# Cisco VSA.

with_cisco_vsa_hack = no

}

# Microsoft CHAP .

# Microsoft CHAP v2

# authtype Auth-Type=MS-CHAP

# use_mppe = no VPN .

mschap {

authtype = MS-CHAP

use_mppe = no

}

# Livingston RADIUS .

# usersfile .

# .

# acctusersfile ().

# compat - . FreeRADIUS .

files {

usersfile = ${confdir}/users

compat = no

}



# .

detail {

detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d

detailperm = 0600

}



# .

detail auth_log {

detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d

detailperm = 0600

}



# reply .

detail reply_log {

detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d

detailperm = 0600

}



# .

# NAS Acct-Session-ID.

# key Acct-Session-ID

acct_unique {

key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id"

}



#

# cakesql.conf

#$INCLUDE ${confdir}/sql.conf

#$INCLUDE ${confdir}/sql/mysql/counter.conf

}



#

# preprocess

# .

# chap mschap chap mschap .

authorize {

preprocess

chap

mschap

# .

# auth_log

files

#sql

}

#

# , .

authenticate {

Auth-Type PAP {

pap

}



Auth-Type CHAP {

chap

}



Auth-Type MS-CHAP {

mschap

}



}

# .

preacct {

preprocess

}

# .

accounting {

# Acct-Session-Id NAS .

acct_unique

# detail .

detail

#

#sql

}

# reply-.

post-auth {

# .

reply_log

}

log {

destination = files

file = ${logdir}/radius.log

syslog_facility = daemon

stripped_names = no

auth = no

auth_badpass = no

auth_goodpass = no

}









以下を開始します。

nano /etc/freeradius/clients.conf







ファイルの内容を置き換えます。

client localhost {

ipaddr = 127.0.0.1

secret = my-isp-radius

require_message_authenticator = no

nastype = other

}









以下を開始します。

nano /etc/freeradius/users







構成:

steve Cleartext-Password := "testing"

Service-Type = Framed-User,

Framed-Protocol = PPP,

Framed-IP-Address = 10.128.13.3,

Framed-IP-Netmask = 255.255.0.0,

Framed-Routing = Broadcast-Listen,

Framed-Filter-Id = "std.ppp",

Framed-MTU = 1500,

Framed-Compression = Van-Jacobsen-TCP-IP



#



DEFAULT Framed-Protocol == PPP

Framed-Protocol = PPP,

Framed-Compression = Van-Jacobson-TCP-IP



DEFAULT Hint == "CSLIP"

Framed-Protocol = SLIP,

Framed-Compression = Van-Jacobson-TCP-IP



DEFAULT Hint == "SLIP"

Framed-Protocol = SLIP









一般に、将来的にはMySQLでバンドルを構成する必要がありますが、この段階では重要ではありません。 ユーザーを追加するとき、Freeradiusを再起動する必要があります。

/etc/init.d/freeradius restart







ここで、トラフィックシェーピングに対処する必要があります。 アイデアは、速度をユーザーごとに個別に調整し、属性としてRadiusサーバーからNATサーバーに送信することです。 なんで? そのため、後で構造を拡張し、複数のNAS間で負荷を分散することができました。



トラフィックシェーピング



だから、準備。 Wondershaperをインストールします。

aptitude install wondershaper







このパッケージは、CBQ / HTBの優先順位付けで機能する単一のスクリプトであり、健全な呼び出し形式です。 必要に応じて、実装前に作業をテストできます。

wondershaper ppp0 512 512







当然、ppp0は存在し、クライアントがサーバーに接続した結果である必要があります。 コマンドが完了すると、クライアントのWebブラウザーは、 speedtest.netなど、速度を測定する任意のサイトに移動し、シェーパーで切断されていることを確認できます。 クライアントから切断せずに(つまり、キック)設定をリセットするには、次のようにします。

wondershaper clear ppp0







そして、速度が再び正常であることを確認します(つまり、WANインターフェイスの「ビッグブラザー」から取得した速度に等しくなります。速度制限の追加は、次の場合に表示される単純なファイルパーサー/var/run/radattr.ppp* ppp接続に成功し、RadiusサーバーからPPPoEサーバーに渡されるすべての属性が含まれます。属性を処理します。追加の属性ファイル/ etc / freeradius /辞書の内容をこれで補完します。



以下を開始します。

nano /etc/freeradius/dictionary







構成:

# Limit session traffic

ATTRIBUTE Session-Octets-Limit 227 integer

# What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out)

ATTRIBUTE Octets-Direction 228 integer

# Connection Speed Limit

ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer

ATTRIBUTE PPPD-Upstream-Speed-Limit-1 232 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit-1 233 integer

ATTRIBUTE PPPD-Upstream-Speed-Limit-2 234 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit-2 235 integer

ATTRIBUTE PPPD-Upstream-Speed-Limit-3 236 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit-3 237 integer

ATTRIBUTE Acct-Interim-Interval 85 integer








さらに、これらの同じ属性をRaduisclient辞書に追加する必要があります。 / etc / radiusclient /辞書を編集し、最後に同じものを追加します:



以下を開始します。

nano /etc/radiusclient/dictionary







構成:

# Limit session traffic

ATTRIBUTE Session-Octets-Limit 227 integer

# What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out)

ATTRIBUTE Octets-Direction 228 integer

# Connection Speed Limit

ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer

ATTRIBUTE PPPD-Upstream-Speed-Limit-1 232 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit-1 233 integer

ATTRIBUTE PPPD-Upstream-Speed-Limit-2 234 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit-2 235 integer

ATTRIBUTE PPPD-Upstream-Speed-Limit-3 236 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit-3 237 integer

ATTRIBUTE Acct-Interim-Interval 85 integer









すべてが順調です。今、彼ら(FreeRadiusとRadiusClient)はお互いを理解します。 したがって、freeradiusユーザーの設定では、着信速度と発信速度の制限を示す追加の行が表示されます(ただし、必須ではありません)。 例:/ etc / freeradius /変更を伴うユーザー:



以下を開始します。

nano /etc/freeradius/users







構成:

steve Cleartext-Password := "testing"

Service-Type = Framed-User,

Framed-Protocol = PPP,

Framed-IP-Address = 10.128.13.3,

Framed-IP-Netmask = 255.255.0.0,

Framed-Routing = Broadcast-Listen,

Framed-Filter-Id = "std.ppp",

Framed-MTU = 1500,

Framed-Compression = Van-Jacobsen-TCP-IP

PPPD-Downstream-Speed-Limit = 1024,

PPPD-Upstream-Speed-Limit = 1024



#



DEFAULT Framed-Protocol == PPP

Framed-Protocol = PPP,

Framed-Compression = Van-Jacobson-TCP-IP



DEFAULT Hint == "CSLIP"

Framed-Protocol = SLIP,

Framed-Compression = Van-Jacobson-TCP-IP



DEFAULT Hint == "SLIP"

Framed-Protocol = SLIP








現在、NASは速度情報を受信して​​いますが、処理方法はわかりません。 接続を確立するときに、渡された属性を解析する2つのスクリプトを作成します。



以下を開始します。

nano /etc/ppp/ip-up.d/0001shaper







スクリプト:

#!/bin/sh

/root-scripts/shape-on $1 $5

exit 0








以下を開始します。

nano /etc/ppp/ip-down.d/0001shaper







スクリプト:

#!/bin/sh

/root-scripts/shape-off $1 $5

exit 0








これらのリストからわかるように、シェーピングを適用およびキャンセルする特定のスクリプトが呼び出されます。 この瞬間から-より詳細に。 $ 1は渡されたインターフェイス名、つまりppp0です。たとえば、$ 5はFramed-IP、つまりPPPクライアントのIPアドレスです。 切望されたディレクトリを作成し、2つのファイルを入れます。

mkdir /root-scripts

nano /root-scripts/shape-on








スクリプト:

#!/bin/sh

if [ -f /var/run/radattr.$1 ]

then

DOWNSPEED=`awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`

UPSPEED=`awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`

wondershaper $1 $DOWNSPEED $UPSPEED

fi

iptables -A FORWARD -s $2 -j ACCEPT

iptables -A INPUT -s $2 -j ACCEPT

iptables -t nat -A POSTROUTING -s $2 -o eth1 -j MASQUERADE









以下を開始します。

nano /root-scripts/shape-off







スクリプト:

#!/bin/sh

iptables -D FORWARD -s $2 -j ACCEPT

iptables -D INPUT -s $2 -j ACCEPT

iptables -t nat -D POSTROUTING -s $2 -o eth1 -j MASQUERADE









以下を開始します。

chmod +x /root-scripts/*







リストでは、eth1は依然としてWANインターフェースです。 したがって、結果として何が得られますか:クライアントはPPPサーバーに接続し、IPアドレスを受け取ります。 PPPクライアントインターフェイスでシェーピングを設定し、そのマスキングを含むスクリプトが自動的に呼び出されます。 切断されると、マスカレードルールも自動的に削除されます。 wondershaperを強制的にpppxから切断する必要はないようです。いずれの場合でも、マニュアルはそれについて黙っており、実際にはすべてが正常に機能します。



シンプルなiptables保護



ここで、iptablesとサーバーのセキュリティに少し注意を払いましょう。 /etc/firewall.confを置き換えます。



以下を開始します。

nano /etc/firewall.conf







スクリプト:

#!/bin/bash



#reset all

iptables -F

iptables -Z

iptables -t nat -F

iptables -t nat -Z



#iface config

INET_IFACE="eth1"

LO_IFACE="lo"

LO_IP="127.0.0.1"



#kernel modules

modprobe ip_tables

modprobe ip_conntrack

modprobe iptable_filter

modprobe iptable_mangle

modprobe iptable_nat

modprobe ipt_LOG

modprobe ipt_limit

modprobe ipt_state

modprobe ipt_MASQUERADE

modprobe ip_conntrack_ftp

modprobe ip_conntrack_irc

modprobe ip_nat_ftp

modprobe ip_nat_irc



#default policy

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP



#user chains

iptables -N bad_tcp_packets

iptables -N allowed

iptables -N tcp_packets

iptables -N udp_packets

iptables -N icmp_packets

iptables -N blocksshd

blocksshd --start



###bad_tcp_packets chain

iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

#iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"

iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP



###allowed chain

iptables -A allowed -p TCP --syn -j ACCEPT

iptables -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A allowed -p TCP -j DROP



###tcp_packets chain

iptables -A tcp_packets -p TCP -s 0/0 --dport 22 -j blocksshd

iptables -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed

iptables -A tcp_packets -p TCP -s 0/0 --dport 25 -j allowed

#iptables -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed



###udp_packets chain

iptables -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT



###icmp chain

iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT



###input chain

iptables -A INPUT -p TCP -j bad_tcp_packets

iptables -A INPUT -p ALL -i $LO_IFACE -j ACCEPT

iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p TCP -i $INET_IFACE -j tcp_packets

iptables -A INPUT -p UDP -i $INET_IFACE -j udp_packets

iptables -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

#iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "



###forward chain

iptables -A FORWARD -p tcp -j bad_tcp_packets

#custom rules

#iptables -A FORWARD -s 10.128.0.10/32 -d 192.168.1.1/32 -p tcp -j ACCEPT

iptables -A FORWARD -s 10.128.0.0/16 -d 192.168.1.1/32 -p tcp -j DROP

#/custom rules

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "



###OUTPUT chain

iptables -A OUTPUT -p tcp -j bad_tcp_packets

iptables -A OUTPUT -p ALL -j ACCEPT

#iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "



###mangle

iptables -t mangle -A POSTROUTING -o $INET_IFACE -j TTL --ttl-set 64









ここで何が見えますか? まず、強調表示されたルール。 実際の構成が異なるか、単に不必要なものとして不在になりますが、その意味は次のとおりです:サーバーゲートウェイがADSLモデムまたはWeb管理パネルを備えた同様のデバイスである場合、そこにログインするための巧妙なパスワードを作成する必要はありません。 代わりに、クライアントトンネルからのアクセスを禁止しますが、そのうちの1つを許可します-これは侵入可能なサービスアカウントになります。 もちろん、それは顧客向けではありません。 次。 ブルートフォースSSHサーバーに対する保護を含むコマンドが追加されました。 彼らの仕事のために、blockshdを設定する必要があります。



BlockSSHd



まず、 blocksshd.sourceforge.netからダウンロードして、どこかでファイルを解凍する必要があります。 ダウンロードにはwgetを使用しましたが、もちろん-パスはSourceForgeページからカットされました。つまり、ほとんどの場合異なるでしょう:

cd /tmp

wget downloads.sourceforge.net/project/blocksshd/blocksshd/BlockSSHD%201.3/blocksshd-1.3.tar.gz?use_mirror=kent









このスクリプトはPerlで書かれており、動作するためにいくつかの追加モジュールが必要です。 それでは、モジュールに入りましょう:

cpan

upgrade

install Sys::Syslog

install Sys::Hostname

install File::Tail

install Tie::File

install Net::DNS

install Net::Subnets

install Getopt::Long

exit









このすべてを一挙にコピーしてターミナルにコピーアンドペーストする必要がないという事実に注意を促します。 これは、各操作が完了するまでに多くの時間を必要とし、インストール全体でCpanが質問をするためです。 すべての質問に対して、Enterキーを押すだけで、デフォルトではすべてが正しく、奇妙なことに十分です。



次に、blocksshdを解凍してインストールする必要があります。

cd /tmp

tar -xvzf ./blocksshd-1.3.tar.gz

cd blocksshd-1.3

make install









もちろん、マニュアルを書いている時点でのバージョンはまさにこれまたは多分どれでもあったので、コンソールにコピーせずにすべてを注意深く行う必要があります。 blocksshdの設定を編集するために残ります:



以下を開始します。

nano /etc/blocksshd.conf







構成:

$cfg = {

os => 'linux', # Target OS - either linux or bsd

chain => 'blocksshd', # Name of iptables or pf chain

logfile => '/var/log/secure', # Log file to monitor

logcheck => '10', # How often to check the log file

max_attempts => '4', # Max number of failures

timeout => '360', # Reset IP count if no activity after time out in seconds

unblock => '1', # Enable unblocking

unblock_timeout => '43200', # Time in seconds after which to unblock a blocked IP address

restore_blocked => '0', # Turn on checking for previously blocked IPs

log_ips => '/etc/blocksshd.list', # Log file for blocked IPs

pid_file => '/var/run/blocksshd.pid', # Location of PID file

send_email => '0', # Enable the sending of email notifications

email => 'root', # Email address to send notifications

mail => '/bin/mail', # Location of mail binary

email_whois_lookup => '1', # enable whois lookup of the blocked ip addres in the sent email

whois => '/usr/bin/whois', # location of the whois binary

sed => '/bin/sed', # location of the sed binary

iptables => '/sbin/iptables', # Location of iptables binary - only for Linux

pfctl => '/sbin/pfctl', # Location of pfctl binary - only for BSD

whitelist => [qw{

127.0.0.1/32

}], # whitelist - list of IPs that will never be blocked - IPs must be specified in the form ad$

};



#leave 1; here!

1;









このリストでは、強調表示された行に注意する必要があります。 1つ目は1つのアドレスから入力する最大試行回数、2つ目は3行目に指定された秒単位の時間が経過した後に禁止IPのロックを解除する必要があるかどうかです。 4番目-ハッキングの試みをメールで通知するかどうか。

これで、サーバーを再起動して、何が起こったかをテストできます。



最も簡単な監視



アクティブなセッションを監視するのに便利なように、「膝の上に」書かれたスクリプトを使用できます。 それを作成して、シンボリックリンクを設定して簡単に起動し、もちろんチェックしてみましょう:



以下を開始します。

nano /root-scripts/clients







スクリプト:

#!/usr/bin/php

<?

function time_since($original) {

$chunks = array(

array(60 * 60 * 24 , 'D '),

array(60 * 60 , 'h:'),

array(60 , 'min'),

);

$today = time();

$since = $today - $original;

for ($i = 0, $j = count($chunks); $i < $j; $i++) {

$seconds = $chunks[$i][0];

$name = $chunks[$i][1];

if (($count = floor($since / $seconds)) != 0) {

break;

}

}

$print = "$count{$name}";

if ($i + 1 < $j) {

$seconds2 = $chunks[$i + 1][0];

$name2 = $chunks[$i + 1][1];

if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0) {

$print .= "$count2{$name2}";

}

}

return $print;

}



function execShellCmdRaw($cmd) {

ob_start();

passthru($cmd);

$buffer = ob_get_contents();

ob_end_clean();

return $buffer;

}



function rawToArray($buffer) {

return empty($buffer)?array():preg_split('/[\r\n]+/', $buffer, -1, PREG_SPLIT_NO_EMPTY);

}



function execShellCmd($cmd) {

return rawToArray(execShellCmdRaw($cmd));

}



function getNATSources() {

$nat = execShellCmd('iptables -t nat -L | grep MASQUERADE');

$nats = array();

foreach ($nat as $s) {

$pos_start = strpos($s, '--') + 2;

$pos_end = strpos($s, 'anywhere');

$n = trim(substr($s, $pos_start, $pos_end - $pos_start));

$nats[$n] = $n;

}

return $nats;

}



function getTunnelMacAddr($pid) {

$pppdc = execShellCmd('ps -p '.$pid.' -f | grep pppd');

$pppdc = $pppdc[0];

$pos_start = strpos($pppdc, '-e ') + 3;

$pos_end = strpos($pppdc, '-S \'\'');

return trim(substr($pppdc, $pos_start, $pos_end - $pos_start));

}



function getPPPTunnels() {

$ifc = execShellCmd('ifconfig -a');

$tunnels = array();

$nat = getNATSources();

foreach ($ifc as $i => $s) {

if (substr($s, 0, 3) == 'ppp') {

$ppp = array();

$ppp['interface'] = substr($s, 0, 4);

$ppp['framed_ip'] = trim(substr($ifc[$i+1], strpos($ifc[$i+1], 'PtP:') + 6, 12));

$RXpos_start = strpos($ifc[$i+6], '(') + 1;

$RXpos_end = strpos($ifc[$i+6], ')');

$ppp['tx'] = substr($ifc[$i+6], $RXpos_start, $RXpos_end - $RXpos_start); //TX(user) = RX(server)

$tx_sub = substr($ifc[$i+6], $RXpos_end + 1);

$TXpos_start = strpos($tx_sub, '(') + 1;

$TXpos_end = strpos($tx_sub, ')');

$ppp['rx'] = substr($tx_sub, $TXpos_start, $TXpos_end - $TXpos_start);

$ppp['nat'] = array_key_exists($ppp['framed_ip'], $nat)?'on':'off';

$pidf = '/var/run/'.$ppp['interface'].'.pid';

if (file_exists($pidf)) {

$ppp['uptime'] = time_since(filemtime($pidf));

$ppp['pid'] = trim(file_get_contents($pidf));

$ppp['mac_addr'] = getTunnelMacAddr($ppp['pid']);

$ppp['username'] = 'detectedusername';

$tunnels[] = $ppp;

}

}

}

return $tunnels;

}



function clientTable($tunnels) {

printf("\n");

printf(" %15s | ","IP Address");

printf("%20s | ","MAC Address ");

printf("%3s | ","NAT");

printf("%16s | ","User name ");

printf("%9s | ","TX (up)");

printf("%9s | ","RX (down)");

printf("%11s","Uptime ");

printf("\n ");

for ($i = 0; $i < 101; $i++) printf("-");

printf("\n");

foreach($tunnels as $tun) {

printf(" %15s | ",$tun['framed_ip']);

printf("%20s | ",$tun['mac_addr']);

printf("%3s | ",$tun['nat']);

printf("%16s | ",$tun['username']);

printf("%9s | ",$tun['tx']);

printf("%9s | ",$tun['rx']);

printf("%11s",$tun['uptime']);

printf("\n");

}

printf("\n");

}



function addRadParams(&$tunnels = NULL) {

$radusers = rawToArray(file_get_contents('/etc/freeradius/users'));

$users = array();

foreach ($radusers as $i => $s) {

if (strpos($s, 'Cleartext-Password') !== FALSE) {

$user = array();

$user['username'] = trim(substr($s, 0, strpos($s, 'Cleartext-Password')));

$si = $i + 1;

while (strpos($radusers[$si], 'Framed-IP-Address') == FALSE) $si++;

$ip_raw = explode('=', $radusers[$si]);

$ip_raw = $ip_raw[1];

$users[trim($ip_raw, ' ,')] = $user;

}

}

foreach ($tunnels as $i => $tun) {

$tunnels[$i]['username'] = $users[$tun['framed_ip']]['username'];

}

return $tunnels;

}



$t = getPPPTunnels();

addRadParams($t);

clientTable($t);









以下を開始します。

chmod +x /root-scripts/clients

ln -s /root-scripts/clients /usr/bin/clients

clients









次のようなものが得られます。



IP Address | MAC Address | NAT | User name | TX (up) | RX (down) | Uptime

-----------------------------------------------------------------------------------------------------

10.128.1.7 | 1:00:19:66:df:39:26 | on | room56 | 507.4 MiB | 445.5 MiB | 16h:31min

10.128.1.3 | 23:00:13:8f:70:30:03 | on | room47 | 8.2 MiB | 137.8 MiB | 1h:14min

10.128.1.5 | 3:00:a1:b0:11:74:cf | on | room50 | 19.2 MiB | 500.2 MiB | 16h:30min









以上で、サーバーを使用する準備が整いました。 私の観察によれば、1 GB DDR1と2 GHzプロセッサを備えたシンプルなシステムユニットで30ユーザーに16メガバイトのチャネルを分配するのに十分であり(もはや必要ありません)、システムに顕著な負荷は発生しません。



プロバイダーを始めて頑張ってください!



All Articles