Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8f1825776 | ||
|
|
dde25f89e1 | ||
|
|
98f73e44d0 | ||
|
|
e0189ab1de | ||
|
|
e68b3e430b | ||
|
|
bac675d7f6 | ||
|
|
291adf8b85 | ||
|
|
1423fe1921 | ||
|
|
5a5c8b9c7e | ||
|
|
70559a1030 | ||
|
|
45ee594d58 | ||
|
|
707b5c1def | ||
|
|
d91f7d85d4 | ||
|
|
5a5158b33f | ||
|
|
7f19c31640 | ||
|
|
937693519a |
@@ -1,3 +1,6 @@
|
|||||||
|
2.6.2 2015-01-03
|
||||||
|
- Log client IP
|
||||||
|
|
||||||
2.6.1 2014-12-26
|
2.6.1 2014-12-26
|
||||||
- Fix a problem with TCP Fast Open on local side
|
- Fix a problem with TCP Fast Open on local side
|
||||||
- Fix sometimes daemon_start returns wrong exit status
|
- Fix sometimes daemon_start returns wrong exit status
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Shadowsocks
|
Shadowsocks
|
||||||
|
|
||||||
Copyright (c) 2014 clowwindy
|
Copyright (c) 2012-2015 clowwindy
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ Documentation
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
You can find all the documentation in the wiki:
|
You can find all the documentation in the wiki:
|
||||||
https://github.com/clowwindy/shadowsocks/wiki
|
https://github.com/shadowsocks/shadowsocks/wiki
|
||||||
|
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
@@ -118,23 +118,23 @@ Bugs and Issues
|
|||||||
* [Mailing list]
|
* [Mailing list]
|
||||||
|
|
||||||
|
|
||||||
[Android]: https://github.com/clowwindy/shadowsocks/wiki/Ports-and-Clients#android
|
[Android]: https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#android
|
||||||
[Build Status]: https://img.shields.io/travis/clowwindy/shadowsocks/master.svg?style=flat
|
[Build Status]: https://img.shields.io/travis/shadowsocks/shadowsocks/master.svg?style=flat
|
||||||
[Chinese Readme]: https://github.com/clowwindy/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
|
[Chinese Readme]: https://github.com/shadowsocks/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
|
||||||
[Coverage Status]: http://192.81.132.184/result/shadowsocks
|
[Coverage Status]: http://192.81.132.184/result/shadowsocks
|
||||||
[Coverage]: http://192.81.132.184/job/Shadowsocks/ws/htmlcov/index.html
|
[Coverage]: http://192.81.132.184/job/Shadowsocks/ws/htmlcov/index.html
|
||||||
[Debian sid]: https://packages.debian.org/unstable/python/shadowsocks
|
[Debian sid]: https://packages.debian.org/unstable/python/shadowsocks
|
||||||
[the package]: https://pypi.python.org/pypi/shadowsocks
|
[the package]: https://pypi.python.org/pypi/shadowsocks
|
||||||
[Encryption]: https://github.com/clowwindy/shadowsocks/wiki/Encryption
|
[Encryption]: https://github.com/shadowsocks/shadowsocks/wiki/Encryption
|
||||||
[iOS]: https://github.com/shadowsocks/shadowsocks-iOS/wiki/Help
|
[iOS]: https://github.com/shadowsocks/shadowsocks-iOS/wiki/Help
|
||||||
[Issue Tracker]: https://github.com/clowwindy/shadowsocks/issues?state=open
|
[Issue Tracker]: https://github.com/shadowsocks/shadowsocks/issues?state=open
|
||||||
[Mailing list]: http://groups.google.com/group/shadowsocks
|
[Mailing list]: http://groups.google.com/group/shadowsocks
|
||||||
[OpenSSL for Windows]: http://slproweb.com/products/Win32OpenSSL.html
|
[OpenSSL for Windows]: http://slproweb.com/products/Win32OpenSSL.html
|
||||||
[OpenWRT]: https://github.com/clowwindy/shadowsocks/wiki/Ports-and-Clients#openwrt
|
[OpenWRT]: https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#openwrt
|
||||||
[OS X]: https://github.com/shadowsocks/shadowsocks-iOS/wiki/Shadowsocks-for-OSX-Help
|
[OS X]: https://github.com/shadowsocks/shadowsocks-iOS/wiki/Shadowsocks-for-OSX-Help
|
||||||
[PyPI]: https://pypi.python.org/pypi/shadowsocks
|
[PyPI]: https://pypi.python.org/pypi/shadowsocks
|
||||||
[PyPI version]: https://img.shields.io/pypi/v/shadowsocks.svg?style=flat
|
[PyPI version]: https://img.shields.io/pypi/v/shadowsocks.svg?style=flat
|
||||||
[TCP_FASTOPEN]: https://github.com/clowwindy/shadowsocks/wiki/TCP-Fast-Open
|
[TCP_FASTOPEN]: https://github.com/shadowsocks/shadowsocks/wiki/TCP-Fast-Open
|
||||||
[Travis CI]: https://travis-ci.org/clowwindy/shadowsocks
|
[Travis CI]: https://travis-ci.org/shadowsocks/shadowsocks
|
||||||
[Troubleshooting]: https://github.com/clowwindy/shadowsocks/wiki/Troubleshooting
|
[Troubleshooting]: https://github.com/shadowsocks/shadowsocks/wiki/Troubleshooting
|
||||||
[Windows]: https://github.com/clowwindy/shadowsocks/wiki/Ports-and-Clients#windows
|
[Windows]: https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#windows
|
||||||
|
|||||||
+33
-31
@@ -1,11 +1,11 @@
|
|||||||
shadowsocks
|
shadowsocks
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|PyPI version| |Build Status|
|
|PyPI version| |Build Status| |Coverage Status|
|
||||||
|
|
||||||
A fast tunnel proxy that helps you bypass firewalls.
|
A fast tunnel proxy that helps you bypass firewalls.
|
||||||
|
|
||||||
`中文说明 <https://github.com/clowwindy/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E>`__
|
`中文说明 <https://github.com/shadowsocks/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E>`__
|
||||||
|
|
||||||
Install
|
Install
|
||||||
-------
|
-------
|
||||||
@@ -16,12 +16,12 @@ server.
|
|||||||
Client
|
Client
|
||||||
~~~~~~
|
~~~~~~
|
||||||
|
|
||||||
- `Windows <https://github.com/clowwindy/shadowsocks/wiki/Ports-and-Clients#windows>`__
|
- `Windows <https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#windows>`__
|
||||||
/ `OS
|
/ `OS
|
||||||
X <https://github.com/shadowsocks/shadowsocks-iOS/wiki/Shadowsocks-for-OSX-Help>`__
|
X <https://github.com/shadowsocks/shadowsocks-iOS/wiki/Shadowsocks-for-OSX-Help>`__
|
||||||
- `Android <https://github.com/clowwindy/shadowsocks/wiki/Ports-and-Clients#android>`__
|
- `Android <https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#android>`__
|
||||||
/ `iOS <https://github.com/shadowsocks/shadowsocks-iOS/wiki/Help>`__
|
/ `iOS <https://github.com/shadowsocks/shadowsocks-iOS/wiki/Help>`__
|
||||||
- `OpenWRT <https://github.com/clowwindy/shadowsocks/wiki/Ports-and-Clients#openwrt>`__
|
- `OpenWRT <https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#openwrt>`__
|
||||||
|
|
||||||
Server
|
Server
|
||||||
~~~~~~
|
~~~~~~
|
||||||
@@ -77,27 +77,27 @@ On your server create a config file ``/etc/shadowsocks.json``. Example:
|
|||||||
|
|
||||||
Explanation of the fields:
|
Explanation of the fields:
|
||||||
|
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| Name | Explanation |
|
| Name | Explanation |
|
||||||
+==================+=========================================================================================================+
|
+==================+===========================================================================================================+
|
||||||
| server | the address your server listens |
|
| server | the address your server listens |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| server\_port | server port |
|
| server\_port | server port |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| local\_address | the address your local listens |
|
| local\_address | the address your local listens |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| local\_port | local port |
|
| local\_port | local port |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| password | password used for encryption |
|
| password | password used for encryption |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| timeout | in seconds |
|
| timeout | in seconds |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| method | default: "aes-256-cfb", see `Encryption <https://github.com/clowwindy/shadowsocks/wiki/Encryption>`__ |
|
| method | default: "aes-256-cfb", see `Encryption <https://github.com/shadowsocks/shadowsocks/wiki/Encryption>`__ |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| fast\_open | use `TCP\_FASTOPEN <https://github.com/clowwindy/shadowsocks/wiki/TCP-Fast-Open>`__, true / false |
|
| fast\_open | use `TCP\_FASTOPEN <https://github.com/shadowsocks/shadowsocks/wiki/TCP-Fast-Open>`__, true / false |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
| workers | number of workers, available on Unix/Linux |
|
| workers | number of workers, available on Unix/Linux |
|
||||||
+------------------+---------------------------------------------------------------------------------------------------------+
|
+------------------+-----------------------------------------------------------------------------------------------------------+
|
||||||
|
|
||||||
On your server:
|
On your server:
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ Documentation
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
You can find all the documentation in the wiki:
|
You can find all the documentation in the wiki:
|
||||||
https://github.com/clowwindy/shadowsocks/wiki
|
https://github.com/shadowsocks/shadowsocks/wiki
|
||||||
|
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
@@ -144,12 +144,14 @@ MIT
|
|||||||
Bugs and Issues
|
Bugs and Issues
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
- `Troubleshooting <https://github.com/clowwindy/shadowsocks/wiki/Troubleshooting>`__
|
- `Troubleshooting <https://github.com/shadowsocks/shadowsocks/wiki/Troubleshooting>`__
|
||||||
- `Issue
|
- `Issue
|
||||||
Tracker <https://github.com/clowwindy/shadowsocks/issues?state=open>`__
|
Tracker <https://github.com/shadowsocks/shadowsocks/issues?state=open>`__
|
||||||
- `Mailing list <http://groups.google.com/group/shadowsocks>`__
|
- `Mailing list <http://groups.google.com/group/shadowsocks>`__
|
||||||
|
|
||||||
.. |PyPI version| image:: https://img.shields.io/pypi/v/shadowsocks.svg?style=flat
|
.. |PyPI version| image:: https://img.shields.io/pypi/v/shadowsocks.svg?style=flat
|
||||||
:target: https://pypi.python.org/pypi/shadowsocks
|
:target: https://pypi.python.org/pypi/shadowsocks
|
||||||
.. |Build Status| image:: https://img.shields.io/travis/clowwindy/shadowsocks/master.svg?style=flat
|
.. |Build Status| image:: https://img.shields.io/travis/shadowsocks/shadowsocks/master.svg?style=flat
|
||||||
:target: https://travis-ci.org/clowwindy/shadowsocks
|
:target: https://travis-ci.org/shadowsocks/shadowsocks
|
||||||
|
.. |Coverage Status| image:: http://192.81.132.184/result/shadowsocks
|
||||||
|
:target: http://192.81.132.184/job/Shadowsocks/ws/htmlcov/index.html
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ with codecs.open('README.rst', encoding='utf-8') as f:
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="shadowsocks",
|
name="shadowsocks",
|
||||||
version="2.6.1",
|
version="2.6.2",
|
||||||
license='MIT',
|
license='MIT',
|
||||||
description="A fast tunnel proxy that help you get through firewalls",
|
description="A fast tunnel proxy that help you get through firewalls",
|
||||||
author='clowwindy',
|
author='clowwindy',
|
||||||
author_email='clowwindy42@gmail.com',
|
author_email='clowwindy42@gmail.com',
|
||||||
url='https://github.com/clowwindy/shadowsocks',
|
url='https://github.com/shadowsocks/shadowsocks',
|
||||||
packages=['shadowsocks', 'shadowsocks.crypto'],
|
packages=['shadowsocks', 'shadowsocks.crypto'],
|
||||||
package_data={
|
package_data={
|
||||||
'shadowsocks': ['README.rst', 'LICENSE']
|
'shadowsocks': ['README.rst', 'LICENSE']
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ def load_libsodium():
|
|||||||
global loaded, libsodium, buf
|
global loaded, libsodium, buf
|
||||||
|
|
||||||
from ctypes.util import find_library
|
from ctypes.util import find_library
|
||||||
for p in ('sodium',):
|
for p in ('sodium', 'libsodium'):
|
||||||
libsodium_path = find_library(p)
|
libsodium_path = find_library(p)
|
||||||
if libsodium_path:
|
if libsodium_path:
|
||||||
break
|
break
|
||||||
|
|||||||
+11
-5
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (c) 2014 clowwindy
|
# Copyright (c) 2015 clowwindy
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -121,6 +121,7 @@ class TCPRelayHandler(object):
|
|||||||
self._data_to_write_to_remote = []
|
self._data_to_write_to_remote = []
|
||||||
self._upstream_status = WAIT_STATUS_READING
|
self._upstream_status = WAIT_STATUS_READING
|
||||||
self._downstream_status = WAIT_STATUS_INIT
|
self._downstream_status = WAIT_STATUS_INIT
|
||||||
|
self._client_address = local_sock.getpeername()[:2]
|
||||||
self._remote_address = None
|
self._remote_address = None
|
||||||
if is_local:
|
if is_local:
|
||||||
self._chosen_server = self._get_a_server()
|
self._chosen_server = self._get_a_server()
|
||||||
@@ -294,8 +295,9 @@ class TCPRelayHandler(object):
|
|||||||
if header_result is None:
|
if header_result is None:
|
||||||
raise Exception('can not parse header')
|
raise Exception('can not parse header')
|
||||||
addrtype, remote_addr, remote_port, header_length = header_result
|
addrtype, remote_addr, remote_port, header_length = header_result
|
||||||
logging.info('connecting %s:%d' % (common.to_str(remote_addr),
|
logging.info('connecting %s:%d from %s:%d' %
|
||||||
remote_port))
|
(common.to_str(remote_addr), remote_port,
|
||||||
|
self._client_address[0], self._client_address[1]))
|
||||||
self._remote_address = (remote_addr, remote_port)
|
self._remote_address = (remote_addr, remote_port)
|
||||||
# pause reading
|
# pause reading
|
||||||
self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)
|
self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)
|
||||||
@@ -317,7 +319,7 @@ class TCPRelayHandler(object):
|
|||||||
self._dns_resolver.resolve(remote_addr,
|
self._dns_resolver.resolve(remote_addr,
|
||||||
self._handle_dns_resolved)
|
self._handle_dns_resolved)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(e)
|
self._log_error(e)
|
||||||
if self._config['verbose']:
|
if self._config['verbose']:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
# TODO use logging when debug completed
|
# TODO use logging when debug completed
|
||||||
@@ -338,7 +340,7 @@ class TCPRelayHandler(object):
|
|||||||
|
|
||||||
def _handle_dns_resolved(self, result, error):
|
def _handle_dns_resolved(self, result, error):
|
||||||
if error:
|
if error:
|
||||||
logging.error(error)
|
self._log_error(error)
|
||||||
self.destroy()
|
self.destroy()
|
||||||
return
|
return
|
||||||
if result:
|
if result:
|
||||||
@@ -507,6 +509,10 @@ class TCPRelayHandler(object):
|
|||||||
else:
|
else:
|
||||||
logging.warn('unknown socket')
|
logging.warn('unknown socket')
|
||||||
|
|
||||||
|
def _log_error(self, e):
|
||||||
|
logging.error('%s when handling connection from %s:%d' %
|
||||||
|
(e, self._client_address[0], self._client_address[1]))
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
# destroy the handler and release any resources
|
# destroy the handler and release any resources
|
||||||
# promises:
|
# promises:
|
||||||
|
|||||||
@@ -6,16 +6,24 @@ if __name__ == '__main__':
|
|||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
class MainHandler(tornado.web.RequestHandler):
|
class MainHandler(tornado.web.RequestHandler):
|
||||||
def get(self):
|
def get(self, project):
|
||||||
with open('/tmp/shadowsocks-coverage', 'rb') as f:
|
try:
|
||||||
coverage = f.read().strip()
|
with open('/tmp/%s-coverage' % project, 'rb') as f:
|
||||||
self.redirect(('https://img.shields.io/badge/'
|
coverage = f.read().strip()
|
||||||
'coverage-%s-brightgreen.svg'
|
n = int(coverage.strip('%'))
|
||||||
'?style=flat') %
|
if n > 80:
|
||||||
urllib.quote(coverage))
|
color = 'brightgreen'
|
||||||
|
else:
|
||||||
|
color = 'yellow'
|
||||||
|
self.redirect(('https://img.shields.io/badge/'
|
||||||
|
'coverage-%s-%s.svg'
|
||||||
|
'?style=flat') %
|
||||||
|
(urllib.quote(coverage), color))
|
||||||
|
except IOError:
|
||||||
|
raise tornado.web.HTTPError(404)
|
||||||
|
|
||||||
application = tornado.web.Application([
|
application = tornado.web.Application([
|
||||||
(r"/shadowsocks", MainHandler),
|
(r"/([a-zA-Z0-9\-_]+)", MainHandler),
|
||||||
])
|
])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Useful Tools
|
||||||
|
===========
|
||||||
|
|
||||||
|
autoban.py
|
||||||
|
----------
|
||||||
|
|
||||||
|
Automatically ban IPs that try to brute force crack the server.
|
||||||
|
|
||||||
|
See https://github.com/shadowsocks/shadowsocks/wiki/Ban-Brute-Force-Crackers
|
||||||
Executable
+51
@@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright (c) 2015 clowwindy
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
from __future__ import absolute_import, division, print_function, \
|
||||||
|
with_statement
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(description='See README')
|
||||||
|
parser.add_argument('-c', '--count', default=3, type=int,
|
||||||
|
help='with how many failure times it should be '
|
||||||
|
'considered as an attack')
|
||||||
|
config = parser.parse_args()
|
||||||
|
ips = {}
|
||||||
|
banned = set()
|
||||||
|
for line in sys.stdin:
|
||||||
|
if 'can not parse header when' in line:
|
||||||
|
ip = line.split()[-1].split(':')[0]
|
||||||
|
if ip not in ips:
|
||||||
|
ips[ip] = 1
|
||||||
|
print(ip)
|
||||||
|
else:
|
||||||
|
ips[ip] += 1
|
||||||
|
if ip not in banned and ips[ip] >= config.count:
|
||||||
|
banned.add(ip)
|
||||||
|
cmd = 'iptables -A INPUT -s %s -j DROP' % ip
|
||||||
|
print(cmd, file=sys.stderr)
|
||||||
|
os.system(cmd)
|
||||||
Reference in New Issue
Block a user