plinker/iptables
Composer 安装命令:
composer require plinker/iptables
包简介
WIP: Control iptables through plinker RPC
README 文档
README
Control iptables for pre routing rules (port forwarding). Specifically suited for forwarding ports to internal LXC containers.
Install
Require this package with composer using the following command:
$ composer require plinker/iptables
Then navigate to ./vendor/plinker/iptables/scripts and run bash install.sh.
Client
Creating a client instance is done as follows:
<?php
require 'vendor/autoload.php';
/**
* Initialize plinker client.
*
* @param string $server - URL to server listener.
* @param string $config - server secret, and/or a additional component data
*/
$client = new \Plinker\Core\Client(
'http://example.com/server.php',
[
'secret' => 'a secret password',
// database connection
'database' => [
'dsn' => 'sqlite:./.plinker/database.db',
'host' => '',
'name' => '',
'username' => '',
'password' => '',
'freeze' => false,
'debug' => false,
]
]
);
// or using global function
$client = plinker_client('http://example.com/server.php', 'a secret password', [
// database connection
'database' => [
'dsn' => 'sqlite:./.plinker/database.db',
'host' => '',
'name' => '',
'username' => '',
'password' => '',
'freeze' => false,
'debug' => false,
]
]);
Methods
Once setup, you call the class though its namespace to its method.
Setup
Applies build tasks to plinker/tasks queue.
| Parameter | Type | Description | Default |
|---|---|---|---|
| options | array | Build options |
Call
$client->iptables->setup([
'build_sleep' => 5,
'lxd' => [
'bridge' => 'lxcbr0',
'ip' => '10.171.90.0/8'
],
'docker' => [
'bridge' => 'docker0',
'ip' => '172.17.0.0/16'
]
])
Response
Update Package
Runs composer update to update package.
Call
$client->iptables->update_package();
Response
Fetch
Fetch currently configured forward or blocked rules from database.
| Parameter | Type | Description | Default |
|---|---|---|---|
| placeholder | string | Query placeholder | |
| values | array | Match values |
Call
all - $client->iptables->fetch();
ruleById(1) - $client->iptables->fetch('id = ?', [1]);
ruleByName(1) - $client->iptables->fetch('name = ?', ['guidV4-value'])
Response
Array
(
[0] => Array
(
[id] => 1
[type] => forward
[name] => 5b1b63cd-0106-4fde-ba3f-8b252ae400a1
[label] => Example
[ip] => 10.100.200.2
[port] => 2251
[srv_type] => SSH
[srv_port] => 22
[enabled] => 1
[added_date] => 2018-01-25 02:18:26
[has_change] => 0
[updated_date] => 2018-01-25 02:18:26
[range] =>
[note] =>
[bantime] =>
)
)
Count
Fetch count of currently configured forward or blocked rules from database.
| Parameter | Type | Description | Default |
|---|---|---|---|
| placeholder | string | Query placeholder | |
| values | array | Match values |
Call
all - $client->iptables->count();
ruleById(1) - $client->iptables->count('id = ?', [1]);
ruleByName(1) - $client->iptables->count('name = ?', ['guidV4-value'])
Response
1
Rebuild
Rebuild forward or blocked rule.
| Parameter | Type | Description | Default |
|---|---|---|---|
| placeholder | string | Query placeholder | |
| values | array | Match values |
Call
ruleById(1) - $client->iptables->rebuild('id = ?', [1]);
ruleByName(1) - $client->iptables->rebuild('name = ?', ['guidV4-value'])
Response
Array
(
[status] => success
)
Remove
Remove forward or blocked rule.
| Parameter | Type | Description | Default |
|---|---|---|---|
| placeholder | string | Query placeholder | |
| values | array | Match values |
Call
ruleById(1) - $client->iptables->remove('id = ?', [1]);
ruleByName(1) - $client->iptables->remove('name = ?', ['guidV4-value'])
Response
Array
(
[status] => success
)
Reset
Remove all forwards and blocked rules.
| Parameter | Type | Description | Default |
|---|---|---|---|
| purge | bool | Also remove tasks | false |
Call
$client->iptables->reset(); // remove just rules
$client->iptables->reset(true); // remove rules and tasks (purge)
Response
Array
(
[status] => success
)
Add Block
Add an IP address to blocked rules.
| Parameter | Type | Description | Default |
|---|---|---|---|
| data | array | Rule data |
Call
$client->iptables->addBlock([
'ip' => '123.123.123.123',
'range' => 32,
'note' => 'Port scanned server',
'enabled' => 1
]);
Response
Array
(
[status] => success
[values] => Array
(
[id] => 3
[type] => block
[name] => 7bb82b0c-617d-4343-bca5-f8055a7e3087
[label] => -
[ip] => 123.123.123.123
[range] => 32
[note] => Port scanned server
[added_date] => 2018-05-09 22:46:30
[bantime] => 0
[enabled] => 1
[has_change] => 1
)
)
Update Block
Update a blocked IP address rule.
| Parameter | Type | Description | Default |
|---|---|---|---|
| placeholder | string | Query placeholder | |
| values | array | Match values | |
| data | array | Updated rule data |
Call
$client->iptables->updateBlock('id = ?', [3], [
'label' => '',
'enabled' => 1,
'ip' => '212.123.123.123',
'range' => 32,
'note' => 'FooBar',
'bantime' => 0
]);
Response
Array
(
[status] => success
[values] => Array
(
[id] => 3
[type] => block
[name] => 7bb82b0c-617d-4343-bca5-f8055a7e3087
[label] =>
[ip] => 212.123.123.123
[port] =>
[srv_type] =>
[srv_port] =>
[enabled] => 1
[added_date] => 2018-05-09 22:46:30
[has_change] => 1
[updated_date] => 2018-05-09 22:54:15
[range] => 32
[note] => FooBar
[bantime] => 0
)
)
Status
Enumarate and return status of used and available ports.
Call
$client->iptables->status();
Response
Array
(
[blocked_rules] => 1
[forward_rules] => 0
[total] => 400
[available] => 400
)
Raw
Fetch raw iptables, equivalent to iptables-save.
Call
$client->iptables->raw();
Response
# Generated on Thu Jan 25 12:34:56 2018
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o lxcbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A PREROUTING -p tcp -m tcp --dport 2251 -j DNAT --to-destination 10.158.250.6:22
-A PREROUTING -p udp -m udp --dport 2251 -j DNAT --to-destination 10.158.250.6:22
-A POSTROUTING -s 10.158.250.0/8 ! -d 10.158.250.0/8 -j MASQUERADE
-A DOCKER -i lxcbr0 -j RETURN
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:fail2ban-ssh - [0:0]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -p tcp -m multiport --dports 2020 -j fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 2200:2299 -j fail2ban-ssh
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 8443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -o lxcbr0 -p tcp -m tcp --sport 53 -j ACCEPT
-A OUTPUT -o lxcbr0 -p udp -m udp --sport 53 -j ACCEPT
-A OUTPUT -o lxcbr0 -p udp -m udp --sport 67 -j ACCEPT
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN
-A INPUT -s 212.123.123.123/32 -j REJECT
-A fail2ban-ssh -j RETURN
COMMIT
# Completed on Thu Jan 25 12:34:56 2018
Available Ports
Fetch available ports within a range type.
| Parameter | Type | Description | Default |
|---|---|---|---|
| type | string | Port range type | all |
The following port ranges (400 ports) are externally available for forwarding.
| Type | Range | Description |
|---|---|---|
| all | 2200 - 8099 | Returns all available ports |
| ssh | 2200 - 2299 | Returns available ssh ports |
| http | 8000 - 8099 | Returns available http ports |
| mysql | 3300 - 3399 | Returns available mysql ports |
| shellinabox | 4200 - 4299 | Returns available shellinabox ports |
Call
$client->iptables->availablePorts('http');
Response
Array
(
[0] => 8000
[1] => 8001
[2] => 8002
[3] => 8003
[4] => 8004
[5] => 8005
[6] => 8006
[7] => 8007
[8] => 8008
[9] => 8009
[10] => 8010
... snip
[99] => 8099
)
Check Port In Use
Check if a port is already in use by a rule.
| Parameter | Type | Description | Default |
|---|---|---|---|
| port | int | Port to check | 0 |
Call
$client->iptables->checkPortInUse(8000);
Response
boolean
Check Allowed Port
Check if a port is in allowed ranges.
| Parameter | Type | Description | Default |
|---|---|---|---|
| port | int | Port to check | 0 |
Call
$client->iptables->checkAllowedPort(12345);
Response
boolean - false in the above case
Add Forward
Add new port forward rule.
| Parameter | Type | Description | Default |
|---|---|---|---|
| data | array | Rule data |
Call
$client->iptables->addForward([
'label' => 'Example',
'ip' => '10.158.250.5',
'port' => 2252,
'srv_type' => 'SSH',
'srv_port' => 22,
'enabled' => 1
]);
Response
Array
(
[status] => success
[values] => Array
(
[id] => 5
[type] => forward
[name] => d82025df-fc3f-4a2e-bbbd-dde6fddab4cb
[label] => Example
[ip] => 10.158.250.5
[port] => 2252
[srv_type] => ssh
[srv_port] => 22
[enabled] => 1
[added_date] => 2018-05-10 01:01:46
[has_change] => 1
)
)
Update Forward
Update port forward rule.
| Parameter | Type | Description | Default |
|---|---|---|---|
| placeholder | string | Query placeholder | |
| values | array | Match values | |
| data | array | Updated rule data |
Call
$client->iptables->updateForward('id = ?', [4], [
'name' => '8610e47a-cf06-4806-964b-c5a3642954bb', // always use, to bypass port in use check
'label' => 'Example',
'ip' => '10.158.250.5',
'port' => 2252,
'srv_type' => 'SSH',
'srv_port' => 22,
'enabled' => 1
]);
Response
Array
(
[status] => success
[values] => Array
(
[id] => 4
[type] => forward
[name] => 8610e47a-cf06-4806-964b-c5a3642954bb
[label] => Example
[ip] => 10.158.250.5
[port] => 2252
[srv_type] => SSH
[srv_port] => 22
[enabled] => 1
[added_date] => 2018-05-10 01:01:25
[has_change] => 1
[updated_date] => 2018-05-10 01:16:46
[range] =>
[note] =>
[bantime] =>
)
)
Testing
There are no tests setup for this component.
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security related issues, please contact me via https://cherone.co.uk instead of using the issue tracker.
Credits
Development Encouragement
If you use this project and make money from it or want to show your appreciation, please feel free to make a donation https://www.paypal.me/lcherone, thanks.
Sponsors
Get your company or name listed throughout the documentation and on each github repository, contact me at https://cherone.co.uk for further details.
License
The MIT License (MIT). Please see License File for more information.
See the organisations page for additional components.
plinker/iptables 适用场景与选型建议
plinker/iptables 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 399 次下载、GitHub Stars 达 1, 最近一次更新时间为 2017 年 10 月 11 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「rpc」 「iptables」 「plinker」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 plinker/iptables 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 plinker/iptables 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 plinker/iptables 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Microservice RPC through message queues.
PlinkerRPC PHP client/server makes it really easy to link and execute PHP component classes on remote systems, while maintaining the feel of a local method call.
A simple but very effective PHP firewall. It enables you to easily block most SQL and XSS injections. It also includes a white-/blacklisting of IP's and throttling request using Leaky Bucket.
Control Nginx as a reverse proxy through plinker RPC
Control LXD through RPC
An example component, which has a few methods for testing/example purposes.
统计信息
- 总下载量: 399
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 10
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-10-11